upload-labs 笔记

通过参考视频:
upload-labs 通关+知识点教程
总结
attachmen/Pasted image 20250308213417.png

测试代码

<?php phpinfo();?>

一句话木马
attachmen/Pasted image 20250303220711.png

Pass-01 前端 JS 绕过

如何判断是前端过滤还是后端过滤,可以通过 BP 抓包,如果是前端,数据包在客户端就会被拦截,发不到后端,BP 抓不到包的。

方法一:禁用浏览器 js

火狐浏览器禁用 js
attachmen/Pasted image 20250303211909.png

方法二:BP抓包改后缀

将 php 文件后缀改为 jpg,上传 BP 抓包后手动改回 php 即可上传成功
attachmen/Pasted image 20250303212322.png

Pass-02 content-type绕过

测试是否通过 content-type 验证可以先将该代码删除
绕过方法同 Pass-01中方法二

Pass-03 特殊后缀绕过(php3、php5)

查看源代码发现做了黑名单,发现php3、php5没有被禁用,php 文件后缀改 jpg ,BP抓包将后缀改为 php3 ,或者 php5 即可上传成功。
attachmen/Pasted image 20250303213606.png

php3 没有被当作 php 文件进行解析,打开配置文件,httpd-conf
attachmen/Pasted image 20250304124455.png
搜索 addtype 找到类似语句修改

# AddType application/x-httpd-php .php
将上面的语句改为
AddType application/x-httpd-php .php .phtml .php3 .php5 .phtml

让服务器将 .php .phtml .php3 .php5 .phtml文件都作为 php 文件运行

Pass-04 .htaccess 绕过

配置文件的区别作用范围:
.htaccess 文件的作用范围更为局部,它通常位于网站的根目录或特定目录中,并只影响该目录及其子录。每个自录都可以有自已的.htaccess文件。
httpd.conf 文件的作用范围更为全局,它是Apache主配置文件,影响整个服务器。

使用方式:
.htaccess 文件可以通过文本编辑器直接进行修改或创建,且修改后会即时生效,无需重启 Apache服务器。
httpd.conf 文件通常需要管理员级别的权限进行修改,修改后需要重启Apache服务器才能生效

查看源代码发现黑名单中没有禁止 .htaccess 文件上传
.htaccess

// 将 .jpg .txt 文件作为 php 进行解析
AddType application/x-httpd-php .jpg .txt 

将 muma.php ,后缀名修改成 .php,让后分别将 .htaccess 、muma.jpg 文件上传,服务器会将所有 .jpg 文件作为 php 文件进行解析。可通过此上传一句话木马。

也可以通过 copy 命令将图片和 muma.php 进行拼接上传

copy muma.php+1.jpg/b newmuma.jpg

Pass-05 .user.ini 绕过

配置文件详解

.htaccess
作用:分布式配置文件,一般用于URL重写、认证、访问控制等
作用范围:特定目录(一般是网站根自录)及其子目录
优先级:较高,可覆盖Apache:的主要配置文件(httpd-conf)
生效方式:修改后立刻生效

httpd-conf
作用:包含ApacheHTTP·服务器的全局行为和默认设置
作用范围:整个服务器
优先级:较低
生效方式:管理员权限,重启服务器后生效

.htaccess 和 httpd-conf 都是针对 apache 服务器

.user.ini
作用:特定于用户或特定目录的配置文件,通常位于Web应用程序的根目录下。
它用于覆盖或追加全局配置文件(如 php.ini )中的 PHP 配置选项。
作用范围:存放该文件的目录以及其子目录
优先级:较高,可以覆盖 php.ini
生效方式:立即生效

php.ini
作用:存储了对整个 PHP 环境生效的配置选项。它通常位于 PHP 安装目录中
作用范围:所有运行在该 PHP 环境中的 PHP 请求
优先级:较低
生效方式:重启 php 或 web 服务器

加载方式:会首先加载 php.ini/httpd-conf 文件中的配置。然而,如果在某个目录下存在 .user.ini/.htaccess 文件,服务器会在处理请求时检查该目录,并覆盖相应的配置项。

.user.ini 可以生效的前提:
最好大于 5.3.0 ,最好是用7.X版本的长
ServerAPI 为 CGI/FastCGI — — Phpinfo() 查看Server API
(Server API(Application Programming Interface,应用程序编程接口)是一组定义了软件组件之间交互方式的规范。在这种情况下,ServerAPI 是指用于连接和交互的服务器端软件接口。)
.user.ini 文件上传漏洞的前提:
.user.ini 可以生效并且该上传目录有 php 文件

写法:

//这个文件里面只包含php代码,所有 php 代码运行都会包含上 111.txt
Auto-prepend-file = 111.txt

