Webhacking.kr 4xx
Challenge
The page collects nine
KEY{<32-hex>}values and renders a flag image.页面收集九个
KEY{<32-hex>}值,并渲染一张 flag 图片。
1 | http://webhacking.kr:10022/ |
页面标题是 Get 4XX for flag,表单字段为
key1 到 key9,每个字段的客户端 pattern 是
KEY\{([0-9]|[a-f]){32}\},页面引用
/img/flag.png。9 个 key 全部正确时表单返回
Your score : 9,并打印
FLAG is flag{<value>};提交顺序不影响计分(正序与逆序都是
9 分)。
Solution
key 由 HTTP 4xx 状态码发放:任何让 Apache 返回 4xx
的请求都会在响应体里给出该状态码对应的 key,格式是
4XX Error!<br> your key : <key-value>。同一状态码的
key 固定不变,所以凑齐 9 个不同的 4xx 状态码就能得到全部 9 个 key。
实测的状态码、触发请求与对应 key:
400:发送包含 9 KBX-Big请求头的请求,得到KEY{10fac9b9f4112a1d9a650fec275bf164}。403:访问禁止列目录的/img/,得到KEY{cd79de80772c1873bcf63e41e3379c6f}。404:访问不存在的路径,得到KEY{23c0b3a9ccc44b72f17a99eadb351d2f}。405:发送TRACE /,得到KEY{e5602408f2037c05bbbb0995fec6bc58}。408:发送请求行和Host后保持连接,不补完请求头,得到KEY{e44fa3e1865a3839cbc0b658f1ae08cf}。412:请求静态文件/img/flag.png并设置If-Match: "nope",得到KEY{cd7609461c0dbe41a9137056fa4085e2}。414:发送约 30 KB 的超长请求路径,得到KEY{d1617527ac2143863bc347c6123ed921}。416:设置Range: bytes=999999999-,得到KEY{622eced9aa42670c10ee74d29e58e5eb}。417:发送POST /并设置Expect: foo,得到KEY{ed2dd6cb38fe6a4a10e46d22d20047e6}。
Apache 负责生成这些 4xx 响应。405 需要使用不被允许的
method。412 依赖带 ETag 的静态文件;对 / 设置
If-Match 返回 200。417 要求
Expect 值不是 100-continue,后者会返回
100 Continue 并继续正常请求。408 需要原始
socket 在发送部分请求头后保持连接。Apache 2.4.29 对超长 header 返回
400,不产生 431。
收集脚本(原始 socket,因为 408 需要在发完部分请求头后等待):
1 | #!/usr/bin/env python3 |
复现边界:入口、9 个状态码、9 个 key 值、Your score : 9
与 flag 回执均为现网实测;408
依赖服务端超时、412 依赖静态文件的 ETag,若实例的 Apache
配置变化需重新确认触发方式。