解题步骤:
打开靶场地址,显示如下:
查看网页源代码,没有发现特殊内容,扔进御剑去扫描,也没扫出有用的信息(字典不够强大)。上网搜索一番,发现本题的解题思路跟题目有关,题目是PHP2,这里的PHP2不是指的1997年发行PHP2.0版本,而是隐含着解题的关键信息:2在英语中是复数,跟在名词后面一般要加s,所以这里的PHP2就隐含着PHPS,phps的信息如下:
说简单点就相当于存储着php源码的txt文件,phps只在人为设置后存在,index.phps就表示index.php的源码,所以当我们在url中加上index.phps,再次访问就会看到index.php的源码:
需要注意的是phps在Firefox浏览器中无法正常显示,可以使用Chrome浏览器。接下来对源码进行分析:
<?php
if("admin"===$_GET[id]) { //此处的作用是通过GET方式传入的id参数如果等于"admin",则返回not allowed!,这里只验证admin这个字符串,可以用其他方式绕过
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]); //这里的将传入的id参数进行url解码,浏览器解码一次,这里解码一次,相当于一共要进行两次url解码
if($_GET[id] == "admin") //如果解码后的id参数等于"admin"这个字符串,则输出key即flag。
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
分析完源码之后我们就要开始构造payload,源码要求我们让传入的id参数在经过两次url解码之后等于admin
这个字符串,所以反过来想,我们在构造payload时只需对admin
这个字符串进行两次url编码即可。
最后得到字符串%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45
,构造payload为?id=%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45
,在浏览器中打开,得到flag:
xctf{a6b0edc17473ba4cc0f0f83ccb6964d0}