[MRCTF2020]套娃

image-20240523213604915

查看源码发现第一关的相关

补充:

substr_count函数

计算字符串出现的次数。%5f就是”_”的十六进制。

也就是,不能出现下划线的同时,我们要上传23333的同时不能上传23333

你在干什么?,

所以我们使用url编码代替下划线(%20)

再通过%0a构造23333%0a去绕过preg

tips:preg函数忽略行尾的%0a,但是%0a仍然可以发挥效果。

?b%20u%20p%20t=23333%0a

image-20240523214407871

好耶!

那就前往这个网址吧!!

image-20240524191543641

不能进入,要使用本地,我第一个想法就是xff

抓包试试

image-20240524192052256

但是吧,还有一个

Client-Ip:127.0.0.1

试试

有反应了,但不多,我们也可以看到在回显的底下有一串奇奇怪怪的东西

image-20240524192227680

啊?

这是啥?

去查一下

是js代码!!!

震惊!!!!

所以找一个跑js代码的网站试试

image-20240524194114123

所以还要传一个merak上去?

试试

image-20240524194706602

OK了老铁!!!

image-20240524194806704

这里也就是一个绕过,一个是2333,一个是file

首先先看2333

读取文件,对比文件中是否含有那串字符串?

所以这里要使用data伪协议读取file

2333=data://text/plain,todat+is+a+happy+day

之后就是file

主要是前面的change函数,将每个字符都加上i*2

所以,我们直接就是写一个脚本

//逆向代码
<?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;
?>

先把它就是先减一个i*2就行了

flag=ZmpdYSZmXGI=

将这两个一起使用get传上去就好了

但是要注意一点,就是说,要把之前传的post删掉或者直接关掉,否则程序会直接停止。

拿到flag