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)

执行过程分两步:

  1. 外层 replace() 把模板中的双引号还原成 payload 需要的单引号。
  2. 内层 replace() 把 $ 替换成已经还原后的模板,于是结果就是完整 payload 本身。

开头的单引号闭合原查询字符串,UNION SELECT 返回生成后的字符串,末尾的 # 注释掉原查询剩余部分。

最终响应中的 Pw 与输入一致,满足题目的比较条件。