WeChall - Training - Register Globals
Challenge
利用 PHP register_globals 漏洞。该挑战模拟了旧版 PHP
register_globals=On 的行为:
1 | foreach ($_GET as $k => $v) { $$k = $v; } |
当 register_globals 启用时,GET/POST
参数会自动成为全局变量。目标是以 admin 身份登录。
提供了一个测试账号 test:test,但只能以用户
test 身份登录,无法登录 admin。
挑战的核心代码:
1 | # EMULATE REGISTER GLOBALS = ON |
Solution
register_globals=On 的行为是将 GET/POST
参数直接提升为全局变量。代码中的
foreach ($_GET as $k => $v) { $$k = $v; }(variable
variables)模拟了这一机制。
直接传入 login[0]=admin 构造 $login
数组:
1 | $ curl -b 'WC=...' -g \ |
foreach ($_GET as $k => $v) { $$k = $v; } 将
$_GET['login'] = ['admin'] 赋给
$login,isset($login) 和
$login[0] === 'admin'
同时通过,挑战完成。userlevel
为空是因为绕过了数据库查询——没有真实用户被认证,但这不影响 flag
发放。
注意 URL 中的 [] 需要用
-g(--globoff)防止 curl 解释为通配符。