任意文件包含
文件包含
文件包含不是一种漏洞,是一种功能,往往是程序员为了减少代码冗余而存在的文件包含功能,比如权限的检测功能,没必要在每个功能都写对应的代码,只需要包含有检测功能的文件就可以了
包含函数
- include() 遇到要包含的文件临时去加载去引用,加载错误报错后继续执行
- require() 在当前的php运行前就先去读取要包含的文件,一起执行,加载错误后报错不继续执行后面的代码
- include_once() 只包含一次
- require_once() 只包含一次
任意文件包含漏洞的特点
文件包含函数只看对应的文件有没有包含到,不在乎文件的后缀是什么,都会把文件内的内容当作php代码运行,因此可以配合文件上传一个正常的后缀,里面有恶意代码进行执行,利用的重点在于控制目标去包含恶意文件
RFI/LFI=> 远程文件包含 本地文件包含
- 本地文件包含:要包含的文件必须在目标主机上
- 远程文件包含:要包含的文件可以在外部(修改配置文件allow_url_include=on)
漏洞利用
若是白盒审计,看源代码的时候搜inlude或者require 寻找有没有
include 加上变量名
类似的代码,若存在,可以想办法利用,url可能会有传参比如**?file=**
变量覆盖漏洞
这个漏洞也是比较少见的漏洞,感觉像是逻辑漏洞,指的是自定义的参数值替换原有变量值
常见出现方式
- $$
- extract()
- parse_str()
设置register_globals=OFF可以防止这个漏洞的出现
[BJDCTF2020]Mark loves cat
这个题目有git泄露 最开始的时候折腾挺久的 因为lijiejie那个githack老是爬不下来源代码 那个是好多年前的脚本的 还是用python2写的 可能有什么历史遗留的问题不能使用 但是没事 大聪明的我又找了一个新的脚本
https://github.com/WangYihang/GitHacker
这个脚本好用,然后在跑脚本的时候遇到了状态码429,也就是说人家靶场不让我们瞎扫,扫目录的时候也遇到了这个状态码,把线程调小一点就好了
githacker –url xxx/.git/ –folder ctf –thread 1
非常好用兄弟们,然后直接看源代码
1 |
|
可以看出了这里又一个$$ 所以我们可以用第二个if语句来获取flag
直接?yds=flag就可以了
代码审计
这里对一个Doumiphp进行一下审计
直接代码审计 搜索$$ 然后排除admin的目录 因为我们没法进入后台
发现这里会对传入的值进行变量赋值 满足变量覆盖的要求 又因为session是由变量赋值的 这里可以看看是否能够伪造一个admin的session直接进入后台
检查前面的代码看看有没有什么条件 发现有一个
这里可以尝试去寻找需要这个php的地方
根据login.php发现了check.admin.php 这个是和admin权限有关的地方
于是构造一下payload
interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin