安全初级 | Upload 文件上传漏洞实操

目录

Php一句话木马

怎么利用:

有了一句话木马,可以干什么;

所以用之前把火墙关了,或者实时保护;

开始第一关:

第二关

第三关:apache后缀解析的问题

第4关

第5关

第6关:

第7关:

第8关:

直接到13关:

方法2:

第14关:

第15关:

第16关:二次渲染

第17关:条件竞技


文件上传:我们所构建的恶意文件想办法去绕过限制,然后传送到服务的端;让它把文件保存下来,但是同时,你也要猜到,它最终保存在服务端的哪个位置;

如果不知道位置,那你传来传去,文件就和消失一样,白上传了;

允许上传PDF, 头像,txt ,图片 等

有时候没有限制的话。万一能上传php文件呢

Php(一句话木马)

你是不是得知道这个文件最后保存在什么位置呢;如果你猜不到保存的路径,那你上传了也是没有任何意义的;

你得知道文件传哪里去了,不然白搭

D:\phpstudy_pro\WWW\pikachu\vul\unsafeupload\uploads

假设我把一句话木马文件传上去;把原路径剪切掉,此时只要你能绕过校验,我们就认为你上传成功了

就是你的.php后缀的文件,现在传不上去,因为网页表面弹窗显示,但是,你把.php改成.png

只是作为学习来用;

然后回来看一句话木马是什么?

Php一句话木马

任何语言都有,就是我们平时用的最多的就是PHP

很简单的语句,但是你通过这个文件,你可以直接拿到对方电脑的控制权

PHP一句话木马是一种极简的Webshell后门,通常只有一行代码,攻击者可以利用它向服务器发送任意PHP命令并执行。它的核心是一个能动态执行代码的函数

能执行php代码

问题是我现在要执行的是真正的系统命令,一句话木马是用来执行代码命令

代码命令就是假设:PYTHON,它允许你执行print等;但是我们想执行的是whoami ipconfig 这些,我们把这些命令叫做系统命令;但是现在只能执行代码

那为什么一句话木马还能用呢;

(如eval)和一个接收外部参数的方法(如$_POST)。

🎯 最经典的形态

这是最基础、最常见的PHP一句话木马:

php 复制代码
<?php @eval($_POST['cmd']); ?>
  • <?php ... ?>:PHP代码的起始和结束标签,告诉服务器这是一段PHP代码。
  • @:错误控制运算符,可以屏蔽执行时产生的报错信息,让木马更隐蔽。
  • eval():核心函数,它会将括号内的字符串当作PHP代码来执行
  • $_POST'cmd'用于接收客户端通过POST请求发送的参数,'cmd'相当于连接木马的"密码",只有知道密码的人才能控制。

怎么利用:

给cmd去传一个值;正常情况下,这只允许你去传PHP函数,

但我们是

? cmd = system("whoami") whoami 属于最终的系统命令

Systemd最终传给了eval, 就把systemd给你执行了;

然后systemd就是真正实行whoami 命令执行的东西

但这个太简单了,太明显了,一写就被杀掉了

注: GET请求直接替换即可

Whoami

黑点是会出现汉字,编码会出现问题

假设你要把文件上传,但是我不允许你生成尖角号<>

Php的尖角号可以用什么替换

死局问题,暂不说

有了一句话木马,可以干什么;

可以通过工具去连接它,连接木马文件,

蚁剑 冰蝎 菜刀 webshell

连接成功后就拥有了控制权了;

⚙️ 它是如何工作的?

  1. 上传木马:利用文件上传漏洞等方式,将包含上述代码的文件(例如shell.php)上传到目标网站的服务器目录。
  2. 发送指令:攻击者通过工具(如蚁剑、中国菜刀)向该文件发送POST请求,请求体中包含要执行的PHP代码,如password=system('whoami');。
  3. 执行指令:服务器上的木马文件收到请求后,eval()函数会将system('whoami')当作PHP代码执行,并将结果返回给攻击者。

通过这个流程,攻击者可以间接控制服务器,执行文件管理、系统命令等操作。

🛡️ 如何实现"免杀"与变形?

由于基础形态特征明显,很容易被安全软件(WAF)识别。为了绕过检测,攻击者会使用各种变形技巧来伪装。

