命令执行漏洞
1. 基本内容
1.1 产生原因
命令执行漏洞是指应用有时需要用一些执行系统命令的函数,如:system()、exec() 、shell_exec() 、eval()、passthru(),代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统程序命令拼接到正常的命令中,从而造成命令执行攻击。
1.2 分类
代码层过滤不严:商业应用的一些核心代码封装在二进制文件中,在WEB应用中通过system函数来调用;
系统的漏洞造成命令注入:bash破壳漏洞
调用的第三方组件存在代码执行漏洞:wordpress中用来处理图片的imagemagick组件、Java中命令执行漏洞、thinkphp命令执行
1.3 利用条件
应用调用执行命令的函数
将用户输入作为系统命令的参数拼接到命令中
没有对用户输入过滤或者过滤不严格
1.4 常见的连接符
| 连接符 | 含义 |
|---|---|
| A;B | 先执行A,在执行B |
| A&B | 简单拼接,A,B之间无约束关系 |
| A|B | 显示B的执行结果 |
| A&&B | A执行成功,然后才会执行B |
| A||B | A执行失败,然后才会执行B |
2. dvwa模拟实验
2.1 low等级
1.查看源代码
从源码中可以看出:服务器根据输入IP所对应的操作系统执行不同的ping命令,但是对输入的IP参数没有进行任何过滤,所以存在极大漏洞
2.实验过程
2.2 medium等级
1.查看源代码
根据源码分析可以知道服务器对输入的IP参数进行了过滤,过滤方法是将‘&&’和‘;’
替换为空,其本质上采用的是黑名单机制,但是相比于白名单来说仍然存在很大的漏洞。
2.绕过方法
解决方法是:它只过滤掉了‘&&’和‘;’,但是并没有过滤掉‘&’和‘|’。
初次之外,还可以采用的嵌入的方式:‘&&&’,‘&;&’
3.实验过程
2.3 high等级
1.查看源代码
从源码中我们可以看到:服务器端将上述字符全部转换为空。
此时再使用上述字符都会报错。
2.绕过方法
绕过方式就是使用|,后面不带空格
3.实验过程
2.4 impossible等级
1.查看源代码
在代码中加入了Anti-CSRF token,同时对IP参数进行了严格的限制,只有形如:
“数字.数字.数字.数字“的命令才会被服务器接收并执行,因此杜绝了命令输入漏洞。