文件上传
文件上传
为什么文件上传存在漏洞
上传文件时,如果服务器端代码未对客户端上传的文件惊醒严格的验证和过滤,就容易造成可以上传任意文件的情况,包括上传脚本文件。
非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这恶意的脚本文件称为WebShell,也可以将它称为一种网页后门。
什么是CMS?
CMS(Content Management System,内容管理系统)是一种用于创建、管理和发布数字内容的软件平台。它允许用户(即使没有编程知识)轻松管理网站内容,如文章、图片、视频、产品信息等,而无需手动编写代码。
什么是网站服务器容器?
网站服务器容器是指用于托管和运行Web应用程序的软件环境,通常包括 Web服务器、运行时环境 和 依赖库。它们可以是传统的服务器软件,也可以是现代容器化技术(如Docker)中的轻量级虚拟化环境。
核心需求:处理HTTP请求响应。
什么是解析漏洞?(看网站平台)
解析漏洞 是指由于 服务器或应用程序对文件解析逻辑存在缺陷,导致攻击者可以通过精心构造的文件绕过安全限制,从而实现恶意操作(如执行任意代码、获取敏感信息等)。这类漏洞常见于 Web服务器、文件上传功能、内容管理系统(CMS) 等场景
为什么会出现?
- 文件解析逻辑错误(只检测扩展名但未检查实际内容)
- 服务器配置缺陷 (web服务器或中间件的错误配置,导致非脚本文件被当作代码执行)
- 文件内容混淆 (攻击者在文件头部插入恶意代码绕过内容检测)
常见解析漏洞
IIS 6.0
/xx.asp/xx.jpg "xx.asp是文件夹名"
IIS 7.0/7.5
默认Fast-CGI开启,直接在url中图片地址后面输入/1.php,会把正常图片当php解析
Nginx
版本小于等于 0.8.37,利用方法和 IIS 7.0/7.5 一样,Fast-CGI 关闭情况下也可利用。
Apache
上传的文件命名为:test.php.x1.x2.x3,Apache 是从右往左判断后缀
lighttpd
xx.jpg/xx.php
什么是Token?
why?传统Session需要在服务器存储用户状态,而Token(如JWT)可自包含用户信息,减轻服务器压力。
what?一个加密字符串,用于验证用户身份或授权访问资源。
how?用户登录后,服务器签发Token(如JWT),客户端存储Token(通常存于Cookie或LocalStorage),每次请求在
Authorization头中携带。服务端解密Token并验证签名,无需查询数据库。
.htaccess
.htaccess(Hypertext Access)是 Apache Web 服务器的一个配置文件,它允许你针对特定目录修改服务器配置,而无需访问主配置文件(httpd.conf)。它常用于 URL 重写、访问控制、错误页面定制等。
- 文件类型:纯文本文件,无扩展名
- 生效范围:仅作用于当前目录及其子目录
- 典型用途
- URL 重写(如美化链接
example.com/about→about.php)- 访问控制(禁止 IP、密码保护目录)
- 自定义错误页(404、500 页面)
- 强制 HTTPS/HTTP 跳转
#URL 重写(隐藏 .php) RewriteEngine On RewriteRule ^about$ about.php [L] # 将 /about 指向 about.php #禁止目录列表 Options -Indexes # 防止直接列出目录内容 #强制 HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] #防止恶意文件执行 <FilesMatch "\.(php|phtml)$"> Deny from all # 禁止访问所有 PHP 文件 </FilesMatch> #自定义错误页 ErrorDocument 404 /errors/404.html
什么是一句话木马?
一句话木马的工作原理
- 上传: 攻击者通过漏洞或弱口令,将一句话木马上传到目标服务器。例如,这可能是通过一个不安全的文件上传功能。
- 执行: 一旦木马被上传,攻击者可以通过浏览器访问这个木马文件,执行其中的代码。
- 控制: 一旦代码被执行,攻击者就能够获取对服务器的控制权,可以进行各种恶意操作,比如窃取数据、安装其他恶意软件或创建后门
<?php @eval($_POST['attack']);?>
#利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录。@表示后面即使执行错误,也不报错。eval()函数表示括号内的语句字符串什么的全都当做代码执行。$_POST['attack']表示从页面中获得attack这个参数值。
入侵条件
(1)木马上传成功,未被杀;
(2)知道木马的路径在哪;
(3)上传的木马能正常运行。
php的一句话木马: <?php @eval($_POST['pass']);?>
<?php @eval($_POST['cmd']); ?>
asp的一句话是: <%eval request ("pass")%>
aspx的一句话是: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
中间件问题 (.htaccess)
htaccess 文件是Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向,自定义404错误页面,改变文件扩展名,允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能
AddType application/x-httpd-php .png
名称改为: .htaccess
一句话木马改为: AddType application/x-httpd-php .png
.htaccess修改解析配置文件,借助这个配置让.png的命名文件当作类型application/x-httpd-php执行(php的类型)
文件类型判断
MIME类型
通过文件类型判断文件后缀
媒体类型(MIME)是一种标准,用来表示文档,文件或字节流的性质和格式。
MIME的组成结构非常简单;由类型与子类型两个字符串中间用'/'分隔而组成。不允许空格存在。type表示可以被分多个子类的独立类别。subtype表示细分后的每个类型。
通用的结构为:Content-Type
type/subtype
文件头判断
通过文件头判断文件后缀
gif - GIF89a
后端黑白名单绕过
黑名单:明确不让上传的格式后缀
asp php jsp aspx cgi war
白名单:明确可以上传的格式后缀
jpg png zip rar gif....
::$DATA是什么?
::$DATA是 Windows NTFS 文件系统 的一个特性,表示文件的 数据流(Alternate Data Stream, ADS)。在 PHP 文件上传中,如果文件名包含::$DATA,可能是由于 文件上传漏洞 或 恶意构造的文件名 导致的。malicious.php::$DATA → 实际存储为 malicious.php(可执行 PHP 文件)
黑名单
-
无递归安全问题:只检测一次,没循环
pphphp = php -
大小写(windows不敏感)
phP,PHP -
文件路径后添加
a.asp%00,00为截断符,该方法只适用于magic_quotes_gpc = Offphp版本小于5.3.400截断 是%00解码结果
url上面 %00 (自动解码一次)
post 下面 %00(手工解码一次)
![image-20250610164858517]()
白名单
-
条件竞争是指一个系统的运行结果依赖于不受控制的事件的先后顺序。
逻辑缺陷
错误:先上传,后面判断,处理逻辑
正确:先判断,后上传
访问即创建代码
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>-
fopen('xiao.php', 'w'):以“写入”模式打开名为xiao.php的文件。如果该文件不存在,则会创建它。 -
fputs(...):将一段字符串内容写入到由fopen打开的文件中。 -
'<?php eval($_REQUEST[1]);?>'这是要写入的内容,是一个 PHP 脚本。它的含义是:
eval()` 是一个 PHP 函数,用于执行传入的字符串作为 PHP 代码。
$_REQUEST[1] 是从请求中获取名为 1的参数值(GET、POST 或 COOKIE),然后将其当作 PHP 代码来执行。
-
-
二次渲染
先找一个正常图片,上传导出渲染后的图片
对比保留部分,在保留部分添加后门代码
最后利用提示的文件包含执行图片后门代码
-
目录保存文件名可控
move_upload_file($temp_file,$img_path)保存文件名为
shell.php/.会被当作shell.php


浙公网安备 33010602011771号