文件包含漏洞复现
简介
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含
前置申明
本博客所有内容均为作者的个人学习笔记记录,作者也是小白一枚,如果有什么地方写的不对或者对您带来影响欢迎底部留言或者点击右下角的图标与我联系吧
本博客的所有Security 大类下的文章只能作为
如果喜欢我的文章欢迎各位大佬点击右下角的订阅图标开启浏览器推送吧,这样你只要不清除浏览器缓存就能第一时间收到我的更新通知啦(如果你的网络如果能上Google就用Chrome浏览器订阅,如果不能推荐用微软的Edge浏览器,目前正在寻找解决办法,订阅成功后会有一条提示成功,如果未收到表示网络限制原因未订阅成功)
中华人民共和国网络安全法(2017年6月1日起施行) 第二十二条任何个人和组织不得从事入侵他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供从事入侵网络、干扰网络正常功能、窃取网络数据等危害网络安全活动的工具和制作方法;不得为他人实施危害网络安全的活动提供技术支持、广告、推广、支付结算等帮助。 第三十八条任何个人和组织不得窃取或者以其他非法方式获取公民个人信息,不得出售或者非法向他人提供公民个人信息 第六十三条违反本法规定,给他人造成损害的,依法承担民事责任 第六十四条违反本法规定,构成犯罪的,依法追究刑事责任 中华人民共和国刑法(285286) 第二百八十五条违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的处三年以下有期徒刑或者拘役 第二百八十六条违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役:后果特别严重的,处五年以上有期徒刑。违反国家规定,对计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,依照前款的规定处罚 中华人民共和国刑法修正案7(第九条) 在刑法第二百八十五条中增加两款作为第二款、第三款:“违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金:情节特别严重的,处三年以上七年以下有期徒刑,并处罚金提供专门用于侵入、非法控制计算机信息系统的程序、或者明知他人实施侵入、非法控制计算机信息系统的违法犯罪行为而为其提供程序、工具,情节严依照前款的规定处罚。
文件包含漏洞
文件包含定义
- 为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码
- 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间
PHP文件包含函数
require()
require()与 include()的区别在于 require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行
require_once()
功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次
include()
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行
include_once()
功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次
文件包含漏洞
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶薏文件,导致了执行了非预期的代码
一股文件包含漏洞多出现在php中较多
文件包含漏洞分类
本地文件包含漏洞LFI
本地文件包含漏洞LF( Local File Inclusion ): 指的是能打开并包含本地文件的漏洞。大部分情况下遇到的文件包含漏洞都是LFI。
远程文件包含漏洞RFI
远程文件包含漏洞RFI( Remote File Inclusion): 是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。但RFI的利用条件较为苛刻,需要对php. in中进行配置
phpStudy配置:其他选项菜单->PHP扩展及设置->参数开关设置->☑️allow_url_include ☑️allow_url_fopen,详情参看下图说明
两个配置选项均需要为on,才能远程包含文件成功。在php.ini中, allow_url_fopen默认一直是On,而 allow_url_include从php5.2之后就默认为Off
1 | allow_url_fopen = On |
本地文件包含
无限制本地文件包含
文件包含可以包含任意文件,即便被包含的文件并不是与当前编程语言相关,甚至为图片,只要文件被包含,其内容会被包含文件包含,并以当前服务器脚本语言执行。
如果包含的文件内容不符合php语言语法的,会直接将文件内容输出
1 | //文件名 |
限制文件包含
开发者限制了被包含文件的后缀名
绕过条件:php.ini 配置文件中 magic_quotes_gpc = off PHP版本小于5.3 对可控参数未使用 addslashes函数,满足这三个条件就可以使用%00截断。一定条件下可以使用%00,因为当程序流遇到%00终止符的时候将直接终止 如果没有效果重启一下phpStudy。
magic_quotes_gpc 函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、 cookie过来的数据增加转义字符"\",以确保这些
数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而岀现致命的错误
addslashes()函数返回在预定义字符之前添加反斜杠的字符串。http://192.168.151.8/mytest/test.php?filename=phpinfo.txt%00
1 | //文件名 |
session 文件包含
查看 session 存储位置
利用条件:session 的存储位置可以获取,本文章中之前已经能执行 phpinfo.txt了,那么在返回的页面通过查找关键字
session.save_path
查找到我们的存储位置为C:\phpstudy2018\PHPTutorial\tmp\tmp
linux下默认存储在/var/lib/php/session目录下
session的文件名为sess_+ sessionid 如:【sess_sgu4g2mpobbj6m173qbvjlbkc6】
获取session
上传session内容可控测试代码
1 |
|
执行文件获取session
通过 sessionID 执行文件包含
日志文件包含
没有上传点,并且也没有 url_allow_include功能时,我们就可以考虑包含服务器的日志文件
利用思路也比较简单,当我们访问网站时,服务器的日志中都会记录我们的行为,当我们访问链接中包含PHP一句话木马时,也会被记录到日志
漏洞利用条件
- 日志的物理存放路径
- 存在文件包含漏洞
- 以 Apache 日志文件为例 phpstudy默认关闭了 apache的日志功能 所以需要先开启,找到
httpd-conf
文件下的CustomLog "logs/access.log" common
去掉前面的注释后重启如下图- 日志文件存在路径:C:\phpstudy2018\PHPTutorial\Apache\logs