PHP漏洞及防御
GSflyy 人气:0命令执行漏洞的原理
程序应用有时需要调用一些执行系统命令的函数,如php中的system,exec,shell exec,passthru,popen,proc popen等,当用户可以控制这些函数的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令注入攻击
两个条件
(1)用户可以控制函数输入
(2)存在可以执行代码的危险函数
命令执行漏洞产生原因
1.开发人员编写源码时,未针对代码中可执行的特殊函数入口作过滤,导致客户端可以恶意构造语句,并提交服务端执行
2.命令注入攻击中,web服务器没有过滤类似system,eval,exec等函数,是该漏洞攻击成功的主要原因。
命令执行漏洞的危害
1.继承web服务程序的权限去执行系统命令或读写文件
2.反弹shell
3.控制整个网站甚至服务器
4.进一步内网渗透
实例
<?php echo shell_exec($_GET['a']); ?>
将url中的参数a作为cmd命令行指令执行
危险函数导致代码执行
<?php $arr = $_GET['arr']; $array = $_GET['array']; $new_array = arraymap($arr,$array); ?>
arraymap是一个危险函数,它会默认将参数作为php代码执行
PHP一些可调用外部程序的危险函数
eval攻击
eval函数将输入的参数当成php代码来执行
mixed eval(string code str)
<?php $var = "var"; if(isset($_GET["arg"])) { $arg = $_GET["arg"]; eval("\$var = $arg;"); echo "\$var = ".$var; } ?>
preg_replace()函数
preg_replace()函数执行一个正则表达式的搜索和替换
在php版本为5.5.0以下时有一个漏洞,当该函数使用了一个不安全的修饰符"\e"时,preg_replace()会对替换字符串的反向引用进行正常替换,将其作为php代码进行计算,并使用 结果替换搜索字符串。
此处/e的用处是引用括号里的字符 也就是以参数a去替代括号里的字符
ps:不要忘记代码两侧的中括号
call_user_func
函数用法:
call_user_func($_GET["a"] , $_GET["b"])
将a作为函数执行,b作为函数参数传递进去
在命令注入时,常有需要多命令执行的情况
在linux下,可以使用|或||代替
|是管道符,显示后面的执行结果
||当前面命令执行出错时再执行后面的
在Window下,可以使用&、&&、|、||代替
&前面的语句为假则执行后面的
&&前面的语句为假则直接出错,后面的也不执行
|直接执行后面的语句
||前面出错执行后面的语句
命令执行的防御手段
1.尽量不要执行外部命令
2.使用自定义函数或函数库替代外部函数功能
3.使用escapeshellarg函数来处理命令参数
4.使用safe_mode_exec_dir:指定可执行文件路径 ,这样可以将会使用的命令提前放入此路径内
safe_mode_exec_dir = /usr/local/php/bin
DVWA介绍
DVWA平台:
用来进行安全脆弱性鉴定的PHP/Mysql Web应用
为安全专业人员测试总结的专业技能和工具提供合法环境
帮助web开发者更好的理解web应用安全防范的过程
DVWA的搭建
DVWA是基于php/mysql环境开发的
下载地址:
Buy Steroids Online UK - Anabolic Steroids For Sale UK
DVWA练习命令注入
使用靶场自行练习
加载全部内容