sql注入
web-171(无过滤字符型注入)
查询语句
1 | |
解题思路:
无过滤的字符型注入
payload步骤:
1 | |
web-172(无过滤字符型注入、union联合查询)
查询语句
1 | |
返回逻辑
1 | |
解题思路:
添加限制条件 name!=‘flag’ 输出的username中不能有flag
所以只能用union联合查询了,走流程
爆库名->爆表名->爆列名->爆字段值
payload构造步骤:
1 | |
web-173(字符型注入、hex函数绕过正则过滤flag)
查询语句
1 | |
返回逻辑
1 | |
解题思路:
返回数据会检查是否有username=’flag’,但是我们不查username字段就行了,或者将username字段使用hex函数编码
还有一种方法就是将flag替换
payload:
1 | |
web-174(正则过滤数字、replace函数绕过、盲注)
查询语句
1 | |
返回逻辑
1 | |
解题思路:
发现过滤了flag与数字,我们可以利用mysql的replace替换数字、或者使用盲注脚本(不知道为什么我这里失败了)
payload:
replace函数绕过做法
1 | |
web-175(正则过滤ascii 0-127绕过、利用into outfile写入webshell、时间盲注 )
查询语句
1 | |
返回逻辑
1 | |
解题思路:
过滤了 ascii 0-127,尝试从其他信道将数据带出,利用into outfile来实现文件的输出
还可以使用时间盲注,因为没有回显所以布尔盲注不行
payload:
1 | |
时间盲注脚本:
1 | |
web-176(大小写绕过select过滤)
查询语句
1 | |
返回逻辑
1 | |
解题思路:这里过滤了select,可以使用大小写绕过,但是没必要用联合查询,直接1' or 1=1 --+即可
payload:
1 | |
web-177(空格过滤绕过(/**/、%09))
查询语句
1 | |
返回逻辑
1 | |
解题思路:
有过滤的字符型注入,试了一下,对空格和--+有过滤,用 %09或者/**/注释符绕过空格过滤,用%23即#(这里只能用%23)绕过--+过滤。
1 | |
web-178(空格过滤绕过(%0b换行符、%09))
解题思路:
过滤掉了/**/ # ,所以不能用/**/ 来代替空格了
可以用换行符%0b或者%09来代替空格
payload:
1 | |
we-179(空格过滤绕过(%0c))
解题思路:
有过滤的字符型注入,和上上题差不多,增加了对 %09 %0a %0b %0d 的过滤,%0c 可以用。
payload:
1 | |
web-180(#(%23)注释符过滤绕过)
解题思路:
增加了对 #(%23) 的过滤,这里使用 – (–后加个空格) 绕过。
1 | |
web-181(空格过滤绕过、逻辑运算优先级)
查询语句
1 | |
返回逻辑
1 | |
没有空格和 select 可以用,这里利用逻辑运算的优先级构造 and 语句,绕过查询语句前面的 username != flag,且不能含有空格
and>or
关于优先级问题就跟加减号与乘除号一样,and先运算,那么and的运算结果过程如何解释:需要同时满足两边的条件才会返回true那么这里就是让第一个and语句返回false让后面的and语句来做到知行的效果
payload:
1 | |
web-182(逻辑运算优先级、盲注)
返回逻辑
1 | |
比上题多过滤了一个flag,依然可以用上题的payload,或者用盲注
payload:
1 | |
web-183(count、python脚本进行like或正则匹配)
源码:
1 | |
返回逻辑
1 | |
查询结果
1 | |
解题思路:
这里会将我们传入的tableName值进行sql语句的拼接。所以我们可以利用前面的count加like匹配来爆破flag
python脚本:
1 | |
注意:在拼接sql语句的时候,表名和列名要用反引号`围起来,或者使用圆括号()括起来,避免sql语句无法执行,因为sql中不能存在空格
web-184(group by绕过where过滤、十六进制绕过单双引号过滤、regexp)
where被禁用了。。。用group by代替
双引号单引号也被过滤了,改为十六进制进行绕过
1 | |
注意:
1 | |
web-185(python脚本正则匹配、数字过滤绕过)
查询语句
1 | |
返回逻辑
1 | |
查询结果
1 | |
过滤了数字,所以需要自己构造出数字
| expression | number |
|---|---|
| false | 0 |
| true | 1 |
| true+true | 2 |
| floor(pi()) | 3 |
| ceil(pi()) | 4 |
| floor(pi())+true | 5 |
| floor(pi())+floor(pi()) | 6 |
| floor(pi())+ceil(pi()) | 7 |
| ceil(pi())+ceil(pi()) | 8 |
| floor(pi())*floor(pi()) | 9 |
| floor(pi())*floor(pi())+true | 10 |
我们这里使用”true+true”的形式即可构造出0-9的数字
然后使用concat进行连接,并且过滤了 " ' 不能使用 concat(‘str’,‘str’) 进行拼接,字符与数字都需要自己构造 通过chr() 函数将数字转义为字符
python脚本:
1 | |
web-186(同上)
web-187(mysql特性、md5)
查询语句
1 | |
返回逻辑
1 | |
解题思路:
分析返回逻辑发现我们传入的$username必须为admin才会进行下一步sql查询,否则就会报错,所以只能在password上入手。
MySQL的一个特性: 只要’or’后面的字符串为一个非零的数字开头都会返回True
关键代码:
$password = md5($_POST[‘password’],true);
// 如果可选的binary被设置为true 那么md5摘要将以16字符长度的原始二进制格式返回
// 那么如果 md5($_POST[‘password’],true) 的返回值为 ‘or’1(除0外任意数字开头)xxx SQL语句将被拼接为
$sql=”select count(*) from ctfshow_user where username=’admin’ and password=’’or’1xxx’”;
// 密码输入 ffifdyop
md5(“ffifdyop”,true) => ‘or’6É]é!r,ùíb
payload:
1 | |
点击登录并抓包放到重放器中然后发送,在响应包中就能看到flag
web-188(mysql弱类型比较)
查询语句
1 | |
返回逻辑
1 | |
当一个字符串与数字比较时会把字符串转化为数字,如 '4ad'=4
而当数字为0,且字符串开头不为其他数字时,弱类型恒成立
payload:
1 | |
web-189(sql盲注、load_file函数读取文件、if)
查询语句
1 | |
返回逻辑
1 | |
此题提醒了flag在api/index.php, 大概率就是让用load_file来读取函数
1 | |
python脚本:
1 | |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。