变形技巧 代码示例 原理说明
可变变量 <?php a = "eval"; b = "a"; $$b($_POST'x'); ?> 通过PHP的可变变量特性,间接调用eval函数。
字符串拼接 <?php a = "e"."v"."a"."l"; a($_POST'x'); ?> 将关键函数名拆分成多个字符串再拼接,避免直接出现eval关键字。
编码隐藏 <?php a = base64_decode("ZXZhbA=="); a($_POST'x'); ?> 将eval进行Base64编码,执行时再解码,绕过基于关键字的检测。
回调函数 <?php @call_user_func("assert", $_POST'x'); ?> 使用call_user_func等函数来动态调用assert等危险函数。

除了防火墙,还有实时保护WINDOWS关不掉的,关了也会自动启动

所以用之前把火墙关了,或者实时保护;

题外话:

主机配置,和虚拟机配置不一样;IP也就不一样

两个环境不一样

用BP抓包最好不要用,127.0.0.1

虽然能访问到,但是有时候BP抓不到这个包;

开始第一关:

不仅要保证上传而且要保证上传完要访问到;

发现是基于前端的JS进行校验的;可以绕过;我们甚至可以在浏览器中不让它用JS

就BP抓包

把后缀改成PHP

因为访问的时候,没有携带参数值;所以报错

可以通过抓包传参

蚁键默认用的是POST请求

<?php ?> php 限制和过滤 (php)===》怎么去让服务器正常的吧你的文件作为php文件执行

第二关

Gif

看你属性值是不是这三者的一个,如果是的话,才执行下面IF判断;否则就是文件类型不正确请重新上传;

这一关是通过content-type属性值开始校验的

有时候清空会把文件夹清理掉,新建即可

