Webhacking.kr ouroboros golf
Challenge
Use a self-reproducing SQL expression (quine SQLi).
使用能生成自身的 SQL expression。
1 | https://webhacking.kr/challenge/new-12/ |
Analysis
服务端把 pw 放进单引号包围的查询,并要求查询结果中的
pw 与原始输入完全相等。普通 UNION SQLi
虽然能控制返回值,却不会自动生成完整 payload;这里需要让 SQL
查询返回它自己的源码,也就是 SQL quine。
关键点不是“查出一个已知密码”,而是让 UNION SELECT
的结果恰好等于整个输入字符串。
Solution
使用的 payload:
1 | ' union select replace(replace(\" union select replace(replace(\"$\",0x22,0x27),0x24,\"$\")#',0x22,0x27),0x24,'\" union select replace(replace(\"$\",0x22,0x27),0x24,\"$\")#')# |
$ 是模板占位符,0x22 和 0x27
分别表示双引号和单引号。把 payload 抽象成模板 T
后,查询中的表达式相当于:
1 | replace(replace(T, 0x22, 0x27), 0x24, T) |
执行过程分两步:
- 外层
replace()把模板中的双引号还原成 payload 需要的单引号。 - 内层
replace()把$替换成已经还原后的模板,于是结果就是完整 payload 本身。
开头的单引号闭合原查询字符串,UNION SELECT
返回生成后的字符串,末尾的 # 注释掉原查询剩余部分。
最终响应中的 Pw 与输入一致,满足题目的比较条件。