进入题目页面如下
意思是你能访问这个网站吗?
ctrl+u、F12查看源码,什么都没有发现
用kali中的dirsearch扫描根目录
命令如下,根据题目提示以及需要查看源码,扫描以php、phps、html为后缀的文件
dirsearch -u http://61.147.171.105:58249/ -e php,phps,html
知识点
/index.php:
是一个常见的 PHP 脚本文件。PHP 是一种广泛用于 Web 开发的服务器端脚本语言,.php文件通常包含 PHP 代码,用于生成动态网页内容、与数据库交互、处理表单数据等。当 Web 服务器接收到对/index.php的请求时,它会执行其中的 PHP 代码,并将生成的结果以 HTML 等格式返回给客户端浏览器。例如,一个网站的用户登录系统可能就是通过index.php文件中的 PHP 代码来处理用户输入的用户名和密码,与数据库中的数据进行比对,然后根据结果决定是否允许用户登录。
服务器需要正确配置 PHP 环境,以便能够解析和执行.php文件。通常需要安装 PHP 解释器,并在服务器配置文件(如 Apache 的.conf文件或 Nginx 的配置文件)中进行相应的设置,以告诉服务器如何处理.php文件的请求。
/index.phps:
.phps文件通常是 PHP 源代码文件的一种特殊形式,主要用于提供 PHP 脚本的源代码展示或下载等用途。一般情况下,它可能包含与/index.php相同或类似的 PHP 代码,但服务器对.phps文件的处理方式可能与.php文件不同。有些服务器配置可能会将.phps文件视为纯文本文件,直接展示其源代码内容,而不是像处理.php文件那样执行其中的代码。
默认情况下,服务器可能不会像处理.php文件那样对.phps文件进行特殊的处理。如果需要对.phps文件进行特定的处理,比如将其作为下载文件提供给用户,或者对其进行语法高亮显示等,需要在服务器配置中进行额外的设置。
发现/index.phps文件,并访问
发现源码,进行代码审计
php"><?php
// 开始检查 $_GET 数组中名为 'id' 的参数是否严格等于字符串 "admin"
if("admin"===$_GET[id]) {
// 如果严格相等,意味着参数 'id' 的值就是 "admin"
echo("<p>not allowed!</p>");
// 输出提示信息,表示不允许该操作
exit();
// 终止当前脚本的执行
}
// 对 $_GET 数组中 'id' 参数的值进行 URL 解码操作
$_GET[id] = urldecode($_GET[id]);
// 再次检查经过 URL 解码后的 'id' 参数的值是否等于字符串 "admin"
if($_GET[id] == "admin")
{
// 如果相等,意味着经过解码后 'id' 的值为 "admin"
echo "<p>Access granted!</p>";
// 输出提示信息,表示访问已被授权
echo "<p>Key: xxxxxxx </p>";
// 输出一个密钥信息
}
?>
可以利用 URL 二次编码来绕过最初的严格比较。可以传入经过 URL 二次编码的 "admin",这样在第一次严格比较时,由于编码后的字符串与 "admin" 不相等,会通过检查。而第二步中经过 URL 解码后,就会变成 "admin",从而通过第二次非严格比较,获取flag
在 ASCII 编码中,字符 a
的十进制 ASCII 码值是 97,转换为十六进制就是 61
;字符 d
的十进制 ASCII 码值是 100,十六进制为 64
;字符 m
的十进制 ASCII 码值是 109,十六进制是 6D
;字符 i
的十进制 ASCII 码值是 105,十六进制为 69
;字符 n
的十进制 ASCII 码值是 110,十六进制是 6E
。所以,字符串 "admin"
经过 URL 编码后就变成了 %61%64%6D%69%6E
。
再次编码,可以利用这个在线工具URL 编码/解码 - 锤子在线工具进行URL编码
通过get传参,构造payload
?id=%2561%2564%256D%2569%256E
最终得到flag