我的解题过程

  1. 访问目标网站,网页内容为”Can you anthenticate to this website?”

  2. 使用dirsearch工具,爆破目录扫描php文件,未找到可访问的路径

  3. 访问”/?id=admin”,网页返回内容为”not allowed!”

  4. 访问”/?user=admin”,网页返回内容为”Can you anthenticate to this website?”,所以id字段应该是被PHP处理的

  5. 使用Burp Suite的Intruder尝试爆破其他字段,均没有收获

  6. 尝试使用Burp Suite的Encoder模块进行URL编码,访问”/?id=%61%64%6d%69%6e”,网页返回内容仍为”Can you anthenticate to this website?”

  7. 尝试二次URL编码,访问”/?id=%25%36%31%25%36%34%25%36%64%25%36%39%25%36%6”,网页返回内容如下

    <p>Access granted!</p>
    <p>Key: cyberpeace{3883f703d12b68c0b7d72eea9fab08ca}</p>
    Can you anthenticate to this website?
    
  8. 发现flag,cyberpeace{3883f703d12b68c0b7d72eea9fab08ca}

  9. 提交,答案正确

独立思考

1. 为什么URL二次编码可以成功登录?

首先本题解法其实不是我使用的方法,本题其实是代码审计题。

phps文件就是PHP的源代码文件,通常从浏览器访问PHP文件看到的是PHP代码执行后的内容。所以PHP的源代码文件通常命名为phps,因为phps未在httpd中关联到PHP解释器,所以会以文本形式返回。

访问”/index.phps”,网页返回内容如下

<?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?
  • 首先判断get方法传来的参数是否是admin,如果是,则返回”not allowed”,并终止程序
  • 对get方法传来的参数进行url解码,之后判断是否是admin,如果是的话,就返回Key,即结果

URL编码实际上就是把不能传输的字符转为它的十六进制并在前面加上%。

平时URL编码是用不到的,因为浏览器会自动将输入到地址栏的非数字字母转换为URL编码,服务器端收到数据会自动进行一次URL解码,所以在后端代码中不用专门写urldecode()

  • 由于编码一次的话,服务器端接收时就自动解码一次,一定会进入第一个if退出程序
  • 如果编码两次,服务器端接收时会自动解码一次,过了第一个if,之后被脚本中的urldecode()解码一次,恢复出真正的样子

在浏览器地址栏如果直接输入编码一次的URL,在发起请求时,浏览器会把它解码后显示在地址栏,并再次编码,所以在浏览器中输入仅编码一次的URL是没办法偷懒的。

2. 目录爆破中的后缀名问题,如何解决?

Dirbuster工具可以暴力枚举后缀名,类似于Burp Suite的Intruder模块,只需添加标记和payload即可。

产生过的疑问

  1. 为什么URL二次编码可以成功登录?
  2. 目录爆破中的后缀名问题,如何解决?