sql注入的分类及概念
基于从服务器接收到的响应
基于错误的 SQL 注入
联合查询的类型
堆查询注射
SQL 盲注
基于布尔 SQL 盲注Mysql 注入
基于时间的 SQL 盲注
基于报错的 SQL 盲注
基于如何处理输入的 SQL 查询(数据类型)
基于字符串
数字或整数为基础的
基于程度和顺序的注入
一阶注射
一阶注射是指输入的注射语句对 WEB 直接产生了影响,出现了结果
二阶注射
二阶注入类似存 储型 XSS,是指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间 接的对 WEB 产生危害,这样的就被称为是二阶注入.
基于注入点的位置上的
通过用户输入的表单域的注射。
通过 cookie 注射。
通过服务器变量注射。 (基于头部信息的注射)
以上摘抄自《sqlilabsg过关手册注入天书》
自己大致总结如下
- 联合查询
- 堆叠查询
- 报错注入
- 布尔盲注
- 时间盲注
- 宽字节注入
- 二阶注入
- 头部注入
数字型/字符型注入判断
id | 数字型(id=id) | 字符型 (id=’id’) |
---|---|---|
1’ | id=1’ 返回错误 | id=’1’’ 返回错误 |
1’ –+ | id=1’ –+ 返回错误 | id=’1’ –+’’ 返回正常 |
1 and 1=1 | id=1 and 1=1 返回正常 | id=’1 and 1=1’ 返回正常 |
1 and 1=2 | id=1 and 1=2 返回错误 | id=’1 and 1=2’ 返回正常 |
1 or 1=1 | id= 1 or 1=1 返回正常 | id= ‘1 or 1=1’ 返回正常 |
1 or 1=2 | id=1 or 1=2 返回正常 | id=’1 or 1=2’ 返回正常 |
联合查询
前提条件:页面上有显示位
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
1 | SELECT column_name(s) FROM table1 |
UNION的作用是将两个select查询结果合并,为了爆出第一位后面的显示位,需要隐藏正常结果,比如将?id=1
改为?id=-1
,使union前面的语句报错,执行后面的,爆出显示位
1 | # union 前面的语句不爆错,界面显示正常 |
1 | # 使union前面的sql语句报错,后面的查询结果出来了 |
相关函数
order by
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
1 | select * from 表名 order by 列名(或者数字) asc;升序(默认升序) |
这里的重点在于order by后既可以填列名或者是一个数字。举个例子: id是user表的第一列的列名,那么如果想根据id来排序,有两种写法:
1 | select * from user order by id; |
所以说在判断字段数时用order by,再不超过字段数时页面返回正常,一旦超出就会报错
1 | SELECT * FROM users WHERE id='1' order by 3 -- ' LIMIT 0,1 |
1 | SELECT * FROM users WHERE id='1' order by 4 -- ' LIMIT 0,1 |
字符串连接函数
concat()函数
CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。
1 | select concat(id,username) from users; |
CONCAT_WS()函数
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
CONCAT_WS(separator,str1,str2,…)
Separator为字符之间的分隔符
1 | select concat_ws('~',id,username) from users; |
GROUP_CONCAT()函数
GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。
1 | select group_concat(id,username) from users; |
堆叠查询
在SQL语句中,语句的结束都是以
;
结尾,但是如果我们在;
后面再加上一条SQL语句,两条语句会一起执行
1 | use security;show tables; |
1 | use secu;show tables; |
报错注入
报错注入的使用场景一般是在页面无法显示数据库的信息,但是是有报错内容的,报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。
报错注入形式上一般是做两个嵌套的查询,里面的那个查询被称为子查询,执行顺序也是从子查询开始的,所以我们可以通过子查询查询我们想要的数据,然后在通过报错函数将我们查询到的数据带出,从而达到爆出想要查询的数据。
相关函数
updatexml()
1 | updatexml(XML_document,XPath_string,New_value) |
参数 | 描述 |
---|---|
XML_document | string格式,为XML文档对象的名称 |
XPath_string | 代表路径,Xpath格式的字符串 |
New_value | string格式,替换查找到的符合条件的数据 |
当第二个参数格式出现错误,会将第二个参数的内容显示在报错信息中
1 | select updatexml(1,concat(0x7e,(select version()),0x7e),1); |
extractvalue()
1 | extractvalue(XML_document,xpath_string) |
参数 | 描述 |
---|---|
XML_document | string格式,为XML文档对象的名称 |
xpath_string | 代表路径,Xpath格式的字符串 |
1 | select extractvalue(1,concat(0x7e,(select version()),0x7e)); |
BITINT溢出
数据类型BIGINT的长度为8字节,也就是说,长度为64比特。这种数据类型最大的有符号值,用二进制、十六进制和十进制的表示形式分别为“0b0111111111111111111111111111111111111111111111111111111111111111”、“0x7fffffffffffffff”和“9223372036854775807”。 当对这个值进行某些数值运算的时候,比如加法运算,就会引起“BIGINT value is out of range”错误。
可以参考文章 bigint 溢出文章 http://www.cnblogs.com/lcamry/articles/5509112.html
我没有复现成功可能已经修复了,我虽然报错了但并没有查询到数据
布尔盲注
何为盲注?盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显
到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。