详解SQL盲注测试高级技巧.doc
文本预览下载声明
写在前面:
这篇文章主要写了一些加快盲注速度的技巧和盲注中比较精巧的语句,虽然注入并不是什么新技术了。但是数据库注入漏洞依然困扰着每一个安全厂商,也鞭策着每一个安全从业者不断前进。
正文:
首先来简单介绍一下盲注,盲注是不能通过直接显示的途径来获取数据库数据的方法。在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)。一般情况下,盲注可分为三类。
Booleanbase
Timebase
Errorbase
其中第一类Boolean就是我们最常接触到的普通盲注。
比如在where语句中可以构造or 1=1来使返回页面不同。(这里用mysql演示一下,大家体会就好)
mysql select 123 from dual where 1=1;
++
| 123 |
++
| 123 |
++
1 row in set (0.00 sec)
mysql select 123 from dual where 1=0;
Empty set (0.00 sec)
如果注入点在order by后面,那么则可以使用判断语句来构造报错。(其实order by后面的注入也可以根据返回结果的顺序来判断,这里自由发挥就好:P)
mysql select 1 from te order by if(1,1,(select 1 union select 2)) limit 0,3;
++
| 1 |
++
| 1 |
| 1 |
| 1 |
++
3 rows in set (0.00 sec)
mysql select 1 from te order by if(0,1,(select 1 union select 2)) limit 0,3;
ERROR 1242 (21000): Subquery returns more than 1 row
基于时间的盲注的话,mysql主要涉及两个函数,sleep banchmark 基本是使用如下。
mysql select 1 from te where if(1=1,sleep(1),1) limit 0,1;
Empty set (27.00 sec)
mysql select 1 from te where if(1=2,sleep(1),1) limit 0,1;
++
| 1 |
++
| 1 |
++
1 row in set (0.00 sec)
基于报错的盲注,需要网站显示数据库报错信息,后面会有详细阐述。
知道了怎么判断ture or false之后就是获取数据了,当然你可以暴力测试每一个ascii码,不过这需要很多次尝试,如果你家正巧网速不好那么速度将会是十分缓慢的。
拿32位hash为例,暴力猜解的话许要 16*32=512次查询(因为hash一般是16进制,只有16种可能)。如果是一段包含大小写字母和特殊字符的32位字符串那?大概需要 72*32=2304次查询,这就比较多了。想要减少盲注查询的次数,一般会用到如下几种方法。
字频统计:
根据英文中字母出现的频率进行猜测,这种方法仅局限于用户名这样有意义的字符串,并不能应用于hash这样的无规律字符串。而且仅限于纯字母的猜测。HYPERLINK /wiki/字母频率wiki百科上有字母使用频率的统计。
那么根据字频统计,e出现的概率最高,a其次,那我们就先猜测e,再猜测a。更近一步,我们可以使用双字的字频来进一步提高效率,比如th在英文中出现的概率很高。那么在第一个字母是t之后,我们下个字符第一个猜测h。
ps.这种方法的效率有多高哪?只能说看脸。
二分查找,位运算法:
把他们两个放在一起是因为他们的作用是相同的都会把试探字符串的次数降低到log(n)*length (n为可能字符的数量)。
首先来说二分查找,它的原理是把可能出现的字符看做一个有序的序列,这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止。
使用而返查找确定一个hash散列的一位,只需要4次查询(2^4=16),也就是说确定一个32位hash,只需要126次请求,大大缩短了查询的次数。
这里给出一个二分查找的pyhton源代码
import urllib
import urllib2
def doinject(payload):
url = xxxxxxxxxxxxxxxxxxxxx
values = {injection:payload,inject:Inject}
data = urllib.urlencode(values)
#pri
显示全部