.user.ini 配置文件绕过

前提条件:上传目录存在php文件(readme.php)

.user.ini 配置文件写入

.user.ini 配置项中有两个配置可以起到一些作用
方法一:
auto_prepend_file = <filename>         //包含在文件头
方法二:
auto_append_file = <filename>          //包含在文件尾

attachmen/Pasted image 20250304004614.png

111.php 写入一句话木马,并将后缀名改为 jpg ,然后上传
attachmen/Pasted image 20250304131604.png

然后访问 靶机IP + /upload/readme.php
attachmen/Pasted image 20250304131641.png

蚁剑连接即可

补充:
.user.ini 文件加载有时间间隔,配置文件默认是300秒,可以手动修改成10秒,或者是重启服务器让 .user.ini 文件立即生效。
attachmen/Pasted image 20250304132006.png

搜索 .user.ini ,将时间间隔修改为10秒
attachmen/Pasted image 20250304132101.png

点加空格加点绕过

将 111.php 上传,BP抓包将后缀名改成 111.php+点+空格+点上传,访问 111.php.

Pass-06 大小写绕过

查看源代码发现缺少大小过滤

$file_ext = strtolower($file_ext); //转换为小写

attachmen/Pasted image 20250304010458.png

直接将后缀名改为 .PHP 进行绕过

补充:
php 版本要选择低版本、非 nts
attachmen/Pasted image 20250306154224.png

否则网页会报错
attachmen/Pasted image 20250306154258.png

Pass-07 空格绕过

查看源码发现没有首尾去空格

$file_ext = trim($file_ext); //首尾去空

attachmen/Pasted image 20250304011358.png

BP 抓包在 111.php 后面加上多个空格即可绕过上传

Pass-08 后缀加点绕过

查看源码发现没有删除文件名末尾的点

$file_name = deldot($file_name);//删除文件名末尾的点

attachmen/Pasted image 20250306170341.png

BP 抓包 111.php 后面加 ...... 进行绕过
蚁剑连接的时候把 . 删掉再进行连接

Pass-09 $DATA绕过

前置知识:额外数据流

在WindoWS·操作系统中,当你看到文件名后跟着"::$DATA"时,它表示文件的一个附加数据流(Alternate·DataStream,ADS)。数据流是一种用于在文件内部存储额外数据的机制。

在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是Windows NT 文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加"::$DATA"来访问。

例如,"1.txt"是一个文件,而"1.txt::$DATA"是这个文件的一个附加数据流。这样的数据流可以用于存储文件的元数据、备份信息、标签等。

需要注意的是,大多数常规的文件操作工具不会意识到这些额外的数据流,而只会处理默认的数据流。要访问或操作这些附加数据流,通常需要使用特定的命令行工具或编程接口。

写入方法:
echo·内容·>>文件名数:据流名
attachmen/Pasted image 20250306222926.png

type·文件名>>文件名:数据流名
attachmen/Pasted image 20250306222949.png

查看方法:
notepad·文件名:数据流名
attachmen/Pasted image 20250306223007.png

绕过

没有字符串::$DATA

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

attachmen/Pasted image 20250306223648.png

BP 抓包,在后缀 .php 后面加上 ::$DATA,上传后::$DATA 会被服务器删除,访问 .php 文件,蚁剑连接即可。

attachmen/Pasted image 20250306224455.png

Pass-10 点空格点绕过

文件上传到 window服务器会自动删除后缀后面的点和空格
attachmen/Pasted image 20250306230207.png

BP抓包修改后缀为 .php. . ,上传后访问 .php 文件即可

Pass-11 双写后缀绕过

str_ireplace():函数将黑名单中的后缀替换成空
可以通过双写进行绕过

attachmen/Pasted image 20250307002616.png

BP 抓包,将 .php 后缀改写成 .pphphp ,上传即可。

Pass-12 %00截断

前置知识点:空字符

window 系统中,Null 可以用:0x00、%00 表示

输入:你好 0x00php
系统只能读到 你好,后面的 php 被 0x00 截断了,所以无法读取

0x00、%00 都表示空,一个是编程语言中,一个是 url 中。

url 编码先将 ascii 转为16进制,然后再加百分号。

绕过

直接读取拼接文件存储的临时路径很危险,可以通过 0x00 进行截断
attachmen/Pasted image 20250307005043.png

上传后缀名改为 .jpg 的一句话木马文件,BP 抓包,修改数据包中 save_path 路径为 /upload/111.php0x00
attachmen/Pasted image 20250307011824.png

补充:
00截断的使用条件
1、php版本小于5.3.29
2、magic_quotes_gpc = Off (去php.ini修改就行)

