HackThisSite - Extended Basic Mission 12

Challenge

This site is run by a serious web admin. But the web developer doesn't know that much. URL: moo.com (any script you want); Exploit this code:

站点由一个认真的 web 管理员在维护,但写代码的开发者水平不高。题目给定 moo.com 上的任意脚本(any script you want),要求利用这段 PHP。

关卡页给出的脚本正文:

1
2
3
4
5
<?php
$password = 'IWantToCow';
foreach ($_GET as $key => $value) { $$key = $value; }
if ($userpass == $password) { ok(); } else { echo "<form><input type='text' name='usertext' /><input type='submit'><form>"; }
?>

Solution

$$key = $value 是 PHP 的变量变量写法:把 $key 的值当作变量名,再给它赋值。foreach ($_GET as $key => $value) 遍历 URL query string 的每个参数,于是

  • ?userpass=IWantToCow 会执行 $userpass = 'IWantToCow'
  • ?password=IWantToCow 会执行 $password = 'IWantToCow'
  • 任何其他名字同理,脚本里的变量表完全由请求者给出的 query string 决定。

脚本原本先把 $password 设成 'IWantToCow',但紧接着的循环会把它连同 $userpass 一起覆盖。最终判据是:

1
if ($userpass == $password) { ok(); }

判据只比较 $userpass$password 两个变量,而两者都在循环的可写范围内。既然 query string 能同时给它们赋值,直接让二者取同一个值就恒为真