上上上周末真是个不平凡的周末,周六公司举办“脉搏涌动”沙龙,虽然忙点,但是也是学到很多,况且还是自己第一次参加安全相关的会议。然后周末上午赶忙完成四爷安排的安全脉搏上的任务,写了个文章发到“安全脉搏”上。下午刚要出去吃饭,工作来了。。。
先说下自己在沙龙上学到的
- URL跳转的时候可以用
\@
绕过,\
是利用浏览器和后端解析差异,@
这个之前在ssrf上绕过用 /%0a/
这种形式可绕过一些目录限制以便进行其他操作,之前都用到crlf,waf等上- 搜索敏感信息听说bing更强大,小伙伴还给我推荐了DuckDuckGo
总结起来就是:太年轻,年轻,轻。。。[捂脸][捂脸][捂脸]
好了,说下这次的应急响应及自己的思考。感谢加菲猫、四爷带我,跪拜啊!
0x00 事件描述
客户反馈从6月23日开始,网站访问延迟很大,重启服务之后会越来越慢,直至502。网站使用LNMP集成环境,服务器及数据库不是弱口令。6月25号客户买了相关安全产品,未发现明显的恶意攻击行为,同时服务器性能良好。
0x01 事件处理过程
首先我的第一反应是被D了,使用top发现服务器性能正常。
然后客户也买了产品,产品上也未出现异常。
然后使用了下自己做的信息收集的linux_信息收集.sh,搜集了下相关信息,查看也并没发现什么异常。
使用了Python版的webshell查杀,也TM没发现啥,各种看日志也并没发现什么卵用,这TM我就崩溃了。。。
然后我又考虑是不是Slow HTTP DDos,但是没办法验证啊。
本地复现的话客户肯定不让啊,无助啊。。。
没办法只能继续分析,然后事件出现了转机:
服务会呈现两种情况:
http资源未被占尽的情况下,可以访问静态资源以及直接查sql的路由链接,如:
http资源完全被占满,导致静态资源都不能访问,查询进程会发现最大50个httpd进程全启动了。
由于最大只允许50个进程,所以导致这个时候静态和动态的资源都无法进行访问了。
检查nginx日志,log中有大量的499状态码,这个是由于客户端等待超时,关闭了链接导致。
暂且在proxy.conf
中新增了proxy_ignore_client_abort on;
重启后,不在有客户端主动关闭链接的情况。
检查部分链接源代码函数,如在资源未占满情况下,访问此phpmyadmin/index.php请求是没问题的:
定位到/data/wwwroot/xxx/ajax.action.php
文件,查看后发现就是一个简单的sql查询,然后打印了json。
然后访问 “找回密码链接” 每次延迟时间都在28.19秒左右,如下:
于是定位到该方法的源代码函数位置,在渲染模版前,尝试die('111111');
发现很快能显示111111
|
|
这说明模版在渲染前是没有问题的。
上边两步也就说明了:
- 不会是攻击的造成的。
- sql查询没问题。
之后猜测两种情况:
- 可能是缓存超时
- 也可能是连接某个第三方接口超时出现的问题
重新刷新页面,并同时查看端口syn_send
情况,果然发现了问题:
netstat -anp|grep -i syn_sent|awk '{print $5}'|sort|uniq
|
|
每访问加载慢的页面,就会多一个这个ip的链接出来。
浏览器访问后,发现ssl标识是微信的接口。
api.weixin.qq.com -> 58.246.220.31
上边这个在服务器上是ping不通的。查看了下服务器上调用该api的文件。
find ./ -type f -name "*.php"|xargs grep "api.weixin.qq.com"
注释掉/xxx/jssdk.class.php等页面中的api.weixin.qq.com访问不在慢了。
至此,事件问题定位成功。
0x02 安全建议
- 最简单的,修改
/etc/hosts
。 - 和微信方取得联系,解封对api.weixin.qq.com的ip限制。
- 定位所有调用的api接口,看看还有哪些在服务器上是不能访问的,并进行替换。
0x03 事件思考
事后我们和客户交流,客户反馈:由于不可描述的原因,可能用户举报了他们,所以可能是这样导致他们微信API被封。
事后想了想,这TM思路真是猥琐啊!!!
然后联想到之前猪猪侠小密圈说的
所以,我们就可以利用这点,比如系统需要请求第三方API,那我们就可以构造恶意payload让服务器发送恶意的包或者频繁请求相关API,那么此接口就会被封掉,那么业务就崩了!