您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 刘红岗Web漏洞扫描器初探
360泄密事件2010年最后一天,普通用户可以在google网站上搜索指定关键字,可以搜2010年索到大量中国互联网用户使用互联网的隐私记录,甚至包括用户登陆网站或邮箱的用户名、密码等CSDN泄密事件2011年12月,CSDN的安全系统遭到黑客攻击,600万用户的登录名、密码及邮箱遭到泄漏。随后,CSDN密码外泄门持续发酵,天涯、世纪佳缘等网站相继被曝用户数据遭泄密。天涯网于12月25日发布致歉信,称天涯4000万用户隐私遭到黑客泄露。QQ泄密事件2013年11月19日,360互联网攻防实验室研究员安扬通过迅雷,下载到了此次被曝光的“QQ群数据库”,并通过简单测试验证了数据的真实性。“解压后达90多G,大概有7000多万个QQ群,12亿多个部分重复的QQ号码。广西大学玉林师范学院西安邮电大学中国知网?有什么问题恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。?有什么问题?有什么问题?有什么问题SQL注入(SqlInjection)是这样一种漏洞:应用程序在向后台数据库传递SQL(StructuredQuerylanguage,结构化查询语言)查询时,如果为攻击者提供了影响该查询的能力,则会引发SQL注入。攻击者通过影响传递给数据库的内容来修改SQL自身的语法和能力,并且会影响SQL所支持数据库和操作数的功能灵活性。SQL注入不只是一种会影响Web应用的漏洞;对于任何不可信源获取输入的代码来说,如果使用该输入来构造SQL语句,那么就有可能也会受到攻击(例如,客户端/服务器框架中的“胖客户端”程序)语义和行为:即使一个单引号不会产生错误,应用程序也并非不会受到SQL注入的攻击。系统管理员可能对其进行了设置,是错误发生时,以一个默认的页面作为反映。基于数字的加,求模,十六进制,八进制等,基于字符的十六进制,连接字符串,返回最小、最大值等改变流程:假如一个登陆的sql语句为Strngsql=“select*fromUserTablewhereusername=‘”+username+”’andpassword=‘”+password+”’”;可以输入框中输入:用户名:a’or‘a’=‘a密码:任意;即可登陆查询替换数据:使用Union操作符把两个不同的SELECT语句结果联合起来,这使得开发者可以仅用一个单独的查询,便能获得来自不同表中的数据。如下:=admin%27union+select+CustomerName%2CAddress%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull+from+customer%20%20where%20%27a%27=%27a扫描器在解析应用程序内容后,将浏览它的功能,在每个请求的每个参数中提交一系列的测试字符串,然后分析应用程序的响应,从中查找常见漏洞的签名。接下来,扫描器生成一个报告,扫描它发现的每一个漏洞。通常,这份报告包括用于诊断被发现漏洞的请求与响应,允许经验丰富的用户对他们进行手工调查,确认漏洞是否存在。使用扫描器可以相当可靠的探测到几种常见的漏洞。这些漏洞有非常明显的签名,这些签名就在应用程序的请求与响应中。还有些情况下,如果确定漏洞已经存在,扫描器会发送一个专门设计的请求,以触发它的签名。如果签名出现在应用程序中,那么扫描器可据此推断,漏洞确实存在。常见的漏洞签名,请参考《黑客攻防技术宝典Web实战篇》《SQL注入攻击与防御》整个程序是这样运作的:Scheduler不断从Queue取出URL,如果发现可用的爬虫(空闲线程),那么就将URL分给一只爬虫。然后爬虫完成下载网页,抽取URL,保存网页的工作后就回归Scheduler(变回空闲线程)。直到Queue没有待爬取的URL,并且所有爬虫都空闲下来,就停止程序。Scheduler的主要工作就是建立线程池,从Queue中取出URL,分配URL给线程。容易出错的地方是退出条件。如果只是判断Queue为空就退出是不行的。因为这时可能还有爬虫在工作中,而它可能提取到新的URL加到Queue中。所以退出条件应该是Queue为空且线程池的线程全部空闲。Queue负责保存URL,判断URL重复出现与否。目前的保存方式是先使用Hash判断URL是否已经保存过,然后再将完整的URL整个保存到list中。从Queue中取出URL时使用广度优先原则。获取Html源码,可是使用HtmlUnitDriver的API来完成,并且可以得到JS动态解析的内容但是使用的同时,也失去了很多的灵活性,因为在分析漏洞时,会需要分析响应头,状态码等信息JS的动态解析,也许可是自己实现JS引擎,还未实现。综上考虑,选用Socket直接获取源码,实现如下:首先构造页面请求:使用Socket发送请求:解析Html源码:使用正则表达式,提取响应码status,长度length,body中的内容因为需要根据页面内容,来提取form,input,textarea,method,a/a等,其用到的正则表达式如下:提取超链接的正则表达式:(?i)(?s)\\s*?a.*?href=\(.*?)\.*?提取Base标签的正则表达式:base\\s+?([^]+?\\s*?Input标签:input\\s+?([^]+?)\\s*?)Select标签:select\\s+?([^]+?)\\s*?(.*?)/select\\s*?Textarea标签:textarea\\s+?([^]+?)\\s*?(.*?)/textarea\\s*?Form标签:form\\s+?([^]+?)\\s*?(.*?)/form\\s*?1.解析URL,分离出所需参数,如果没有结束2.判断主机是否存活,不存活,结束3.取出当前参数,如果已经没有,结束4.使用有效负载与当前参数组合,发送请求。如果负载已经没有,结束。5.比较原始页面,与加入负载后得到的页面,如果无漏洞签名,使负载指向下一个负载,转向4.6.使当前参数指向下一个参数,转向3.(1)、测试主机是否存活,也就是判断网页是否可以浏览到。如果是用户直接输入的网址,在大部分情况下都是可以访问的。如果是由爬虫爬到的网址,就会有一部分过期的网址无法访问。通过测试连接决定是否继续进行SQL注入扫描可以节省很多时间。思路:根据端口号和主机名,使用socket套接字,判断主机是否连接过且没有关闭,来判断主机存活。(2)、测试网页是否稳定,也就是测试网页是否有随时间变化的东西,比如滚动的广告等。思路:在间隔比较短的时间内各取一次同一个网页,然后测试两次所取到的内容是否相同。如果不同则说明页面内容是动态变化的。(3)、测试URL中的某一个参数是否是动态的,也就是说这个参数是否是决定页面内容的关键参数。原理是:使用一个随机数或者随机字符串(取决于需要替换的参数类型)来替换原来的参数,然后和原来的页面进行对比。如果不同,则说明此参数是关键参数并可以用来进行sql注入扫描。否则忽略这个参数。注:在一些页面参数中,可能某些参数是固定不变的。这样的参数无法用来进行sql注入扫描。忽略一些静态参数可以节省很多时间。识别注入类型:基本的注入类型有三类:字符型注入、数字型注入,查询结构型注入。判断字符注入的基本思路是:(1)构造上引号“‘”注入,取回返回页面(2)构造and‘a’=‘a注入,取回返回页面(3)构造and‘a’=‘b注入,取回返回页面如果(原)!=(1)&&(原)==(2)&&(原)!==(3),可断定存在字符型注入识别注入类型:数字型注入,和字符型注入类型基本相同,构造一下语句(1)上引号语句(‘),取回页面(2)and1=1取回页面(3)and1=2取回页面(原)!=(1)&&(原)==(2)&&(原)!=(3),成立,则存在数字型注入指纹识别数据库:一种可靠的方法是根据数据库连接字符串的不同方式进行识别。在控制某个字符串数据项的查询中,可以在一个请求中提交一个特殊的值,然后测试连接方法,以生成那个字符串。如果各道相同的结果,就可以确定所使用的数据库类型。下面示例说明常用的数据库如何构建services字符串Oracle:’serv’||’ices’MS-SQL:’serv’+’ices’MySQL:’serv’‘ices’(注意中间的空格)如果是数字数据,则可以使用下面的攻击字符串来识别数据库。每个数据项在目标库中的求值结果为0,在其他数据库中则会导致错误Oracle:BITAND(1,1)-BITAND(1,1)MS-SQL:@@PACK_RECEIVEC-@@PACK_RECEIVEDMy-SQL:CONNECTION_ID()-CONNECTION_ID()指纹识别数据库:确定查询影响的列:攻击的首要任务是查明应用程序执行的最初查询所返回的列数。可以利用NULL被转换为认可数据类型的事实,系统性地注入包含不同列数的查询,直到注入的查询得到执行,例如:‘unionselectnull–‘unionselectnull,null–‘unionselectnull,null,null,--查询得到执行就说明使用了正确的类书。如果应用程序不返回数据库错误消息,仍然可以了解注入查询是否执行,因为会受到另外一行数据,其中包含null或一个空字符串。注意,注入行可能只包含空单元格,因此不容易知道何时以html提交。所以,需要查看行的反应。确定列属性:确定所需的列数后,下一项任务就是找到一个使用字符串数据类型的列,以便从数据库中取出任意数据。和前面一样,可以通过注入一个包含null值的查询,并系统地用a代替每个null,从而完成这个任务。例如,如果知道查询返回3列,可以注入以下查询:‘unionselect‘a’,null,null—‘unionselectnull,’a’,null–--‘unionselectnull,null,’a’----如果注入的查询得到执行,将看到另外一行包含a值的数据,然后就可以使用相关列从数据库提取数据。注:如果是oracle,每个select语句必须包含一个from属性。可以这样构造:‘unionselectnullfromdual—;(dual是全局可访问的表)提取有效数据:如果已经确定注入的查询所需的列数,并且已经找到一个使用字符串的数据类型的列,就可以提取任意数据。一个简单的概念验证测试是提取数据库的版本字符串,可以对任何数据库管理系统(DBMS)进行测试。例如如果查询一共有三列,第一列可以提取字符串数据,可以在MS-SQL和MySQL中注入以下语句提取查询数据库版本:‘unionselect@@version,null,null—对Oracle注入以下查询语句得到相同的结果‘unionselectbanner,null,null,nullfromv$version--1.爬虫时还有好多动态的页面不能获得2.页面提交数据可能使用ajax提交,对ajax的逻辑判断,是一个挑战3.依然很难找到一个标准来确认漏洞存在4.没有任何知觉,只是靠载荷加载攻击,而不能凭知觉来判断漏洞的催在5.还没有找出判断二阶sql注入的有效方法6.如果突然断电,则全部进程终止,这样浪费了大量时间爬虫结果:注入测试:Sqlmap:sqlmapisanopensourcepenetrationtestingtoolthatautomatestheprocessofdetectingandexploitingSQLinjectionflawsandtakingoverofdatabaseservers.Itcomeswithapowerfuldetectionengine,manynichefeaturesfortheultimatepe
本文标题:刘红岗Web漏洞扫描器初探
链接地址:https://www.777doc.com/doc-4530975 .html