0x01 前言
前几天在“搞基大队”群里看到@六八老哥提到的一个问题,几个师傅都在讨论其绕过方式,自己也做了些测试,感觉还是挺有意思的,经老哥同意将这次讨论过程和绕过方式整理分享给大家。
这是一个基于上传的命令执行漏洞,以前还真没见过,虽然这种漏洞很少见,但如果遇到了你能绕过吗?欢迎各位师傅补充绕过姿势!
0x02 问题描述
遇到这样一个超级奇葩的利用点,文件上传时会把文件名放到cmd中去执行,但不允许出现空格,如果文件名中存在空格时则上传失败。
而且它这个系统每次上传会按时间戳创建一个文件夹, 它的存在导致每次上传执行,当前时间戳目录下只会存在一个文件,还有一个关键点就是后缀必须为jpg。
C:\inetpub\wwwroot\1631023487\&dir&.jpg
0x03 漏洞简述
为什么后台是放到cmd中去执行的?因为它提供了这样一个功能,可以把图片或者文档转为pdf,后台是使用的一个exe程序,加文件路径去进行转换,可以通过控制文件名执行简单的命令。
但是想去执行比如下载木马、添加账号等这些复杂一点的命令就不行了,只要出现空格就无法上传执行。
0x04 测试方法
首先想到的绕过方式是以前测试过的“Windows环境变量截取绕过”,但在实际测试中发现不能用于这种场景,因为Windows文件命名规则中默认不允许使用这些字符:\、/、:、*、?、"、<、>、|
。
%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...]
本地搭建了一个上传漏洞,利用Burpsuite抓包,将上传文件数据包中文件名处的空格用%20
进行解码发送后即可成功把带有空格命令的文件写进目标磁盘中,并且能够正常执行。
注:这里必须将%20
解码后再发送,否则会原样写入,文件名为:&net%20user.jpg
。还有就是这个上传漏洞中是没有过滤空格等字符,如果已经过滤该绕过方式则可能无效。
@六八老哥在测试中发现在cd中可以用,和;等字符代替空格,但在跨目录时又发现不能用\,因为文件名中不允许出现\、/,最终测试出来可用于跨目录的cd命令如下。
切换上级目录,不允许使用\/ C:\inetpub\wwwroot\1631023487>cd;..\ cd,..结合&连接符实现跨目录 C:\inetpub\wwwroot>cd;..&cd;..&cd;windows&cd;system32
0x05 绕过方式
这个“上传”命令执行漏洞的关键点其实就是上传目录,文件名可控,然后再配合cd;..
绕过空格垮目录,&
命令连接就OK了。只要求后缀必须为jpg,文件名中不带空格即可。
本地模拟测试:
我们可以先将cs马改为cs.jpg
传上去,目录在1631359215
,然后再构造一个用于跨目录和执行cs马的jpg文件传上去,目录在1631023487
,文件名为:&cd;..&cd;1631359215&cs.jpg&.jpg
,上传执行后可以看到已经完美上线了。
cmd /c C:\inetpub\wwwroot\1631023487\&cd;..&cd;1631359215&cs.jpg&.jpg
注:由于没有环境进行复现测试,所以对实际情况并不是很清楚,可能更复杂些吧。说实话,在整理完这篇文章后对@六八老哥的文件落地这块都还处于蒙蔽状态,懒的再去研究了,就这样吧!!!