动态线条
动态线条end

文件上传:业务场景

文件上传漏洞介绍

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身的权限向服务器上传可执行的动态脚本文件。这里上传的文件可以是木马文件、病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效地,‘文件上传’本身没有问题,有问题的是文件上传后,服务器怎么处理,解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其成为一种网页后门。攻击子和在入侵一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个,命令执行环境,已达到控制网站服务器的目的(可以上传或者修改文件,操作数据库,执行任意命令等)

一句话木马

<?php @eval($_POST[x])?>
//eval会将括号中的字符串当做php代码执行 
//以post传参

文件上传漏洞的原因

1)对于上传文件的后缀名(扩展名)没有做较为严格的限制

2)对于上传文件的MIMETYPE(content-type)(用于描述文件类型的一种方式,http协议属性),没有做检查

3)没有对上传文件的目录权限进行限制

4)web server没有对上传文件或指定目录的行为没有做限制

在web中进行文件上传的原理是通过将表单设为multipart/form-data,同时加入文件域,而后通过HTTP协议将文件内容发送到服务器,服务器端读取这个分段(multipart)的数据信息,并将其中的文件内容提取出来并保存

通常,在进行文件保存的时候,服务器端会读取文件的原始文件名,并从这个原始文件名中得出文件的扩展名,而后随机为文件起一个文件名(为了防止重复),并且加上原始文件的扩展名来保存到服务器上

上传漏洞的危害

1)上传web木马文件,控制web服务器文件,远程命令执行

2)上传系统病毒,木马文件进行挖矿,僵尸网络

击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机将通过一个控制信道接收攻击者的指令,组成一个僵尸网络。之所以用僵尸网络这个名字,是为了更形象地让人们认识到这类危害的特点:众多的计算机在不知不觉中如同中国古老传说中的僵尸群一样被人驱赶和指挥着,成为被人利用的一种工具。

3)上传系统溢出程序进行提权提升

溢出是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了。溢出是程序设计者设计时的不足所带来的错误。
1)缓冲区溢出
2)内存溢出
3)数据溢出

4)修改web页面实现钓鱼、挂马、暗链等操作

存储型xss

5)内网渗透

6)在权限得到提升的情况下,想做什么做什么

文件上传合法性检测方法

1)前端JS验证

2)MIME类型验证

3)黑名单/白名单

4)检查文件内容(getimagesize()函数用于截获图像信息,检验关键字)

5)进制本地文件包含漏洞

6)使用安全的web服务(apache、nginx(txes.png/xxx.php)、IIS解析漏洞(1.php;jpg))

文件上传漏洞绕过方法

1)前端JS绕过

2)MIME类型绕过

3)后缀名大小写绕过/php4、php5

4)00截断

5)覆盖.htaccess

6)windows文件流特性绕过

7)双鞋文件名绕过

8)条件竞争

文件下载漏洞

一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能查看或下载任意敏感文件,这就是文件查看与下载漏洞

下载服务器任意文件,如脚本代码、服务及系统配置文件等,可用得到的代码进一步代码审计得到更多可利用漏洞

如何查找任意文件下载漏洞

查找传入文件名的参数:

     导入文件等参数,要是直接输入文件名,可能存在漏洞

注意如下几个参数

     Realpath、filepath、FilePath、Path、path、inputFile、url、Lang、dis、readfile、data、filep

     src、menu、META-INF、WEB-INF

代码中如何查找漏洞:

     php为例,如果有以下代码,就有可能存在文件下载漏洞

#读取文件并写入到输出缓冲。
#readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] ) : int
readfile

#fopen — 打开文件或者 URL
#fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] ) : resource
fopen

#函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。
#file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) : string
file_get_contents

windows敏感文件路径

c:\boot.ini					查看系统版本
c:\windows\System32\inetsrv\MetaBase.xml	IIS配置文件
c:\Program File\mysql\my.ini			mysql配置文件
c:\Program File\mysql\data\mysql\user.MYD	mysql用户配置文件
rootc:\windows\php.ini				php配置信息
c:\windows\my.ini				mysql配置信息

linux敏感文件路径

/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts
/etc/password
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*文件标识
/proc/mounts/proc/config.gz
修复文件下载漏洞

php为例

     过滤.(点),使用户在url中不能回溯上级目录

     正则严格判断用户输入参数的格式

     php.ini配置open_basedir限定文件访问范围

posted @ 2022-01-26 18:55  v1v1v1  阅读(65)  评论(0编辑  收藏  举报