PHP2
打开题目环境
没啥线索,开御剑扫了 一下,也没扫出来啥东西
看了别人的wp,说能扫出来一个index.phps,可以看到源码(看来是我的御剑字典不够强大)
我去查了一下phps文件:
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。
回来看代码,页面中的代码明显不全,查看网页源代码
if(“admin”===$_GET[id])
{
echo("<p>not allowed!</p>");
exit();
}
这里要使admin===id不成立,才能继续执行下面的代码
$_GET[id] = urldecode($_GET[id]);
用get方式传入id,urldecode函数进行一次解码
if($_GET[id] == “admin”)
{
echo “<p>Access granted!</p>”;
echo “<p>Key: xxxxxxx </p>”;
}
如果id==admin为真,就可以得到key
总结一下id需要满足的条件:
第一步:id === admin 为假
第二步:对id进行url解码
第三步:id == admin为真
我们知道PHP中的===为全等号,左右两边必须数据类型和值都相等才为真。而PHP中的 == 会将左右两边的数据类型转换为一致的再进行比较。
id的构建思路:令admin中的一部分字母加密为url编码形式,通过第一步,然后第二步会进行解码,解码后仍为admin,成功通过第三步。
admin的第一个字母为a,我们可以找到a的url编码为61%
安装之前的思路,我们构建pyload为
id=61%dmin
发现没有出现key,说明我们构造的pyload有问题,再次分析发现,我们每次给浏览器传参数时,都会自动进行一次url编码和解码,所以我们的pyload中会被url解码两次,所以我们也要编码两次才行。
利用在线工具再次编码
构造pyload
id=%2561dmin
获得flag
总结:
1.PHP的urldecode函数 进行解码时要考虑到浏览器自身的 解码
2.PHP弱类型判断,== 和 ===的区别
3.有的情况下可以用phps文件类型显示源码