远程命令执行漏洞,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码。
·建议假定所有输入都是可疑的,尝试对所有输入提交可能执行命令的构造语句进行严格的检查或者控制外部输入,系统命令执行函数的参数不允许外部传递。
·不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
·不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
·对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。
·在发布应用程序之前测试所有已知的威胁。
示例:
根据提示查看shell.php
$_SERVER 是 PHP 预定义变量之一,可以直接使用,它是一个包含了诸如头信息(header)、路径(path)及脚本位置(script locations)信息的数组。
它进行了sort排序,显示该变量信息,最后他会执行$_SERVER[29]
burp suite 抓包
因为进行了sort排序,所以需要保证修改请求头部信息后的内容能够被推到$_SERVER[29]的位置
而当前$_SERVER[29]的内容是语言,那么尝试修改为 system(ls)
发现system(ls)被推到了【28】的位置,那么向后看是否能够通过修改头部调动位置。
关注到了【30】到【32】的变量,可能是Cache-Conctrol,而我的请求头部没有该信息所以int(0)
在请求头部加上 Cache-Conctrol: no-cache 试试
发现被被推到了【32】
通过调整system(ls)执行成功