攻防世界web高手进阶区——PHP2
攻防世界web高手进阶区——PHP2
思路:phps源码泄露,url二次解码
writeup
知道了题目是写关于PHP的内容,那么肯定少不了代码审计,我们打开靶机后按F12查看代码源,并没有什么发现。扫描目录后发现存在phps
源码泄露(这个我没有搞懂得看wp)。所以要在URL后加个
/index.phps
打开后可以看到一串PHP的代码显示在网页上,但是并不完整,于是我们还需要打开代码源查看是否还有可用信息。发现的确有一个注释信息,
于是我们可以将其拼成完整的PHP代码。
<?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]
不成立,否则会输出“not allowed!”,并退出程序。
第二步,经过$_GET[id] = urldecode($_GET[id]);
,使得$_GET[id] == "admin"
成立。
因为_GET本身有一次urldecode,加上代码中$_GET[id] = urldecode($_GET[id]);语句又一次urldecode解码,因此有两次解码。所以我们要URL后加
1 ?id=%2561dmin
因为当传入参数id时,浏览器在后面会对非ASCII码的字符进行一次urlencode
然后在这段代码中运行时,会自动进行一次urldecode
在urldecode()函数中,再一次进行一次解码
urldecode(%2561)=%61 urldecode(%61)=a
即,当第一次比较时,实际是
if("admin"==="%61dmin")
而经过
$_GET[id] = urldecode($_GET[id]);
第二次比较是:
if("admin" == "admin");
补充知识点:
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,
所以需要用phps文件代替。其实,只要不用php等已经在服> 务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。
它的MIME类型为:text/html, application/x-httpd-php-source, application/x-httpd-php3-source。