[src = 攻防世界] PHP2
WP
熟悉php的应该知道phps文件可以用来读取php代码,这里就是可以看到此问题导致对源码泄露,直接访问index.phps,得到源码:
1 |
|
需要满足两个条件:
第一步,要使得”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。