ISCTF-2024-自由复现

1z_php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
highlight_file('index.php');

#一句话木马,神神又奇奇

if(isset($_POST['J'])){
$call=$_POST['J'];
$dangerous_commands = ['cat', 'tac', 'head', 'nl', 'more', 'less', 'tail', 'vi', 'sed', 'od'];
foreach ($dangerous_commands as $command) {
if (preg_match("/$command/i", $call)) {
die("这些个危险函数可不兴使啊");
}
}
system($call);
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
'cat', 'tac', 'head', 'nl', 'more', 'less', 'tail', 'vi', 'sed', 'od'

cat 查看,不仅仅是产看
tac 倒序输出,从第一行第二行第三行到第三行第二行第一行
head 查看前几行,默认是前10
tail 查看末尾几行,默认是前10
nl(number line) 输出每一行,并为每一行前面加上这一行的行号
more less 逐页查看,每次只查看一页
vi vim sed 都是文本编辑器
od -x 十六进制输出 od -c ASCII码输出 od 八进制输出

好了讲了一堆被过滤的。。

下面介绍绕过方法

  1. c''at /f14g ''在bash中会被解释为空字符串,当flag被禁时也可以用
  2. ca/t /f14g
  3. grep { /f14g grep是用来查找字符串的,在这里我们查找{他会输出含有{的那一行
  4. strings /f14g strings会提取文件中的可打印字符
  5. cp /f14g /var/www/html/index.php 将/f14g的内容拷贝到index.phpindex.php的内容会被覆盖

UP!UPloader 文件上传与包含

首先介绍一下文件包含漏洞

关键的配置
远程文件包含漏洞与php://input的利用条件较为苛刻,要求allow_ur_include打开,但是在默认状态下这是关闭的

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$file =$_GET['file'];
include($file);
?>

include()
include_once()
require()
require_once()

include()和require()的区别:
require()如果在包含过程中出错,就会直接退出,不执行后续语句
require()如果在包含过程中出错,只会提出警告,但不影响后续语句的执行

读取文件的内容采用php伪协议

file=php://filter/read=convert.base64-encode/resource=xxx.php

这里的xxx.php可以为相对路径,也可为绝对路径


在这道题目中,我们任意上传有一个文件,会提示

文件上传成功!不过文件路径可不好找呀~什么?什么include.php?我不知道啊。

进入include.php尝试包含upload.php:php://filter/read=convert.base64-encode/resource=upload.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
error_reporting(0);
$file = $_FILES['file'];
if (isset($file) && $file['size'] > 0) {
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$name = pathinfo($file['name'], PATHINFO_FILENAME);
$dir_name = $name . '.' . $ext;
$upload_dir = './uploads/'; //当前路径的文件夹
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0755, true);
}
if (move_uploaded_file($file['tmp_name'], $upload_dir . md5($dir_name) . '.' . $ext)) {
echo "文件上传成功!不过文件路径可不好找呀~什么?什么include.php?我不知道啊。" ;
} else {
echo "文件存储失败,未知原因......";
}
die();
}
?>uploads/
会将文件名进行md5加密重命名放到当前路径的/uploads/文件夹中,

会将文件名进行md5加密重命名放到当前路径的/uploads/(./表示当前路径)文件夹中,即可得解

小蓝鲨的秘密

访问发现跳转`https://www.bluesharkinfo.com/`可能为302跳转,Location即为跳转的地址,但是不知道为什么bp抓不到一开始的包,但是可以现在浏览器打开network页面,再访问网站,监控流量,再或者我们使用curl访问,或者是python的requests库脚本

小蓝鲨的故事

python flask 客户端session伪造,不再赘述,可看p牛博客

https://www.leavesongs.com/PENETRATION/client-session-security.html

ezserialize

php反序列化,很久没有手搓过链子了,康复训练一下
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
38
39
40
41
42
43
44
45
46
47
48
49
<?php
error_reporting(0);

class Flag {
private $flag;

public function __construct() {
$this->flag = file_get_contents('/flag');
}

public function getFlag() {
return $this->flag;
}

public function __toString() {
return "You can't directly access the flag!";
}
}

class User {
public $username;
public $isAdmin = false;

public function __construct($username) {
$this->username = $username;
}

public function __wakeup() {
if ($this->isAdmin) {
echo "Welcome, admin! Here's your flag: " . (new Flag())->getFlag();
} else {
echo "Hello, " . htmlspecialchars($this->username) . "!";
}
}
}

if (isset($_GET['data'])) {
$data = $_GET['data'];

$object = unserialize($data);
if ($object instanceof User) {
echo $object;
} else {
echo "Invalid object!";
}
} else {
highlight_file(__FILE__);
}
?>