【CTF-SHOW】无字母数字命令执行

【CTF-SHOW】无字母数字命令执行

打开题目,直接输入命令发现无法执行,使用之前的字符串取反方法也无法绕过

题目分析

以Form表单形式提交,使用curl -F "code=ls" [题目地址],发现可以正常处理

尝试上传文件,网页仍然可以正常返回,意味着目标可能会接收这个文件,即使页面中没有文件上传功能

可以考虑使用文件上传+通配符注入来执行代码

1.在php中,上传的文件会临时保存在/tmp/phpXXXXXX,其中XXXXXX是随机大小写字母,如果上传后没有使用move_uploaded_file()移动位置,那么就会在脚本运行结束后自动删除上传的文件,即HTTP请求返回后文件就会被删除

2.在Bash中,.(点)等于source,即在当前终端进程中执行文件中的代码,例如 . test.sh就相当于source test.sh,意思是在当前终端内执行test.sh文件中的代码

3.在Linux中,可以使用以下统配来匹配文件:

? 代表1个任意字符

* 代表任意数量的任意字符

[^x] 代表这个位置不是字符x

[a-z] 代表这个位置的字符在a-z范围内(ASCII码)

我们使用Form表单的形式同时提交code参数并上传bash脚本文件,code参数通过使用.(句点)加通配符来匹配并运行我们上传的脚本

我们可以通过/???/?????????来匹配文件,前三个?用来匹配字符tmp,后九个?用来匹配phpXXXXXX,但是这样通常会有多个匹配的文件,必须缩小范围,使其刚好能够匹配到我们上传的文件

最后使用的通配符为/???/????????[@-[] 意思是匹配以大写字母结尾的文件(大写字母的ASCII码范围在@和[中间),由于上传的文件名称是随机生成的,实际操作中可能无法一次成功,需要反复调整并尝试

漏洞利用

创建一个文件list.sh,内容就是 ls,然后通过curl以表单形式同时提交code参数并上传文件:

curl -F "code=. /???/????????[@-[]" -F "file=@list.sh" [题目地址]

在返回结果中可以看到当前目录中存在flag.php

修改list.sh内容为 cat flag.php 再执行一遍相同的命令,即可得到flag:

参考资料:

无字母数字webshell之提高篇 | 离别歌

AI渗透测试:只用3个符号就拿下了服务器!揭秘无字母数字RCE的终极玩法_wx68fc435ee4240的技术博客_51CTO博客