可以在 pass-12 关 index.php 源代码中插入 echo 输出变量方便理解
attachmen/Pasted image 20250307012102.png
attachmen/Pasted image 20250307011851.png

Pass-13 0x00截断

查看源代码,BP拦截数据包,发现路径存到了主体中,不在链接中作为参数传递
attachmen/Pasted image 20250307215002.png

修改 111.php 后缀为 .jpg ,修改上传路径为 /upload/111.php十六进制00,使用十六进制 00 进行截断,成功上传
attachmen/Pasted image 20250307215812.png

Pass-14

前置知识:图片字节标识

JPEG/JFIF(常见的照片格式):头两个字节为·0xFF·0xD8
PNG(无损压缩格式):头两个字节为·0x89·0x50
GIF(支持动画的图像格式):头两个字节为·0x47·0x49
BMP(Windows位图格式):头两个字节为·0x42·0x4D
TIFF(标签图像文件格式):头两个字节可以是不同的数值

字节是计算机中存储和传输数据的基本单位,通常表示为一个八位(8-bit)的二进制数字序列。00000000

Utf-8中,一个英文字符占一个字节,中文(含繁体字)占三个字节

绕过

attachmen/Pasted image 20250307232759.png
分析源代码,发现代码对文件前两个字节进行了校验,将 111.php 后缀改成 .jpg ,再用 010 editor 打开将前两位字节改成 FF D8 绕过上传。
attachmen/Pasted image 20250307231323.png
attachmen/Pasted image 20250307231515.png
attachmen/Pasted image 20250307231754.png

但是上传的文件被存储为 jpg 文件,需要调用 include 文件包含调用上传的 111.jpg 让其被包含当作 php 代码运行,才能通过蚁剑进行连接

点击页面上的“文件包含漏洞”链接,通过 get 方法传递参数 file,file 值为图片上传后路径 :./upload/.jpg
attachmen/Pasted image 20250307231908.png

http://192.168.47.129/upload-labs-master/include.php?file=./upload/8820250307231715.jpg

包含成功,上传的 .jpg 文件被当作 php 代码执行
attachmen/Pasted image 20250307232340.png

成功绕过上传,可以用蚁剑进行链接

方法二 :也可以通过 copy 命令合成图片码,再进行上传
attachmen/Pasted image 20250307233026.png

Pass-15 图片马绕过

前置知识

getimagesize() 函数返回一个包含图像信息的数组。该数组的索引如下所示:
索引·0:图像的宽度(单位:像素)
索引·1:图像的高度(单位:像素)
索引·2:图像类型的常量值 (可以使用 image_type_to_mime_type() 函数将其转换为 MiME
类型)
索引·3:包含图像属性的字符串,以逗号分隔(如 "width=500,height=300")
如果 getimagesize() 函数无法读取图像信息,则返回 false。否则,返回一个包含上述索引的数组。

IMAGETYPE_GIF:代表·GIF·图像文件的常量值
IMAGETYPE_JPEG:代表·JPEG·图像文件的常量值
IMAGETYPE_PNG:代表·PNG·图像文件的常量值
IMAGETYPE_SWF:代表·SWF·(Shockwave·Flash)·文件的常量值
IMAGETYPE_PSD:代表·Adobe·Photoshop·的·PSD·文件的常量值 
IMAGETYPE_BMP:代表·BMP·(Bitmap)·图像文件的常量值

分析源代码
attachmen/Pasted image 20250307235620.png

使用图片码进行绕过,在用文件包含使图片被当作 php 代码加载

Pass-16 图片马绕过

源代码分析
attachmen/Pasted image 20250308000224.png

同样可以使用图片码进行绕过,文件包含进行解析调用

补充:
需要开启php_exif模块
开启PHP exif扩展方法,服务器配置说明:

1.在 php.ini 文件中找到 ;extension=php_exif.dll ,去掉前面的分号  

2.在 php.ini 文件中找到 ;extension=php_mbstring.dll,去掉前面的分号,并将此行移动到 extension=php_exif.dll 之前,使之首先加载。

3.找到[exif]段,把下面语句的分号去掉。
;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel = JIS

Pass-17 二次染绕过

源代码
attachmen/Pasted image 20250308092949.png

关键代码:
imagecreatefromjpeg($target_path); // 函数会重写图片,删掉数据尾插入的一句话木马

绕过方法:
通过上传 gif 图片,再将上传的 gif 图片另存为,通过 010editor 编辑器比较两个图片,在两个 gif 相同靠后处插入一句话木马则可绕过上传,再通过文件包含运行。

attachmen/Pasted image 20250308140623.png

