你能验证这个网站吗?
根据提示是PHP,我们知道PHP代码在服务器端执行,可以连接数据库,查询数据,并根据查询结果动态生成网页内容。
PHP代码通常是保存在以.PHP为扩展名的文件上,这些文件存储在web 服务器的文档根目录中,以便通过浏览器访问和执行;尝试查看一下示例文件名:index.php 可以正常运行
尝试其他经典的文件名时不太行
这个脚本文件是在服务器上运行的,不是在客户端浏览器上,我们想看的是脚本源代码,而不是解析的效果,php文件源代码通常在phps文件,尝试访问一下index.phps
代码审计:
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}//这行代码检查 $_GET['id'] 是否直接等于字符串 "admin"。如果是,将输出一条消息并终止脚本执行。
$_GET[id] = urldecode($_GET[id]);
//使用 urldecode() 函数解码 $_GET['id'] 的值
关键: 在解码之后再次检查 $_GET['id'] 是否等于字符串 "admin",如果等于将输出访问权限和密钥
if($_GET[id] == "admin")
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
//在解码之后再次检查 $_GET['id'] 是否等于字符串 "admin",如果等于将输出访问权限和密钥
所以我们可以进行编码制造payload:
因为是使用 urldecode() 函数解码经过url编码的函数
所以对admin进行url编码:%61%64%6d%69%6e
又因为编码后参数%61dmin中存在特殊字符%,浏览器会自动进行URL解码,所以我们对%进行编码:%25
最终id==%2561%64%6d%69%6e
本来是全部编码的,但是一解析以后就又变成了只编码a了,不管是只编码a还是全部编码都能得到flag