目录
一,upload-labs靶场搭建和文件上传漏洞的利用说明
upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助网络攻防初学者对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。
文件上传漏洞是一种常见的安全问题,允许攻击者将恶意文件上传到一个网站。这些恶意文件可能是后门、WebShell或其他恶意脚本,一旦上传成功,攻击者就能够执行服务器端的代码,从而完全控制受害的网站或服务器。
靶场项目地址为:upload-labs-Githubhttps://github.com/c0ny1/upload-labs/releases/tag/0.1
这里给出的项目是自带phpstudy环境的,可以一键搭建使用,下面是搭建教程:
首先进入 https://github.com/c0ny1/upload-labs/releases/tag/0.1 项目中,点击.7z结尾的文件下载
下载完成后解压下载得到的 .7z 结尾的压缩文件,得到一个文件夹
先双击 modify_path.bat 文件自动修改配置
然后双击 phpStudy.exe 运行程序
然后点击启动,Apache后面的红色框变为绿色即代表启动成功
然后来到浏览器,在地址栏输入http://127.0.0.1或http://localhost即可访问靶场
至此,upload-labs靶场搭建成功!
靶机包含漏洞类型如下:
判断文件上传漏洞类型的方法
在Web开发中,文件上传功能是一个允许用户将文件(例如图片、文档)上传到服务器的常见特性。为了确保安全和数据一致性,通常需要在这个过程中实施前端验证和后端验证。这两种验证机制的目的是确保上传的文件符合预定的要求和安全标准。
前端验证
前端验证,也被称为客户端验证,是在用户的浏览器中执行的。这通常涉及到JavaScript及其他客户端技术,用以在用户提交文件之前检查文件。它的主要优点是用户体验;由于验证在用户设备上完成,因此可以即时给出反馈,而不需要等待服务器响应。
前端验证通常包括以下检查:
- 文件大小:确保上传的文件不超过服务器设置的最大文件大小限制。
- 文件类型:检查文件扩展名或MIME类型,确保只有允许的文件类型可以上传。
- 文件名:防止非法字符或敏感数据被包含在文件名中。
- 图像尺寸:特别是对图像文件,可以检查其尺寸符合特定要求。
虽然前端验证可以提高用户体验并减少服务器收到无效请求的次数,但不能保证安全,因为攻击者可以绕过前端验证(例如,禁用JavaScript或使用工具构造HTTP请求)。
后端验证
后端验证,在服务器端进行,是安全措施的关键。当文件上传到服务器后,后端代码(如PHP、Node.js、Java等)会对文件进行一系列检查,以确保文件符合安全和业务逻辑标准。
后端验证通常包括以下检查:
- 文件大小:和前端类似,但是在服务器端再次验证是必不可少的安全措施。
- 文件类型:通过检查文件的实际内容(比如文件的魔数/签名)来确定其类型,而不只是依赖于扩展名,因为扩展名可以被伪造。
- 文件内容:扫描文件内容,确保没有恶意代码或不合规的数据。
- 用户权限:验证上传文件的用户是否有足够的权限进行该操作。
后端验证是防止恶意文件上传和其他上传相关安全威胁的最后防线。即使前端验证被绕过,后端验证也应能够阻止不安全的文件上传到服务器。
upload-labs靶场的每一关看起来是这样的
可以查看每一关的源码,通过分析源码我们可以得到每一关的验证和过滤机制,判断漏洞类型
如果实在没有思路,也可以点击查看提示
二,一句话木马介绍
在开始打靶场之前,我们先来介绍一下一句话木马。
一句话木马(One-liner Trojan 或 Webshell)是一种常见的网络安全攻击工具,通常用于Web服务器的非法控制。它称为“一句话”,因为攻击者只需在目标服务器上的一个可访问的Web页面中植入一小段代码,就可以实现对服务器的远程控制。
这种木马通常以PHP、ASP、JSP等服务端脚本语言的形式出现,因为这些语言能够在服务器上执行。一句话木马的代码很简短,但功能却非常强大,能够接收远程命令并在服务器上执行这些命令。
例如,一个PHP语言的一句话木马可能看起来像这样:
<?php @eval($_POST['password']); ?>
在这个上下文中,'password' 实际上并不指代传统意义上的密码,而是一个参数名称,用于传递执行代码到服务器上的一句话木马。一句话木马是由攻击者植入的恶意代码,通常隐藏在一个合法的服务器文件中。攻击者通过发送HTTP POST请求,并在请求体中包含'password' 参数来传递他们想要执行的代码。
举例来说,攻击者可能会发送一个包含如下数据的POST请求:
password=phpinfo();
在服务器端,`$_POST['password']` 会接收到 `phpinfo();` 这段PHP代码。然后,当服务器上的一句话木马执行 `eval($_POST['password']);` 时,它会执行 `phpinfo();` 函数,这会导致服务器显示出PHP的配置信息。
这个参数名称 'password' 在这里只是用作远程传递代码的一个占位符,并不是用作身份验证。攻击者通常会选择一个不太引人注意的参数名,以避免激起安全软件或管理员的怀疑。在实际攻击中,攻击者可能会选择任何名称作为参数,不一定是 'password'。
在这个例子中,`$_POST['password']`是攻击者通过HTTP POST请求发送的代码或命令。`eval`函数会执行这些代码,这就允许攻击者远程执行任何他们想在受感染服务器上运行的PHP代码。
一旦一句话木马被上传并植入到Web服务器,攻击者就可以通过Web请求与之交互,进行多种恶意操作,比如:
- 数据窃取:访问数据库,盗取敏感信息。
- 网站篡改:修改网站内容或数据库。
- 服务器控制:作为跳板进一步渗透内网,安装更多的恶意软件。
- 建立后门:长期控制和访问服务器。
- 分布式拒绝服务 (DDoS) 攻击:利用服务器作为攻击其他目标的资源。
由于一句话木马非常隐蔽,且通常体积很小,因此很难被发现。它们可能会通过各种方式被上传到服务器,例如利用文件上传漏洞、开发者的错误配置、甚至是通过第三方组件的安全漏洞。
为了防御一句话木马,可以采取以下措施:
- 使用文件上传白名单,只允许特定类型的文件上传。
- 设置合适的文件权限,避免服务器上的文件被恶意修改。
- 定期更新和打补丁,修复已知的安全漏洞。
- 使用Web应用防火墙 (WAF) 或其他入侵检测系统来识别和阻止木马活动。
- 定期进行安全审计和代码审查。
- 对上传的文件进行扫描,检查可能的恶意代码。
总的来说,一句话木马是一个非常危险的安全威胁,需要网站管理员和安全专业人员保持警惕,并采取适当的安全措施来防范
简而言之,我们需要做的,就是借助各种工具,想尽一切方法,绕过靶机的前段和后端验证,上传一句话木马到服务器中并使服务器成功执行,然后使用命令执行的方法获得控制权限,找到有用的信息,在CTF比赛中,这个信息通常被称为flag。
三,upload-labs 1-20关详解
请注意,由于upload-labs是每一关共享一个上传文件夹,所以我们每做出来一体,都需要清空上传文件,不然做下一题的时候之前的一句话木马依然在生效,避免混淆!
Pass01(前端验证)
那么首先第一步,我们当然是先要判断它是什么验证,根据做题顺序,我们先上传一个普通的一句话木马文件上去试一下。
首先写好一个一句话木马,保存为yjh.php
这里解释一下,这里的一句话木马是第二行的<?php @eval($_POST['shell']);?>部分,那么为什么要在第一行加一个GIF89a呢?
GIF89a
是一种图像文件格式的标识符,用于指示该文件是按照GIF(Graphics Interchange Format)标准的89a版本编码的。
将GIF89a
添加到一句话木马代码的前面是一种常见的逃避安全检测和限制的技术。这种方法被称作“文件签名伪装”或“文件类型混淆”。在这种情况下,攻击者目的是为了让包含恶意代码的文件看起来像是一个合法的GIF图像文件。
使用GIF89a还有一个好处,当我们成功上传木马文件后,我们可以先访问一下那个木马文件,即在URL后加上木马文件的上传路径和文件名。如果木马文件被成功上传并执行,那么那个访问那个文件就只会回显GIF89a。因为后面的一句木马已经被服务器执行了。
将这个一句话木马上传到靶场
像这样很快的在浏览器中显示不允许上传的弹窗,并没有响应的情况下,就是属于客户端验证,即前段验证。
首先我们要知道,包含着我们上传的文件的数据包,方向是:本地浏览器→公网→服务器。如果是本地服务器,例如我们搭建的upload-labs靶场就是在电脑本地上的服务,那么方向就是:浏览器→本地服务器。
这里前段验证的意思是数据包中的恶意木马文件在浏览器中就被JavaScript识别拦截了,我们可以在前段代码中看到拦截逻辑,CTRL+U可以查看网页前段源代码:
红色框中的代码便是前段验证逻辑,JavaScript会自动识别上传文件的类型,阻止除了后缀名为.jpg|.png|.gif(三种都是图片文件)以外的文件上传。
我们这里有两种解题方法
第一种是最简单直接的,浏览器不是使用JavaScript检查文件类型吗,在浏览器中,我们通常可以将JavaScript直接禁用,那它不就检查不了了文件类型了吗。
首先,在上传页面按功能键F12打开调试,点击右上角三个小点,然后点击设置
找到并勾选禁用JavaScript选项
然后重复上传步骤,上传一句话木马
点击上传后无报错,并且返回了一个图片元素框
我们可以验证一下上传成功没有,右键图片框,复制链接
显示GIF89a,说明一句话木马文件成功上传,并且其php语言的木马内容
<?php @eval($_POST['shell']);?>
成功被服务器执行。
中国蚁剑安装配置使用教程
还有一种验证方法,中国蚁剑。中国蚁剑的安装和配置可以参考这两篇文章:
中国蚁剑安装教程_中国蚁剑密码-CSDN博客
安装好以后,打开中国蚁剑工具,添加一个新的数据
URL地址就是靶机地址http://localhost加上图片存放路径/upload/yjh.php
连接密码就是上传的一句话木马中的参数名,我这里的是shell
点击测试连接,右下角显示连接成功
第二种绕过上传的方法,我们可以通过修改数据包的方式,欺骗JavaScript验证机制。
Burpsuite专业版激活安装配置
这里修改数据包所使用的工具为Burpsuite,Burpsuite抓包工具的安装和配置教程可以参考我的这篇文章:
既然JavaScript是前段验证,那么我们可以将一句话木马文件的.php后缀修改为.jpg,绕过前段验证,然后拦截这个数据包,将.jpg修改回.php就可以
首先,写一个一句话木马yjh.php,将文件后缀名改为yjh.jpg
然后来到Burpsuite内置浏览器,打开靶机地址,开启拦截
上传刚刚写的yjh.jpg
可以看到,yjh.jpg已经成功绕过客户端的限制,Burpsuite抓取到了上传的数据包。
但是.jpg文件是不会被服务器执行的,因此,我们需要拦截数据包将.jpg修改为.php。
然后点击放行或者关闭拦截,可以观察到浏览器中的回显。
同样,直接访问验证
蚁剑连接验证
upload-labs靶场是可以一键查看源代码的,所以我们可以点击显示源码来看看它的验证机制
因为这题是前段验证,所以我们可以看到源码中的的检查代码和前面网页源代码中一致
本题完。
Pass02(MIME验证)
同样,我们先来判断它的验证类型是什么,上传一个正常的一句话木马。
点击上传提示文件类型不正确,而且是响应之后显示文件类型不正确,网页源代码中也没有任何前段验证代码,所以这道题的类型为后端验证。
首先我们要知道,数据包中控制文件类型的数据是什么。我们先抓取这个yjh.php的上传数据包分析一下。
MIME类型(多用途互联网邮件扩展类型),是一种标准,用来表示文档、文件或字节流的本质和格式。这个标准在互联网上广泛应用,最初是为了解决电子邮件中文档的不同数据格式问题而设计的,后来它的应用扩展到了HTTP协议中,用于定义网络中传输数据的类型。
MIME类型在HTTP协议中通过Content-Type
头部字段来指定,格式通常为类型/子类型
,例如:
text/html
:表示HTML格式的文本文档image/jpeg
:表示JPEG格式的图片application/json
:表示JSON格式的数据audio/mpeg
:表示MP3或其他MPEG音频video/mp4
:表示MP4视频文件
服务器在发送响应时会包含Content-Type
头部,以告诉客户端如何处理接收到的数据。浏览器或其他客户端接收到数据后,会查看Content-Type
头部,然后决定使用正确的处理器或应用程序来打开内容,比如说,一个媒体播放器、文本编辑器或者是内置于浏览器中的某些功能模块。
所以,这里我们要做的事情就是修改Content-Type
后面的数据,告诉服务器,这是一个图片文件,以达到欺骗服务器的目的。
点击关闭拦截,会自动放行修改过的数据包。
浏览器正常回显图片框
复制图片地址,打开试试看
已经上传成功了,并且一句话木马被服务器成功执行
蚁剑连接,测试连接试试看
看看它的文件上传处理脚本的源代码吧:
以下是这段代码的解释:
1. 定义两个变量`$is_upload`和`$msg`,分别用来标记是否上传成功和存储可能出现的消息提示。
2. 通过`if (isset($_POST['submit']))`检查是否有表单提交动作。`$_POST['submit']`通常来自一个按钮元素,当用户点击这个按钮时,表单会提交。
3. `if (file_exists(UPLOAD_PATH))`检查定义的`UPLOAD_PATH`目录是否存在。这里`UPLOAD_PATH`应该是一个常量,需要在脚本中事先定义,代表文件应该上传到的目标目录。
4. 接下来的`if`语句检查上传的文件类型是否为JPEG, PNG或GIF图片。`$_FILES['upload_file']['type']`包含了文件的MIME类型,这是通过文件上传处理时浏览器提供的。
5. `$temp_file = $_FILES['upload_file']['tmp_name']`从全局`$_FILES`数组中获取临时文件的路径。`$_FILES`数组是用来访问通过HTTP POST方法上传的文件的。
6. `$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']`设置上传文件的最终保存路径,`$_FILES['upload_file']['name']`是上传文件的原始名称。
7. `move_uploaded_file($temp_file, $img_path)`尝试把临时文件移动到目标路径。如果成功,`$is_upload`将被设置为`true`。
8. 如果`move_uploaded_file()`失败,则设置`$msg`为'上传出错!'。
9. 如果上传的文件类型不是JPEG, PNG, 或GIF,则`$msg`会被设置成'文件类型不正确,请重新上传!'。
10. 如果`UPLOAD_PATH`目录不存在,则`$msg`会提示需要手动创建。
本题完。
Pass03(后缀黑名单绕过)
上传一个正常的一句话木马,判断一下验证类型
响应后返回提示不允许上传.asp,.aspx,.php,.jsp后缀文件!
且查看网页源代码中并没有前端验证机制,所以可以判断这道题是后端验证
提示无法上传.php结尾的文件,但我们的一句话木马本身就是php脚本,如果不是.php结尾,那么服务器就无法执行。我们要上传php脚本,但服务器不让我们上传.php结尾的文件,那不就进死循环了吗?
别急,php脚本不一定要.php结尾。只需要我们上传的一句话木马能被服务器解析为php语言执行就行了,管它是什么后缀呢!
其实这道题考察的是黑名单后缀绕过
从提示中我们可以看到,限制了.asp,.aspx,.php,.jsp四种后缀
PHP是一种广泛使用的开放源代码的服务器端脚本语言,主要用于Web开发。默认情况下,PHP文件具有`.php`扩展名,但是服务器可以被配置为接受其他文件扩展名作为PHP文件来处理。以下是一些可能被服务器配置为识别并解析为PHP脚本的文件扩展名:
1. **.php** - 这是最常见的PHP文件扩展名。
2. **.php3** - 早期的PHP版本使用的扩展名。
3. **.php4** - 用于PHP 4.x系列。
4. **.php5** - 用于PHP 5.x系列。
5. **.php7** - 用于PHP 7.x系列。
6. **.php8** - 用于PHP 8.x系列。
7. **.phtml** - 这是PHP混合HTML文件使用的另一个旧扩展名。
8. **.phps** - 用来显示源代码的高亮显示而不是执行它。
9. **.html** or **.htm** - 有时服务器被配置为执行嵌入在HTML文件中的PHP代码。
10. **.inc** - 有时用于包含文件,但这不是一个安全做法,因为它可能会暴露敏感代码。
服务器需要通过修改配置文件来支持上述其他扩展名。对于Apache服务器,这通常在`.htaccess`文件中或者直接在主配置文件`httpd.conf`中,使用`AddType`和`AddHandler`指令来完成。对于Nginx服务器,可以在`nginx.conf`中通过设置`location`块并使用`fastcgi_pass`指令来处理。
在Apache HTTP 服务器的配置中,`AddType` 指令用于将特定的 MIME 类型与文件扩展名相关联。
这是upload-labs默认的httpd.conf文件的配置
AddType application/x-httpd-php .php .php3 .phtml
这条指令告诉Apache服务器,应该将扩展名为 `.php`、`.php3` 和 `.phtml` 的文件作为 `application/x-httpd-php` 类型来处理。这通常意味着这些文件将被认为是PHP脚本,并且当这些文件被请求时,它们将由PHP处理器处理。
当然你也可以将其他扩展名,例如.php4 .php5 .php7等添加到配置文件中保存,就像这样:
修改后保存,然后去phpstudy重启Apache,这样,.php4 .php5 .php7结尾的文件中的php代码也会被服务器执行
什么,你问我做题的时候你怎么知道黑名单中都过滤了哪些后缀,哪些后缀可以被服务器当做php脚本,抱歉,你只能一个一个试了。
这里我们用phtml试一试,将yjh.php修改为yjh.phtml,然后上传
正常返回了图片元素框
复制地址打开看看,可以看到只有GIF89a,说明php脚本一句话木马被服务器成功解析执行
蚁剑连接有效
当然,也可以上传yjh.php,使用Burpsuite抓包修改为yjh.phtml
将yjh.php修改为yjh.phtml,然后关闭拦截或者放行
同样正常回显图片元素框
我们复制图片地址的时候,可以看到URL为http://localhost/upload/202404171218184524.phtml ,正常的应该是http://localhost/upload/yjh.phtml,说明服务器后端还修改了我们文件的名字,将原先的文件名使用日期来代替了。
我们来看看服务器后端负责文件上传处理的脚本源码:
源码分析
这段PHP代码是一个处理文件上传的脚本。让我们逐步分析这个脚本的作用。
1. 初始化变量`$is_upload`为`false`和`$msg`为`null`。这两个变量分别用于跟踪上传状态和存储消息。
2. 检查是否有POST请求,并且这个POST请求中是否包含了名为`submit`的字段。如果存在,代表用户提交了表单。
3. 使用`file_exists`函数检查`UPLOAD_PATH`常量所指定的目录是否存在。这个常量应该在其他地方定义,用来指定上传文件保存的目录。
4. 定义一个数组`$deny_ext`,其中包含不允许上传的文件扩展名。在这个例子中,`.asp`、`.aspx`、`.php`和`.jsp`文件是不允许上传的,因为它们可能被用来上传恶意脚本到服务器。
5. 获取上传文件的名字,并使用`trim`函数移除文件名末尾的点。`deldot`函数的实现在代码段之外,它可能用于移除文件名末尾的不必要的点字符。
6. 使用`strrchr`函数获取文件名中最后一个点`.`后面的字符串,即文件的扩展名。
7. 转换扩展名为小写,并去除可能存在的`::$DATA`字符串。这个字符串可能与NTFS文件系统的流有关,其存在可能是为了防止一种特定的上传攻击。
8. 使用`trim`函数去除扩展名两边的空格。
9. 使用`in_array`函数检查文件扩展名是否在禁止上传的列表中。如果不在,继续处理上传。
10. 获取上传文件的临时路径。
11. 设置最终保存上传文件的路径,文件名由当前日期时间和一个随机数组成,以避免文件名冲突。
12. 使用`move_uploaded_file`函数将文件从临时目录移动到指定的上传目录。如果移动成功,则将`$is_upload`设置为`true`;如果移动失败,则设置`$msg`为错误消息。
13. 如果文件扩展名在禁止上传的列表中,则设置`$msg`为相应的错误消息。
14. 如果`UPLOAD_PATH`所指定的目录不存在,则设置`$msg`为错误消息。
本题完。
Pass04(.htaccess文件绕过)
先尝试直接上传一个普通的一句话木马
显示此文件不允许上传,这道题并没有提示不允许上传什么后缀的文件,经过尝试,基本上所有后缀能够被解析为php语句执行的文件都不能成功上传。试试正常的图片能不能上传:
可以看到,图片是可以正常上传的:
我们再来试试图片马能不能正常上传,所谓图片马,就是把木马病毒写到图片内容中,也就是带有木马内容的图片或是以 .png 或 .jpg 结尾的文件,但是文件内容是一句话木马,或其他的木马病毒。
首先,创建一个 yjh.txt ,将一句话木马编辑到文件中然后保存。
然后在文件夹中将 yjh.txt 改为 yjh.png ,我们的一句话木马图片码就算做好啦。
此时,如果我们右键 yjh.png ,然后选择在记事本中编辑,是可以看到一句话木马的。
接下来看看这个图片马能不能传上去,经过测试,这个带有一句话木马的 yjh.png 文件时可以成功上传的。但我们直接使用蚁剑连接它肯定是连不上的,因为它的后缀是.png,其中的一句话木马语句是php语言,是无法被服务器正常识别并执行的。
既然图片马可以传上,那么我们的思路就清晰了。这道题的考点是.htaccess文件绕过。htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
通俗点来说,在文件上传类型的题目中,我们就是要利用这个文件,修改服务器的配置,让服务器将文件内容符合php语法的.png结尾的文件解析为php语言去执行。
首先,创建一个.htaccess文件(文件名必须一致),文件内容为:
SetHandler application/x-httpd-php
这句代码的意思就是告诉服务器,将目录下所有符合php语法的文件内容当做php脚本执行,不管它是什么后缀。
然后将 .htaccess 文件上传到靶机中,修改服务器配置。
上传成功
右键复制图片链接访问试试看,可以看到403报错,403是无法查看文件的状态码,是存在这个文件,但是无权查看。并不是没有这个文件,如果直接的话没有就是404报错。
然后我们之前传的图片马应该就起作用了,再访问试试看,如果访问不了,请重新上传之前的图片马 yjh.png。
可以看到上传成功后的一句话木马被服务成功执行了。
蚁剑连接测试
我们来审计一下源码:
可以看到,如我们猜想,黑名单中几乎所有的能够被解析为php的后缀都被过滤了。
从这里我们也可以收集一个知识点,那就是以后遇到黑名单验证,在过滤不完整的情况下,我们可以尝试一下这里黑名单中的各种后缀名如下所示:
".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"
然后我们来分析一下这个脚本吧:
文件类型限制
- 通过
$deny_ext
数组定义一系列不允许上传的文件扩展名。这些扩展名主要包括了多种不同版本的PHP文件(如.php
,.php5
,.php4
等),HTML文件(如.html
,.htm
等),以及其他可以执行的Web脚本文件扩展名(如.jsp
,.asp
,.aspx
,.swf
等)。 - 它的目的是阻止用户上传可能包含恶意代码的文件,这些文件若被服务器执行,可能会给服务器安全带来严重威胁。
文件名处理
- 使用
trim
函数删除文件名末尾的点(.
)。这是为了避免绕过文件类型的检查。 - 采用
strrchr
函数抽取文件名中最后一个.
之后的所有字符作为文件扩展名,并通过strtolower
转换成小写,确保大小写不会影响扩展名的判断。 - 使用
str_ireplace
去除文件扩展名中可能的::$DATA
字符串。这是一种特定的NTFS文件流技术,通过它可能会绕过一些简单的文件类型检测。
文件上传条件
- 检查
UPLOAD_PATH
定义的目录是否存在,如果不存在,则给出提示信息。这是一个基本的检查,确保文件有一个正确的存储位置。 - 如果目标文件的扩展名不在禁止列表
$deny_ext
中,那么尝试将文件从临时位置移动到指定的上传路径。使用date("YmdHis").rand(1000,9999)
生成的字符串为文件名,加上原始文件扩展名,这减少了文件重名的可能性,并为每个上传的文件提供了一定程度上的匿名性。 - 如果文件移动成功,
$is_upload
将被设为true
,表示上传成功;否则,将给出上传出错的提示信息。
本题完。
Pass05(大小写绕过)
上传.htaccess文件发现无法上传,看看提示
可以看到,.htaccess文件被过滤了,我们来查看一下源码
对比第四关的源码可以发现,第五关的源码没有把字符强制转换为小写的语句:
$file_ext = strtolower($file_ext); //转换为小写
在这行代码中,strtolower
函数被用于将变量$file_ext
所包含的字符串转化为全小写。
所以,这道题是可以直接通过修改文件名为大写来绕过限制的。
这里我们就直接通过Burpsuite抓包修改文件名了。
将 yjh.php 修改为 yjh.Php 。由于第五关的脚本并没有做大小写限制,所以这里可以非常容易的绕过限制,达到上传成功的目的。
放行后正常回显图片元素框
复制图片地址访问,正常回显GIF89a标识内容。
蚁剑测试连接成功
总结一下:
这题就是服务器没有对上传文件的名称大小写进行限制,从而导致大小写绕过漏洞,攻击者可以通过替换文件名为大写绕过对.php的限制上传恶意代码。
本题完。
Pass06(空格绕过)
查看源码,发现这题没有对文件后缀名进行首尾去空的操作。
第四关中对文件后缀进行首尾去空的代码为:
$file_ext = trim($file_ext); //首尾去空
这一行代码使用了PHP的trim
函数对变量$file_ext
所存储的字符串进行处理。trim
函数的作用是去除字符串首尾的空白字符(包括空格、换行符、制表符等)
所以这里可以通过对文件后缀名末尾进行添加空格的方式来进行绕过。
因为Windows特性,在文件资源管理器中对后缀名添加空格的操作是不允许的,所以这里我们依旧需要使用Burpsuite抓包修改。
抓包后在 yjh.php 后添加空格,然后放行。可以成功上传。
访问后正常回显
蚁剑连接测试成功
总结:这道题就是服务器没有对上传文件进行空格删除筛查,攻击者可以利用这一漏洞,对上传文件进行在后缀名中添加空格的操作绕过文件上传类型审查,达到上传恶意代码的目的。
本题完。