💡 导读:如果给你一个网站的后台权限,你能拿到服务器权限吗?很多时候,突破口就在“上传头像”或“上传附件”这个功能上。本期我们将揭秘 Webshell(网页木马) 的奥秘,看看攻击者如何将一张看似无害的图片,变成控制服务器的“特洛伊木马”。
一、 为什么文件上传是“高危漏洞”?
在渗透测试中,文件上传通常是攻击链的最后一环(Get Shell)。
-
SQL 注入:只能偷数据。
-
XSS:只能控制浏览器。
-
文件上传 + 解析漏洞:直接获得服务器的命令行权限(Webshell)。
核心逻辑:网站允许你上传文件 -> 你没有遵守规则上传图片,而是上传了一个包含恶意代码的文件(如 .php) -> 网站错误地执行了这个文件 -> 服务器沦陷。
二、 Webshell:黑客的“遥控器”
Webshell 是一个简单的网页脚本文件,里面只有一行核心代码,但威力巨大。
1. 经典 PHP 一句话木马
创建一个名为 shell.php的文件,内容如下:
<?php @eval($_REQUEST['cmd']); ?>
-
@eval():PHP 函数,把字符串当作 PHP 代码执行。 -
$_REQUEST['cmd']:接收用户通过 GET 或 POST 传来的参数cmd。
使用方法:
上传成功后,访问 http://target.com/uploads/shell.php?cmd=system("whoami");
结果:服务器会执行 whoami命令,并返回当前用户权限。这比 RCE 更稳定、更持久。
三、 实战演练:突破上传限制
开发者通常会限制上传文件的类型(MIME Type)和后缀名。但黑客总有办法绕过。
1. 前端 JS 绕过(小儿科)
现象:选择 shell.php时,浏览器立刻弹出“只允许上传图片”。
原因:验证逻辑写在 JavaScript 中,只在客户端执行。
绕过:
-
禁用浏览器 JS。
-
用 Burp Suite 拦截请求,先把文件改成
shell.jpg绕过前端检测,拦截后再把文件名改回shell.php。
2. MIME 类型绕过
现象:后端代码检查 $_FILES['file']['type'] == 'image/jpeg'。
绕过:用 Burp Suite 拦截,修改 Content-Type头:
Content-Type: image/jpeg
即使文件内容是 PHP 代码,只要头是图片类型,就能骗过后端。
3. 文件内容绕过(幻数/GIF89a)
现象:后端检查文件头(Magic Number),如果不是图片格式就拦截。
绕过:在 PHP 代码开头加上 GIF 的文件头。
GIF89a
<?php @eval($_REQUEST['cmd']); ?>
保存为 shell.php,它既是合法的 GIF 图片,又是可执行的 PHP 脚本。
4. 双扩展名绕过
现象:后端禁止 .php后缀。
绕过:
-
shell.php.jpg(Apache 解析漏洞,如果配置不当,可能执行 PHP)。 -
shell.php%00.jpg(利用 %00 截断,经典老漏洞)。
四、 解析漏洞:给黑客递刀子
有时候,文件本身没问题,但服务器配置有问题,导致普通文件被当作代码执行。
1. Apache 解析漏洞(未知后缀)
原理:Apache 从右向左解析文件名。
-
文件:
shell.php.xxx.yyy -
Apache 发现
.yyy不认识,继续向左看.xxx也不认识,直到看到.php,于是把文件当作 PHP 执行。
2. IIS 解析漏洞(分号截断)
原理:IIS 6.0 在处理 ;时有 Bug。
-
URL:
http://target.com/shell.asp;.jpg -
IIS 认为后缀是
.jpg(安全),但实际上执行的是.asp代码。
3. Nginx 解析漏洞(FastCGI)
原理:配置不当导致任意文件被当作 PHP 执行。
-
URL:
http://target.com/image.jpg/.php -
结果:服务器会把
image.jpg当作 PHP 脚本来解析执行。
五、 2026 年新趋势:.htaccess 与 条件竞争
1. .htaccess 覆盖
如果服务器允许上传 .htaccess文件,你可以上传一个内容为 AddType application/x-httpd-php .jpg的 .htaccess文件。
效果:服务器会将所有 .jpg文件当作 PHP 执行。接着你再上传一个包含 PHP 代码的 avatar.jpg,它就变成了 Webshell。
2. 条件竞争(Race Condition)
原理:有些网站逻辑是“先上传,再检查,最后删除”。
攻击:用 Burp Suite Intruder 疯狂上传 shell.php,同时在另一个窗口疯狂访问 shell.php。在服务器还没来得及删除它的那一瞬间,成功访问并执行代码。
六、 防御指南:如何彻底堵死?
-
重命名文件:不要使用用户上传的原始文件名。使用随机数重命名(如
md5(time()).jpg)。 -
限制后缀:使用白名单(只允许
.jpg,.png),坚决不用黑名单。 -
文件内容检测:使用 GD 库或 Imagick 对图片进行二次渲染(重新生成图片),这会杀死所有嵌入在图片里的 PHP 代码。
-
禁止执行权限:将上传目录设置为不可执行脚本(Nginx 配置
location ~* \.(php)$ { deny all; })。
⚠️ 安全警示与法律红线
🚨 最高级别警告:
-
这是犯罪红线:利用文件上传漏洞获取 Webshell 属于严重的非法入侵行为。在中国司法实践中,只要成功上传并执行 Webshell,无论是否造成破坏,极大概率构成 非法控制计算机信息系统罪。
-
严禁上传任何 WebShell:即使在授权测试中,也严禁上传
<?php system($_GET['cmd']); ?>这类完整功能的 WebShell。如需验证,最多使用无害的探针(如<?php echo 'test'; ?>),且测试完毕必须立即删除。 -
靶场环境:请在本地虚拟机(如 DVWA、Upload-Labs)中练习。切勿将测试代码上传至任何云服务器或公网网站。
Webshell 是网络空间的违禁武器。请做一名守护者,而不是破坏者。
💬 互动环节
-
你在挖洞时遇到过最奇葩的上传限制是什么?
-
除了 PHP,你还知道 ASP、JSP 的一句话木马怎么写吗?
-
欢迎在评论区留言讨论!
👉 下一期预告:【高级进阶篇】自动化与智能化 —— 如何用 Python 和 AI 辅助挖掘漏洞?
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/c_program113/article/details/162129399



