我的解题过程
-
访问目标网站,网页内容为”Can you anthenticate to this website?”
-
使用dirsearch工具,爆破目录扫描php文件,未找到可访问的路径
-
访问”/?id=admin”,网页返回内容为”not allowed!”
-
访问”/?user=admin”,网页返回内容为”Can you anthenticate to this website?”,所以id字段应该是被PHP处理的
-
使用Burp Suite的Intruder尝试爆破其他字段,均没有收获
-
尝试使用Burp Suite的Encoder模块进行URL编码,访问”/?id=%61%64%6d%69%6e”,网页返回内容仍为”Can you anthenticate to this website?”
-
尝试二次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?
-
发现flag,cyberpeace{3883f703d12b68c0b7d72eea9fab08ca}
-
提交,答案正确
独立思考
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即可。
产生过的疑问
- 为什么URL二次编码可以成功登录?
- 目录爆破中的后缀名问题,如何解决?