一、概述
1.1何为命令执行
攻击者通过web应用可以执行系统命令,从而获得敏感信息,进而控制服务器攻击内网。
1.2产生条件
1.应用调用执行命令的函数
2.将用户输入作为系统命令的参数拼接到命令中
3.没有对用户输入的过滤或者过滤不严格
1.2常见命令
1.2.1 Windows
dir |
列出目录 |
Ipconfig |
查看ip |
arp -a |
查看路由表 |
Calc |
打开计算器 |
Regedit |
打开注册表 |
netstat -ano |
查看服务端口信息 |
1.2.2 linux
Cat /etc/passwd |
查看password文件内容 |
Id |
查看当前用户的id号(Windows中500表示admin,501表示游客,自定义用户100以上) |
Cat /etc/group |
查看用户组文件内容 |
Pwd |
显示当前目录 |
Uname -a |
查看当前系统版本 |
Natstat -pantu |
查看当前服务的端口信息 |
Netstat -nr |
查看网关和路由 |
1.3常见命令拼接符
格式 |
内容 |
A;B |
先执行A,再执行B |
A&B |
简单拼接,A B之间无制约关系 |
A|B |
显示B的执行结果 |
A&&B |
A执行成功,然后才会执行B |
A||B |
A执行失败,然后才会执行B |
二、产生原理
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
三、防御方法
1.尽量少用执行命令的函数或者直接禁用
2.参数值尽量使用引号包括,并在拼接前调用addslashes函数进行转义
3.在使用动态函数之前,确保使用的函数是指定的函数之一
4.在进入执行命令的函数方法之前,对参数进行过滤,对敏感字符进行转义
5.对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用 escapeshellarg函数进行过滤
四、危害
1.继承Web服务程序的权限去执行系统命令或读写文件。
2.反弹shell
3.控制整个网站甚至控制服务器。
4.进一步内网渗透
五、php常见危险函数
system:成功则返回命令输出的最后一行,失败则返回FALSE。
exec:命令执行结果的最后一行内容。
shell_exec:命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。
passthru:执行外部程序并且显示原始输出。
eval:将输入的字符串参数当做PHP程序代码来执行