主要讨论他是如何判断一个URL存在SQL注入的。
在分析之前先看看sqlmap的配置文件sqlmap.conf,这对分析sqlmap的扫描过程很有帮助(我就是从这个文件看起的)。
从sqlmap.conf中几乎可以分析出sqlmap所有的扫描方式。
现在开始分析一下sqlmap真个的扫描过程。这里就不说源代码了,直接描述他的扫描过程,然后分析一下它的每一步是怎样做到的。
(1)、测试主机是否存活,也就是判断网页是否可以浏览到。
在处理完复杂的命令行参数之后,sqlmap开始测试每一个URL是否是存活的。如果主机是存活的则将获得的网页内容保存下来作为以后blind-sql_inject之用。
注:如果是用户直接输入的网址,在大部分情况下都是可以访问的。如果是由爬虫爬到的网址,就会有一部分过期的网址无法访问。通过测试连接决定是否继续进行SQL注入扫描可以节省很多时间。
(2)、测试网页是否稳定,也就是测试网页是否有随时间变化的东西,比如滚动的广告等。
原理是:在间隔比较短的时间内各取一次同一个网页,然后测试两次所取到的内容是否相同。如果不同则说明页面内容是动态变化的。如果相同,就计算网页的MD5值保存起来,表示本页面是stable的。测试网页是否稳定还可以使用其他的办法。如:用户提供字符串,如果两次所取的网页中都包含这个字符串,就认为两次所取的网页是相同的。提供的字符串还可以是正则表达式,来达到更加准确的判断。
注:这样的判断是很有意义的,在后面判断一个URL是否存在SQL注入时使用的blink-sql_injection方法就用到了比对两次网页之间的不同。这就要求网页本身是稳定的,或者至少是相对稳定的。
(3)、测试URL中的某一个参数是否是动态的,也就是说这个参数是否是决定页面内容的关键参数。
原理是:使用一个随机数或者随机字符串(取决于需要替换的参数类型)来替换原来的参数,然后和原来的页面(步骤2中保存的MD5或其他的标识参数)进行对比。如果不同,则说明此参数是关键参数并可以用来进行sql注入扫描。否则忽略这个参数。
注:在一些页面参数中,可能某些参数是固定不变的。这样的参数无法用来进行sql注入扫描。忽略一些静态参数可以节省很多时间。
(4)、注入检测,也就是使用各种注入方法对目标URL中的各个参数做注入检测。
原理是:将存在的注入
漏洞分为三类:1、普通注入。2、数字类型注入。3、单引号注入。4、双引号注入。其中的单引号注入和双引号注入又分为普通的和使用LIKE类型的。
首先讨论一下网页相似度判断:如果执行命令时设置了关键字符串或者关键的正则表达式,那么使这些字符串和正则表达式判断网页的相似度(TRUE或者 FALSE)否则,如果保存有网页的MD5值(说明此页面是stable的),这个时候将最近一次获得网页和原始网页相比。如果此次比较的MD5值大于 0.6且小于1,将相似度阀值设置为这个值。如果此次检查的MD5值小于0.6,这个时候将相似度的阀值设置为0.9。如果没有网页的MD5值(网页不是 stable的),这个时候将相似度的阀值设置为0.9。在以后的比较中,如果相似度大于这个阀值,就认为两次获得的网页相同(返回TRUE),否则认为不相同(返回FALSE)。
判断相似度使用difflib库中的seqMatcher类。
检测过程:假设URL参数原来为o_value,替换为新的参数为n_value,前缀为prefix,后缀为postfix,圆括号数量为num默认为0(检测注入时设为0,实施注入时需要测试这个值的确切值)。
1、当设置有前缀,后缀时首先检查。如果没有设置就直接执行2。检查方法为:将o_value替换为
o_value prefix )*num AND (*num random_int = random_int postfix (TRUE)
o_value prefix )*num AND (*num random_int = random_int+1 postfix(FALSE)
如果以上两条件都成立,则认为这个参数存在普通SQL注入,否则执行2。
o_value prefix )*num AND (*num random_str postfix (FALSE)
如果上面三条件都成立,则认为这个参数是普通注入即第一类注入。
2、以下均为未设置前缀后缀时的检查情况。
o_value )*num AND (*num random_int = random_int (TRUE)
o_value )*num AND (*num random_int = random_int+1 (FALSE)
如果以上两条件都成立,则认为这个参数存在数字型SQL注入,否则执行3。
o_value )*num AND (*num random_str (FALSE)
如果上面三条件都成立,则认为这个参数是数字型注入即第二类注入。
3、 www.2cto.com
o_value’)*num AND (*num’random_str’=’random_str (TRUE)
o_value’)*num AND (*num’random_str’=’random_str+单个随即字符 (FALSE)
如果以上两条件都成立,则认为这个参数存在单引号SQL注入,否则执行4。
o_value’)*num AND (*num random_str (FALSE)
如果上面三条件都成立,则认为这个参数是单引号注入即第三类注入。
4、
o_value’)*num AND (*num’random_str’LIKE’random_str (TRUE)
o_value’)*num AND (*num’random_str’LIKE’random_str+单个随即字符 (FALSE)
如果以上两条件都成立,则认为这个参数存在LIKE单引号SQL注入,否则执行5。
o_value’)*num AND (*num random_str (FALSE)
—————————————————————————如果上面三条件都成立,则认为这个参数是LIKE单引号注入即第三类注入。
5、
o_value”)*num AND (*num”random_str”=”random_str (TRUE)
o_value”)*num AND (*num”random_str”=”random_str+单个随即字符 (FALSE)
如果以上两条件都成立,则认为这个参数存在双引号SQL注入,否则执行6。
o_value”)*num AND (*num random_str (FALSE)
如果上面三条件都成立,则认为这个参数是双引号注入即第四类注入。
6、
o_value”)*num AND (*num”random_str”LIKE”random_str (TRUE)
o_value”)*num AND (*num”random_str”LIKE”random_str+单个随即字符 (FALSE)
如果以上两条件都成立,则认为这个参数存在LIKE双引号SQL注入。
o_value”)*num AND (*num random_str (FALSE)
如果上面三条件都成立,则认为这个参数是LIKE双引号注入即第四类注入。
以上所有的TRUE和FALSE值都是有前面所述的判断页面是否相同的算法返回的判断值。
前面的算法描述可能不清楚,以后有时间再补个流程图。这只是判断是否存在SQL注入的过程,在真正实施注入的时候还需要判断其他的一些内容(例如其中圆括号的个数,
数据库类型),以后再分析