需要在 php.ini 中设置了short_open_tag=OFF 否则文件包含时候,php 会报错

文件渲染绕过,文件包含蚁剑连接。

Pass-18 条件竞争原理与绕过

举个例子:
流水线 一条线很轻松,多条很累。

可能出现差错文件上传条件竞争前提:
服务器会先将任意类型文件放在服务器上,然后再判断合法性,非法则删除。

生成小马语句

生成小马的语句
<?php 
$f= fopen ("shell.php","w") ;
fputs ($f,'<?php phpinfo();?>');
?>

<?php
$a='PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+';
$myfile = fopen("shell.php","w");
 fwrite($myfile,base64_decode($a));
 fclose($myfile);
 ?>

文件上传条件竞争本质:
抢夺线程的资源,使得我们上传的生成木马的文件可以被快速访问运行一次,达到非法目的
comp.php

上传文件,绕过防护之后,小马又会被立马删除。但是由于条件竞争,我们可以利用脚本不断访问生成小马的 php 文件,这样就形成了脚本和 web 删除程序之间的竞争,一定的测试量后,可以竞争到资源,成功生成小马 php 文件执行 shell 。

实际就是抢在文件被删除之前执行一次,写入新的 php 一句话木马。

源码分析
attachmen/Pasted image 20250308143315.png

先移动后判断,攻击者可以批量上传,只要成功访问一次在上传路径上写入小马,就可以用蚁剑进行连接。

能不能成功上传存在偶然性

写一个竞争码 comp.php ,拦截上传 comp.php 数据包,使用 BP Intruder 攻击模块实现
attachmen/Pasted image 20250308202718.png

attachmen/Pasted image 20250308164404.png

设置 Payloads 选项,自动上传 10000 次
attachmen/Pasted image 20250308164901.png

设置 Resource pool 选项,线程为 20
attachmen/Pasted image 20250308165011.png

访问 ./upload/comp.php ,BP 拦截数据包发送到 Intruder 攻击模块设置为一直访问,一旦竞争成功就能写入一句话木马。
attachmen/Pasted image 20250308165306.png

设置 Payloads 选项为无限攻击
attachmen/Pasted image 20250308165353.png

同样设置线程为 20,开始攻击

服务器成功写入 shell.php
attachmen/Pasted image 20250308202831.png
attachmen/Pasted image 20250308202749.png

Pass-19 apache解析漏洞+条件竞争绕过

apache 漏洞:当 apache 服务器读取 111.php.7z 文件时,发现解析不了 .7z 后缀就会往前解析 111.php。

源代码分析

attachmen/Pasted image 20250308204858.png
attachmen/Pasted image 20250308211030.png
attachmen/Pasted image 20250308211054.png

文件名和后缀重新拼接
attachmen/Pasted image 20250308211509.png

先检查后缀,后移动到上传路径,然后将上传路径+文件+后缀拼接

修复 bug

上传正常图片发现十九关有 bug 文件保存在 upload-lab-master 目录下面而不是 upload 文件下,修改代码如下:
修改前:
attachmen/Pasted image 20250308214752.png
修改后,上传恢复路径 ./upload/

$this->cls_upload_dir = $dir.'/';

绕过

先通过加 .7z 后缀绕过检查,多线程抢在文件 comp.php.7z 被重新拼接成存储成 comp.7z 前执行一次写入一句话木马。

BP 拦截使用 Intruder 攻击模块一直重发数据包
attachmen/Pasted image 20250308215930.png

持续访问 .comp.php.7z 文件
attachmen/Pasted image 20250308220023.png

一旦成功访问,将会在 ./upload 目录下面写入 shell.php
attachmen/Pasted image 20250308220823.png

Pass-20 后缀绕过总结

//用于提取文件扩展名。
 $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

本关可以使用 .user.in、空格、后缀加点、$DATA、%00截断都可以使用。

Pass-21 审计+数组后缀绕过

代码审计

attachmen/Pasted image 20250308230023.png

is_array() // 判断传入参数是否是函数

$file = explode('.', strtolower($file)); // 将 file 按点分割存储成数组:以 1.jpg 为例:file[0]=1,file[1]=jpg

end($file); // fiel数组最后一位
reset($file); // file数组第一位
count($file); // file数组有效值

利用 end() 和 count() 函数特性直接上传数组进行绕过。

绕过

修改 content-type
attachmen/Pasted image 20250308231117.png
修改数据包,传入数组
attachmen/Pasted image 20250308230146.png

当传入的是 save_name 数组,且  save_name[0]=111.php ,save_name[3]=jpg
posted @ 2025-03-26 22:48  南舟树  阅读(138)  评论(0)    收藏  举报