环境-BlueCMS1.6

https://jwt1399.lanzoui.com/inPwSde6c5a 下载BlueCMS源码

参考文章 https://foxgrin.github.io/posts/52227/

https://xz.aliyun.com/t/7992

了解目录结构

看到这么多,怎么入手,思路是怎么去做?直接去找SQL漏洞、RCE等估计有点困难,因为这也太多文件了,我看了很多大师傅们都是先了解一下整个目录结构,这个目录是作用于什么的,包含有哪些文件,找到核心文件,再进行入手,会将审计范围缩小一点而且会节省不少时间。

  1. ├── admin 后台管理目录
  2. ├── install 网站的安装目录
  3. ├── api 接口文件目录
  4. ├── data 系统处理数据相关目录
  5. ├── include 用来包含的全局文件
  6. └── template 模板

\1) 函数集文件,通常命名中包含functions或者common等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到它们,寻找这些文件一个非常好用的技巧就是去打开index.php或者一些功能性文件,在头部一般都能找到。

\2) 配置文件,通常命名里面包括config这个关键字,配置文件包括Web程序运行必须的功能性配置选项以及数据库等配置信息,从这个文件里面可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是用单引号还是用的双引号包起来,如果是双引号,则很大可能会存在代码执行漏洞。

从首页获取信息

了解文件目录后,就先从index.php文件入手,index.php一般是整个程序的入口,通过index文件可以知道程序的架构、运行流程、包含那些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑,所以从首页入手是很有必要的。

代码审计学习 - 图1

但index.php这么多行,都要看岂不是太累了,而且没什么用,因为index.php往往不需要获取用户输入,那我们就看这个文件引入了哪些文件,逐层递进。

代码审计学习 - 图2

引入了这两个文件,我们上面提到过一定要注意含有common关键字的文件,打开common.inc.php观察一下

代码审计学习 - 图3

在30多行发现了addslashes() 函数对全局数组POST,GET,COOKIES,REQUEST都进行了转义处理,所以如果我们对包含该文件的文件进行SQL注入就要注意单引号、双引号等会被转义。

代码审计学习 - 图4

又观察到会ban IP,可以了解这个文件主要是写一些通用防护,其他文件引用即可使用

代码审计学习 - 图5

这个文件包含了一些文件,以后有不认识的函数可以在这里面寻找。

挖掘漏洞

当看到一堆代码时,会有那种不知所措的感觉,那就不妨想象一下一般网站出现漏洞的地方都是在哪里?比如SQL注入、XSS、RCE等会发现有一个共同点,就是用户可以进行输入,有输入的地方就可能存在漏洞,所以这样就有的放矢,在繁多的代码中,就先去找一下那些用户可以控制输入的代码。

从根目录开始,就按照顺序来,先看ad_js.php

代码审计学习 - 图6

发现有输入。

发现ad_id这个参数是可控的,再往下看发现SQL语句

代码审计学习 - 图7

ad_js.php包含有common.inc.php文件,所以我们输入的单、双引号会被转义,但是这里的sql语句中$ad_id是没有单或双引号包裹的,所以根本不需要去关注过滤,很明显这里就存在了sql注入漏洞,先拿小本本记录一下,这个文件含有SQL注入漏洞。

再来查看ann.php,90多行,但我们只去找用户可以进行输入的地方

代码审计学习 - 图8

但是经过intval()函数的处理后,便没办法进行SQL注入了,那就换下一个文件

查看news_cat.php文件,发现变量没单双引号但因为intval()函数无法进行SQL注入

代码审计学习 - 图9

利用工具去寻找漏洞

审计PHP代码常用的工具有Seay源代码审计系统rips等,工具有时也会发现一些我们漏掉的地方,所以有时手工和工具同时使用效率会更高,利用Seay源代码审计系统工具发现这么多漏洞,但要注意只是可能存在,有的不一定就是可以利用的。

代码审计学习 - 图10

查找危险函数

命令执行 system、shell_exec、passthru、popen、proc_open
文件包含 require、include、require_once、include_once
变量覆盖 parse_str 、mb_parse_str
代码执行 eval、assert、preg_replace
文件操作 file_get_contents 、file_put_contents 、move_uploaded_file 、unlink & delete

这里列举一些各个漏洞对应的危险函数,我们找漏洞无法就是RCE、SQL、文件包含等,那么直接查找这些函数,观察这些函数是否可以利用,不就可以判断出是否存在对应的漏洞了,比如查询一下unlink函数

代码审计学习 - 图11

看到了有POST。发现可以利用

代码审计学习 - 图12

发现除了这四个文件含有这个变量,其他文件没有包含这个变量。,除了开头包含文件的转义处理以外,没用其他过滤地方,那就可以通过利用这个变量进行网站根目录下任意文件删除的操作。

分析漏洞

刚才在跟踪输入变量的时候,发现ad_js.php存在一个SQL注入漏洞,现在就来看如何利用这个漏洞

代码审计学习 - 图13

仔细观察这段代码,发现参数是没有任何单双引号,再去查找一下前面包含的这个SQL语句的getone函数,看看我们传入的参数会不会因为这个函数而变化或转义什么的,追踪getone函数,发现在mysql.class.php文件中,功能用于封装为sql语句,并没有什么过滤等

代码审计学习 - 图14

再往下看发现

代码审计学习 - 图15

这里把内容直接输出出来

所以就可以sql注入

代码审计学习 - 图16

任务文件删除漏洞

在上面提到了user.php文件中存在可控的参数,现在就来详细的来看一下

首先这里$act

代码审计学习 - 图17

在这里可以看到如果没登陆的话就会跳到登录

代码审计学习 - 图18

这里也有有一些限制,给足参数

代码审计学习 - 图19

这样成功删除根目录下的flag

代码审计学习 - 图20

文件包含漏洞

代码审计学习 - 图21

通过自动审计发现还可能存在任意文件包含漏洞。

代码审计学习 - 图22

看看是否能利用