文件包含

文件包含不是一种漏洞,是一种功能,往往是程序员为了减少代码冗余而存在的文件包含功能,比如权限的检测功能,没必要在每个功能都写对应的代码,只需要包含有检测功能的文件就可以了

包含函数

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
$$x = $y;
}

foreach($_GET as $x => $y){
$$x = $$y;
}

foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}



echo "the flag is: ".$flag;

可以看出了这里又一个$$ 所以我们可以用第二个if语句来获取flag

直接?yds=flag就可以了

代码审计

这里对一个Doumiphp进行一下审计

直接代码审计 搜索$$ 然后排除admin的目录 因为我们没法进入后台

img
发现这里会对传入的值进行变量赋值 满足变量覆盖的要求 又因为session是由变量赋值的 这里可以看看是否能够伪造一个admin的session直接进入后台
检查前面的代码看看有没有什么条件 发现有一个
img
这里可以尝试去寻找需要这个php的地方

img
根据login.php发现了check.admin.php 这个是和admin权限有关的地方

img
于是构造一下payload
interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin