1、打开靶机链接http://61.147.171.105:49513/,没有发现任何线索
2、尝试访问http://61.147.171.105:49513/index.php,页面没有发生跳转
3、尝试将访问 尝试访问http://61.147.171.105:49513/index.phps
index.php
和index.phps
文件之间的主要区别在于它们的文件扩展名。
index.php: 这是一个标准的 PHP 文件,通常用于编写 PHP 代码。当用户访问
index.php
文件时,Web 服务器会解释其中的 PHP 代码,并将结果发送给用户的浏览器。PHP 文件可以包含 HTML、CSS、JavaScript 以及服务器端的 PHP 代码。index.phps: 这个文件名可能是由开发人员自定义的,它的扩展名
.phps
是一种特殊的命名约定,通常用于显示 PHP 源代码而不是执行它。如果用户访问index.phps
文件,Web 服务器通常会直接将文件内容发送给浏览器,而不会解释其中的 PHP 代码。这对于演示和学习目的可能会有用,但不建议在生产环境中使用这种方式,因为它会暴露服务器端的代码。总之,
index.php
是一个标准的 PHP 文件,用于执行 PHP 代码,而index.phps
可能用于显示 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>";
}
?>
补充知识:
1、urldecode为解码和urlencode为编码
2、$_GET本身自带一次urldecode解码,即浏览器对url本身有一个检测,对于输入的中文、日文、俄文、和一些特殊字符进行解码,对于字母、数字等合法字符不会进行解码。
3、urldecode()函数为php解码
4、所以我们如给直接给参数传参admin会杯第一个if过滤掉。又考虑由于浏览器会对GET参数进行一次
URL解码,加上PHP源码中的urldecode($_GET[id])有对可变参数进行一次解码,总共会给参数进行2次解码。考虑先将参数admin先进行编码两次
对于字母a进行urldecode编码之后为%61,在对%进行urldecode编码之后为%2561
所以参数输入id=%2561dmin,这样的话浏览器先对参数编码一次为%61dmin,然后参数传入PHP服务器后为%61dmin,所以代码中的第一个if判断结果为false如下:
"admin"===$_GET[%2561dmin]
===(全等运算符):=== 运算符执行严格比较,它不会进行类型转换。
只有在两个操作数的值相等且类型也相同时,=== 运算符才返回 true,否则返回 false。
在严格比较中,值和类型都必须相同才会被视为相等。
例如:var_dump(1 === "1"); // 输出 bool(false)
然后$_GET[id] = urldecode($_GET[id])中urldecode再一次编码为了admin,跳到第二个if函数执行判断为true,获取flag
$_GET[%61dmin] == "admin"
==(相等运算符):== 运算符执行松散比较,它会在比较之前尝试将操作数转换为相同的类型。
如果两个操作数的值相等,那么 == 运算符返回 true,否则返回 false。
在松散比较中,类型不同的值可能会被视为相等。
例如,字符串 "1" 和整数 1 在使用 == 运算符比较时会被视为相等。
var_dump(1 == "1"); // 输出 bool(true)
总结:
1、尝试在url后面+inedx.php或index.phps,看页面变化
2、浏览器会对用户传入的参数进行urldecode解码,只会进行一次,并且直接将解码后的参数传给服务器php源码中
3、”==“ 是相等运算符,比较值相等,不比较类型;"===" 是全等运算符,值与类型都比较
4、urldecode为解码,urlencode为编码
5、参考:URL特殊字符编码对照表_bce6b8a5e6598e8-CSDN博客