基于代码审计和部分sql相关的绕过:
- or
- ||
- %
- ^
- 0b
- ~~
题目类型如下:
以下分为6个方式来讨论该类型:
第一题:无绕过
对代码进行分析:需要GET一个ID<999的参数,但是flag需要id=1000才能获取。这里我们还可以看到他执行的是SQL语句,因此大概率是SQL注入。
我们随便输入一些ID的值得到以下内容:
ID=1
ID=2
为什么ID=2之后都没有结果呢?当然是因为数据库里面查询不到这个值,而学习过SQL注入的同学应该知道,order by 字段与 union select字段有几分相似,因此可以确定这是SQL注入 拼接语句,那么我们只需要拼接以下即可
id=2 or id=1000
执行的语句则是:select* from article where id=2 or id=1000 order by limit 1 因为id=2无内容,所以查询id=1000的值;
那么你是否有下面这个疑问:传入了 id=2 or id=1000 这么多数据是怎么通过IF判断的?
如下,原语句使用了intval函数,intval函数从数字开始读取,读取到字母或者说是非数字的时候截断。因此传入的id被读取为:2 就饶过了
第二题:正则字符:禁止使用OR字段(在这里不代码了)其余源代码不变;
OR的字符型是|| ,因此直接使用这个即可
第三题:正则字符:禁止使用OR 或者 ||
OR || 行不通,那么试试url字符的or不就好了
第四题:正则字符:禁止使用OR || %
那么这个时候可以考虑 位运算符 ^
但是这个地方的话呢,我们就不考虑前面的思路了,前面几道题的思路都是,通过OR拼接字符串的方式,那么这里我们就不采用拼接字符串的方式了,采用直接构造1000
第四题如下: 位运算符:位相同则为0 不同则为1;
如下 0 1 0 0 0 0 0 1 ^0 1 0 1 1 0 1 0二进制编码的10进制分别是:65和90 但是通过 运算之后呢得到的是27
因此 我们要得到一个1000 就可以这样去构造即可
答案:144^888 (这样也满足了 IF语句)
第五题:正则绕过过滤了 or 、||、%、^
这里还是考虑位运算符:~(取反)
playload: ~~1000 1000经过两次取反之后是小于999的,所以可以通过IF语句,而再执行的时候貌似没有被执行~
第六题:绕过了以上各种符号
那么我们可以使用hex编码或者0b即可
使用如下:
?id=hex(3e8) 1000的hex就是3e8
?id=0b1111101000 (IF里面只会读取id=0 而sql语句里面则执行整个命令)
结语: 以上绕过方式可相互利用,且不止一种,祝大家学习顺利,工作进步。