php 复制代码
<?php eval($_POST['phpinfo'];?>

Phpinfo通常会被用作测试

第三关:apache后缀解析的问题

如果是其中一个就会报错

后缀名没有完全的去过滤掉;我们有些中间件APACHE

把后缀名改成:

上传完之后PHP能不能正常的认为是PHP代码并执行

执行后出现info界面就是OK的

第4关

黑名单非常多

你传没问题,你传上去它执行不了,

目录级别的配置文件

创建一个.htaccess 文件,然后把配置写进去;

然后上传;

成功!!!!!!!

目录级别的APACHE起的作用;

第5关

把.htacess给BAN了;

这一题考的是PHP的目录级别的配置文件

Php.ini(.user.ini) 当用户访问当前目录下的某类文件的时候,默认先导入某个文件的内容

比如我现在UPdata下面,

Auto_prepend_file=proof.jpg

使用Phpstudy2018

APACHE下面必须要,跟PHP是通过PHP-fpm; 那样的运行方式,这样你的user.ini才可以生效;

尝试切换版本

问AI:如何切换成使用php-fpm

会把文件重命名

这一关是黑名单没有校验全;没有把全是大写的PHP加进去;

后面也没有转小写功能

还有php7;或者phpl

所以说你的黑名单写的再完全,也不可能完全考虑到;

第6关:

·限制大小写,限制点等

加个空格

正常情况下,不显示路径,就只能猜测;

第一个:保证文件能传上去;

第二个:保证你能找到文件

第三个:你去访问文件的路径的时候,还得保证能够被当作php代码执行;

第7关:

和上一关相比,少了一个删除文件名末尾的点

你在文件名后加点 本质上还是能被识别为php文件的

依旧执行,完全可以正常识别的

第8关:

刚才的侥幸,在8关就不行了

Windows里面的文件流操作

我们如果想要访问别的文件流的时候,就可以通过默认的数据流也就是真实数据部分

Test.php::$DATA

直接到13关:

它其实就是只校验了你的文件名是不是;我们通过抓包后呢;你可以直接给你的文件前面加一个,GIF89a;这样的话,拿上后就认为是有这个东西的

方法2:

你把改过的JPG文件,

用VSCODE的的16进制编辑器打开;

一般在前面固定的就那几个字符, 我就把它叫做magic number; 会根据前面的固定数字,来判断你这个文件,是什么类型的文件;

魔数(Magic Number) 是文件头部几个字节的特定序列,用于在操作系统层面快速、准确地识别文件类型,而不依赖于可能被随意修改的文件扩展名。以下是一些常见文件类型的魔数字节(十六进制表示):

文件格式 魔数(十六进制) 备注
JPEG FF D8 FF 常见于JPEG/JFIF格式,部分变体以FF D8 FF E0或FF D8 FF E1开头。
PNG 89 50 4E 47 0D 0A 1A 0A 固定8字节。
GIF 47 49 46 38 (GIF8) ASCII码对应字符串 "GIF8"。
BMP 42 4D ASCII码对应字符串 "BM"。
TIFF 49 49 2A 00 或 4D 4D 00 2A 分别对应小端序和大端序。

📄 文档与压缩文件

文件格式 魔数(十六进制) 备注
PDF 25 50 44 46 ASCII码对应字符串 "%PDF"。
ZIP 50 4B 03 04 ASCII码对应字符串 "PK"。DOCX、XLSX等Office文档也是ZIP容器。
RAR 52 61 72 21 ASCII码对应字符串 "Rar!"。
7-Zip 37 7A BC AF 27 1C
GZIP 1F 8B 08

🎵 音视频文件

文件格式 魔数(十六进制) 备注
MP3 49 44 33 包含ID3标签的MP3文件。
WAV 52 49 46 46 ASCII码对应字符串 "RIFF"。
AVI 52 49 46 46 同样以 "RIFF" 开头。
MP4 66 74 79 70 (在偏移量4字节处) ASCII码对应字符串 "ftyp"。

⚙️ 可执行文件

文件格式 魔数(十六进制) 备注
Windows EXE/DLL 4D 5A ASCII码对应字符串 "MZ"。
Linux ELF 7F 45 4C 46 ASCII码对应字符串 "\x7FELF"。
Java Class CA FE BA BE 著名的Java咖啡杯魔数。

魔数是一种更可靠的识别方式,但并不能保证100%准确。一些文件格式(特别是复杂的容器格式)的魔数可能更长或在文件中的位置不同,有些恶意文件也可能通过伪造魔数来伪装自己。

Ai.png

想要制作图片码;相当于我现在要把我test.php里面的内容追加到刚才的.png的图片里面去;

你可以指定比如生成的图片是test.png; 你的恶意代码就跑到了图片里面去;

可以正常显示图片;用16进制编辑器打开

先传一个PNG

你一张JPG或PNG图片,不能被APACHE交给PHP解析器;

可以上传一个目录级的配置

如果没有配置毛病在的话?

所以要配合文件包含漏洞;

图片码位置

第14关:

也是图片码

Getimagesize函数

就不能补GIF89a

14关要图片

图片码

第15关:

先查询函数用法

第16关:二次渲染

本关使用 GD 库对图片进行二次渲染 ------先解码图片为内存图像,再重新编码保存。这个过程会清除大部分附加数据 ,包括简单的图片马。必须找到图片中渲染后字节不变的稳定区域 ,将 PHP 代码放在那里。

第17关:条件竞技

白名单:只能是白名单里面的后缀

test.php中,在指定位置,让其生成一个新的文件;这个文件就不影响

抓时间差

查东西尽量在官网查

AI提示词:读取链接把内容整理成易懂的内容

用BP来尝试

演示:

抓上传文件的包

抓路径的包

第一个包;用来不断去上传文件

第二个包:不断尝试去访问的请求

传文件

5000次

发请求:

让他们一直跑直到访问成功为止

'

找一个非404的

停止到17

相关推荐
看昭奚恤哭1 小时前
LWIP TCP滑动窗口为TCP ZeroWindow的解决方法
网络·tcp/ip·php
AC赳赳老秦1 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
笨鸟先飞,勤能补拙2 小时前
下一个十年:网络安全正在被重写
网络·人工智能·安全·web安全·网络安全·github
月光船幽幽2 小时前
安全域公理:连续与脉冲扰动的量化约束
科技·安全
烟漠河洛2 小时前
俄罗斯电商3200亿卢布疯长:跨境支付与多平台订单系统架构解析
mysql·php
Lvan的前端笔记2 小时前
AndroidX 完全入门指南
android·androidx
游戏开发爱好者83 小时前
TraceEagle 代理抓包详解,无感代理、去证书绑定与 HTTP/3 解密能力解析
网络协议·计算机网络·网络安全·ios·adb·https·udp
各类产品分享3 小时前
化工园区做AR安全巡检推荐哪家供应商
安全·ar·ar智慧运维解决方案
帅次3 小时前
Android 应用高级面试:Window 近1年高频追问 18 题
android·面试·职场和发展
米瑞格门窗3 小时前
上海系统门窗哪个靠谱
大数据·人工智能·安全·家装·家装建材·系统门窗