Fork me on github

攻防世界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。

 

 

 

 

 

 

posted @ 2020-12-16 17:10  北孤清茶。  阅读(486)  评论(0编辑  收藏  举报