PHP2

[src = 攻防世界] PHP2

WP

熟悉php的应该知道phps文件可以用来读取php代码,这里就是可以看到此问题导致对源码泄露,直接访问index.phps,得到源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>

Can you anthenticate to this website?

需要满足两个条件:
第一步,要使得”admin”===$_GET[id]不成立

第二步,经过$_GET[id] = urldecode($_GET[id]);,使得$_GET[id] == “admin”成立。

看似矛盾,关键在理解urldecode函数的行为,其解释为解码给出的已编码字符串中的任何 %##。 加号(’+’)被解码成一个空格字符。

因为当将URL传递给$_GET[id]时,会进行第一次url解码,这时要求不能解码得到admin,然后再次交给urldecode进行url解码,这次要得到admin。
所以构造下面对payload:

1
?id=%2561dmin

第一次url解码得到(将%25解码成%):

1
?id=%61dmin

此时满足了第一步的条件。然后第二次交给urldecode函数,这次将%61解码成字符a,变为:

1
?id=admin

满足第二步条件,得到flag。