文件上传漏洞笔记

1. 如果通过js过滤,可以考虑在浏览器中禁用js直接上传。

2. 可以通过修改content-type进行绕过,如果在后端过滤,可以上传.php然后抓包修改content-type或者是上传.jpg(白名单上面的类型)抓包修改文件为.php,在前端的话就需要先上传白名单类型。

3. 特殊后缀绕过,可以在配置文件中修改httpd-conf(Apache)文件。

找到解析php的语句(AddType application/x-httpd-php)在后面加上想要被解析成php的文件类型(如加上.php3,则会有.php3的文件被解析为.php文件)

4. 特殊后缀绕过另一种,采用.htaccess(注:不要带名称,为“.htaccess”,Apache)。

解释:与httpd-conf类似同样为配置文件,但是一个是全局,一个是局部(对当前目录以及子目录生效),当存在.htaccess文件时优先使用此配置文件(类比为全局变量与局部变量)。

找个空白记事本可以写上解析php的语句除了第3点写法,还有如下:

<FilesMatch “1.jpg”>
SetHandler application/x-httpd-php
</FilesMatch>

可以指定文件范围类的1.jpg文件解析为.php文件。

如果不行可能存在.htaccess未开启,需要在httpd-conf文件里面找到AllowOverride语句将后面的none改为ALL。

5. httpd-conf文件需要重启服务器后生效,.htaccess文件修改后立即生效。

httpd-conf作用:包含Apache HTTP 服务器的全局行为和默认设置。

.htaccess作用:分布式配置文件,一般用于URL重写、认证、访问控制等。

6. php版本可能会导致一些upload-labs失败的问题。

7. Windows系统类的绕过,如:加点、加空格、大写、加点加空格加点(叠加类)。

利用原理:在修改文件后缀的时候,像上面的例子系统会自动处理掉,自动删除点、空格、转变小写。

当过滤不够严格,存在此类漏洞时,可以抓包按照以上修改,虽然会显示(.php. .)但是保存的文件是.php。

针对于这个漏洞需要注意源码最后连接的是哪一部分。

image-20231130191650472

image-20231130191151923

image-20231130191212137

可以发现最后连接的有$file_ext和$file_name。而在前面有一个分割函数strrchr(),从点之后进行分割,但不会改变$file_name的值,不过是给$file_ext赋值,在考虑用点过滤时候需要考虑这个连接。

8. php.ini与.user.ini(范围、优先级、生效方式类似于httpd-conf与.htaccess的关系一个是Apache服务器的,一个是php的)。

.user.ini 作用:特定于用户或特定目录的配置文件,通常位于Web应用程序的根目录下。用于覆盖或追加全局配置文件(如php.ini)中的PHP配置选项。

php.ini 作用:存储了对整个PHP环境生效的配置选项。通常位于PHP安装目录中。

.user.ini生效前提:php版本大于5.3.0,最好是7.X版本,ServerAPI(类似于一种协议)为CGI/FastCGI( phpinfo()查看)有这个说明.user.ini可以生效。

image-20231130102106740

.user.ini文件上传漏洞前提:可以生效并且上传目录中有php文件。

9. .user.ini绕过,文件包含类型。

写法如下:

Auto_prepend_file=111.txt(这个文件里面只包含php代码)

样例:

A:echo “hello “(.php) b:echo “world”(.txt) (在upload-labs靶场中文件是存在一个php文件的,只需要写一个auto_prepend_file=1.jpg的.user.ini文件再将一句话木马写入1.jpg之后上传就行了)

Auto_prepend_file=b.txt hello world(在这个目录下,所有php文件在执行之前都会预先包含一下b.txt中的语句)

10. 额外数据流。例如“1.txt”是一个文件,而“1.txt::$DATA”是这个文件的一个附加数据流。这样的数据流可以用于存储文件的元数据、备份信息、标签等。

:$DATA是默认的数据流,可以自己命名(如:1.txt:hello hello为数据流名称 不要忘记文件名后面的冒号 注意:1.txt:1.txt 冒号后面1.txt就是数据流名称)。

它类似于某个文件的隐藏属性,像编辑文件后缀是不行的。大多数常规文件操作工具不会意识到这些额外的附加数据流,而只会处理默认的数据流。要访问或操作这些附加数据流,通常需要使用特定的命令行工具或者编程接口。

写入方法(命令行):

echo “内容” >>文件名:数据流名 (是直接插入内容到数据流)。

type 文件名 >>文件名:数据流名 (是将某个文件内容插入到数据流)。

查看方法:

notepad 文件名:数据流

11. ::$DATA绕过,利用了数据流和Windows系统,一个文件的数据流和这个文件是两种类型,但是Windows系统中文件是不存在数据流的形式,如下:

image-20231130102610013

在抓包修改后得到的是数据流的形式,但其实上传的文件已经由于Windows系统删除字符变成了.php,这时候可以删除后面的::$DATA再次访问并用蚁剑连接。

12. 可以通过双写绕过,在一些过滤中会有删除部分都东西,可以采用双写达到绕过目的。

如://删除::$DATA 则可以用::$D::$DATAATA(保证删除一个::$DATA后能留下来一个就行,因为一般是没有循环删除)。或者是pphphp这种。

13. %00(URL编码)与0x00(16进制的00)截断绕过[空字符]。

%00:主要是针对GET方式,代码审计,如果路径可以操作,可以在URL中修改,例如最后的URL为路径+文件类型,可以在路径后面写上1.php%00将后面截断,从而变成.php改变文件类型。

0x00:主要是针对POST方式。