熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞

前言

        最近几天在给协会的学弟讲代码审计入门相关内容,便找了这个熊海CMS_V1.0来教学,结果在这个过程中遇到蛮多问题的,于是这篇文章详细记录了对熊海CMS_V1.0从搭建到审计与漏洞分析的过程,其中踩了很多坑,这些坑网上也没有什么记录,也是我之前学习过程中没有去仔细发现和研究的,果然古人诚不欺我,温故而知新,通过给学弟们讲这个简单的代码审计又学习到了很多新的内容,也欢迎阅读这篇文章的师傅们对文章出现的问题一起探讨交流,不足的地方也请多多包涵,这篇文章也借阅了网上多篇相关审计文章,在文末附上了链接。



网站目录结构

熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第1张图片

admin             --后台文件夹
css                  --css文件夹
files                 --存放网站的各种功能页面文件夹
images            --存放图片文件夹
inc                   --配置文件文件夹
install              --网站安装文件夹
seacmseditor  --网站的编辑器文件夹
template         --模板文件夹
upload            --上传文件夹,存放网站上传的文件
index.php       --网站入口文件



审计工具和环境配置

  系统环境:win10/win7
  用到的软件:seay源代码审计系统、rips、phpstudy_pro、phpstudy2016、phpstudy2018、Navicat Premium、PHPstorm。
  用到的插件:Chrome插件:hackbar、SwitchyOmega;
  推荐练习平台:[lfi-labs](https://github.com/paralax/lfi-labs)、[upload-labs](https://github.com/c0ny1/upload-labs)。

审计工具配置:


Seay源代码审计系统

1.下载地址 提取码:cjlu

2.使用方法

第一步,新建项目,选择对象(要审计的项目)
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第2张图片
1.点击图示的自动审计功能

2.点击开始,等待审计结果

3.审计完成,显示出可能的漏洞

4.双击其中一条便可以审计其中的代码

熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第3张图片


RIPS - 静态源代码分析工具

下载地址 提取码:cjlu

熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第4张图片

1:启动phpstudy(pro或者其他版本都可以),打开apache服务

2:创建网站

3:将解压出来的rips源代码文件复制到网站的根目录

        现在所有的准备工作做好了,开始正式的审计吧:

1:重启apache并打开网站,输入源码的绝对路径,开始扫描,跳出来的弹框点击确定
2:扫描完成,显示出可能有的漏洞总数
3:下拖可以看到可能漏洞具体的路径和代码
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第5张图片

搭建网站测试环境:

        这里使用phpstudy去简易的部署,添加网站,这里域名因为是本机测试,随便写,后面修改下hosts文件即可。
        这里要勾选创建数据库,数据库账号test,密码123456,数据库名称test。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第6张图片

        然后再把要审计的源码放到根目录下。

熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第7张图片

        再找到hosts文件配置测试域名,以便本机访问。修改本地host文件后,需要cmd执行ipconfig /flushdns(刷新dns缓存)hosts文件位置
C:\Windows\System32\drivers\etc\hosts,在原有基础上添加内容:
127.0.0.1 www.test.com
127.0.0.1 test.com

备注:这里如果遇到win10不能编辑保存hosts文件,可以这样操作:选择hosts文件,右键–属性–勾去“常规”选项里面“属性”的“只读”即可。

熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第8张图片

        若是还不能编辑,则需要提高当前用户的权限。右键host文件在安全下面选择编辑–点击添加用户–点击检查名称–找到自己所用的账户–逐一确定,再在权限的地方勾选“完全控制”“修改”“写入”,确认之后就能直接用记事本修改hosts文件了。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第9张图片

        这里再测试下域名是否生效,打开cmd,ping www.test.com,发现已经指向127.0.0.1即代表成功解析到本地。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第10张图片
        配置完成后,在phpstudy_pro面板重启下Apache服务,然后浏览器访问test.com进入系统安装页面,填写好相关信息。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第11张图片

“坑一”:点提交后,遇到页面提示

Mysql Connect Error:Access denied for user ‘test’@‘%’ to database
‘test’

  • 问题分析
    考虑是权限不足的问题被拒绝访问,查看了一些网上的回答,测试如下方法可行

  • 解决方案
    查看user表中root用户及test用户的权限对比,查询语句如下

      mysql> select Grant_priv,Super_priv from mysql.user where user in ('root','test');
    

    发现root用户这两个value都是’Y’,而test用户都是’N’,所以要将test用户这两个value都更新为’Y’,更新语句如下:

      mysql> update mysql.user set Grant_priv='Y',Super_priv='Y' where user = 'test' and host = '%';
    

    而后重启mysql服务即可。

备注:这里便使用Navicat Premium用root账号链接数据库,然后运行命令行界面去执行上述命令即可。

熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第12张图片

        所以最终解决完"坑一"即可完成安装。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第13张图片


任意文件包含漏洞

漏洞概念:
程序开发人员通常会把可重复使用的函数写到单个文件中, 在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为包含。

 简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。

       这里我通过一个简单的例子来帮助大家更好的理解这一块为什么在开发的时候需要文件包含。如下图所示,拿../admin/files/adset.php页面来分析,左边的源码显示其由HTML和PHP及一些SQL语句编写而成,右边浏览器访问它不难看出它就是一个设置广告的功能页面。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第14张图片

        可以看到第二行、第三行代码包含了'../inc/checklogin.php''../inc/conn.php'页面。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第15张图片

  • conn.php 文件:连接数据库的代码。

  • conn.info.php 文件:里面内容就是数据库配置信息,提供给conn.php读取使用。

  • checklogin.php 文件:通过cookie去判断用户是否登录,如果没登录便跳转?r=login登录页面。

【----帮助安全学习,免费资源获取处----】
①18份渗透测试电子书
②安全攻防300页笔记
③30份安全攻防面试指南
④安全红队渗透工具包
⑤网络安全必备书籍
⑥99个漏洞实战案例

       所以说,对于../admin/files/adset.php页面而言,他的功能是为了去把网站设置的广告信息保存进数据库,那么要正常连接数据库这是必要条件,为此需要连接数据库的相关代码和配置信息,既conn.phpconn.info.php文件。此外,从安全的角度考虑,这个是属于后台的操作文件,那么就需要去判断使用这个功能的用户,是不是后台用户,既是不是登录过后台了,那么这里就需要checklogin.php文件的代码去判断了。这里我们可以自己去做下实验,把包含的文件代码注释掉,再去试试访问的时候异常情况,便能更好的理解,这里就不做示范了,大家自行实验理解就可以。
而后台的功能很多,那么多个页面,都需要这两个功能,那如果每个页面都写入这样的代码,不就很麻烦吗?因此便把他们单独抽出来,写成单独的文件,需要他的页面便直接去包含使用即可,这便是文件包含的设计初衷之一。
那么读到checklogin.php文件的代码,就不难发现其导致网站存在垂直越权漏洞。


$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit; 
} 
?>

      通过阅读这段代码可以知道,通过判断cookie中是否存在user的值,如果user值为空,则会跳转到登录的页面。 那么什么是cookie呢。

      客户端向服务器发起请求,服务器使用response向客户端浏览器发一个Cookie。客户端本地浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。我们在平时登录时,在本地都会留下cookie,这是一个识别用户的标志。

       看起来没有什么问题,但是因为cookie是我们可以编辑的,因此我们便可以去编辑cookie的值,从而绕过账号密码的输入登录进后台实现垂直越权访问。

实际利用如下:
       在后台登陆处先按F12调出开发者工具,然后点击 “Application” 按钮,再找到当前网站的cookie进行编辑,再在右侧空白行双击,添加新的cookie参数 “user” 和值 “admin” 。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第16张图片

再在地址栏修改为后台首页地址(任意后台文件地址都行),即可绕过登录进入后台管理。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第17张图片

漏洞产生原因:
       在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控,而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。
       在通过动态包含的方式引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可以导致意外的文件泄露甚至恶意的代码注入。

漏洞文件 :/index.php和/admin/index.php

两处代码一样,因此只用分析一处即可,这里分析根目录下的index.php文件,源码如下 
<?php //单一入口模式 
error_reporting(0); //关闭错误显示 
$file=addslashes($_GET['r']); //接收文件名 
$action=$file==''?'index':$file; //判断为空或者等于
index include('files/'.$action.'.php'); //载入相应文件 
?>

       一行行代码来分析,在分析PHP代码的时候,遇到不懂的函数要随手查PHP手册去了解相关用法和解释。这里推荐使用utools的PHP手册插件,很方便就能查询,如下图所示:
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第18张图片

        所以这里第二行的error_reporting(0);表示关闭所有PHP错误报告。

        那么第一行的注释里面有写"单一入口模式",这个是什么意思呢?简单来说就是用一个文件处理所有的HTTP请求,例如不管是内容列表页,用户登录页还是内容详细页,都是通过从浏览器访问 index.php 文件来进行处理的,这里这个 index.php 文件就是这个应用程序的单一入口。具体详情望君自行百度学习。

        第三行r参数通过GET请求经过addslashes函数处理后再传递给$file变量。查阅PHP手册可以知道,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个addslashes函数后会在他们前面加上反斜线。通常这个函数用于防止SQl注入。

        第四行、第五行,通过三元运算符判断文件名是否为空,为空则载入files/index.php文件,反之赋值就会把传递进来的文件名赋值给$action,".“在PHP里是拼接的作用,因此就是把第四行传递的变量$file(到这里是$action,因为上一行$file赋值给了$action)也就是传递的文件名字,拼接前面的目录”files/”以及后面的”.php"这个后缀,最终载入拼接后的相应文件。

        那么这里漏洞利用其实就两个问题:跳出限定的目录截断拼接的后缀

        为了便于理解和测试,这里我便新建了个本地测试站点,然后在站点根目录新建test.php文件,把index.php源码复制过来,修改源码的第二行,把报错打开,通过几个操作实例来不断进行利用尝试。

一、跳出限定的files路径下文件去包含

这个用“…/”去跳出即可。下面通过实例1来具体解释。

相关知识补充:
"."表示当前目录   
“…” 表示当前目录的上一级目录  
"./"表示当前目录下的某个文件或文件夹,视后面跟着的名字而定   
"…/"表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定

“实例1”: 如下图所示,这时候传参数"r",值是文件名"hy",没带后缀,因为第五行代码会拼接PHP后缀,想去包含同目录下的"hy.php"执行里面的phpinfo();内容,结果失败了,通过第一行报错可以看出来,因为第五行代码拼接了前缀"files/",导致路径出错,找不到该文件,包含失败。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第19张图片

        那么正确姿势如下图所示,利用"…/“来跳出限制的”/files"目录,这时候第五行代码包含的文件便是当前路径下的“hy.php”文件,成功包含。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第20张图片

二、截断后面的PHP后缀名。

        这里其实有学弟当时不理解为什么非要截断后面的PHP,网上很多教程都是演示的在根目录新建个xxx.php,内容是phpinfo();然后直接r=…/xxx去包含验证漏洞存在就完事了,那么怎么去利用最终没有说,因此也就困惑于为什么要去截断后面的后缀。

        其实很好想通,利用文件包含漏洞,最想达到目的是为了拿webshell,那么在正常情况下,文件上传在后台的地方,是很少会让你上传一个PHP文件的,大多是图片、文本类型的文件去上传,所以,如果我们传了一个图片是 “ssn.jpg” ,然后想去包含它,结果到这里就因为第五行代码的拼接成了 “files/ssn.jpg.php” 这样是肯定执行不了图片里面的PHP代码的。

        因此我们需要截断后面的 .php 后缀,这里使用Windows文件名字的特性及Windows文件名的全路径限制进行截断。1.Windows下在文件名字后面加 “.” 不影响文件。2.Windows的文件名的全路径(Fully Qualified File Name)的最大长度为260字节。但是这个是有利用条件的,在我这几次测试过程中, 发现必须同时满足 “php版本=5.2.17、Virtual Directory Support=enable(在phpinfo信息里面可以查看是否开启,“坑二”会详细介绍这一选项)”

        另外有一点,就是文件包含这里,不论你文件的后缀是什么,他包含的时候是只管你文件的内容的,因此你不论是弄成文本还是图片,只要里面内容是可以执行的PHP代码,就可以包含执行利用成功,因此这也是文件包含利用的一个要点,通过实例2来说明。



“实例2”:如下图所示,这里还是在test.php同级目录下新建"ssn.jpg",内容为phpinfo();,在通过实例1的办法跳出了前缀"/files"目录限制后,但是由于第五行代码的拼接".php"后缀,导致包含失败。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第21张图片

        那么正确的姿势如下图所示,先用python语句生成260个".“用以突破Windows全路径长度限制,然后粘贴到hackbar的输入框内,点"Execute"执行,可以看得报错显示“路径被截断为260以内”,那么也就是成功的把后缀”.php"截断了,因此最终也就包含成功执行了"ssn.jpg"里面的phpinfo代码。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第22张图片


“坑二”:截断失败

        在我实际第一次操作过程中,和实例2一样的payload却并没有包含成功,如下图所示,当时就很纳闷,一开始以为是操作系统的问题,换了win7,同样也不行,又以为是PHP版本问题,换了5.4、5.2.17和其他版本也不行。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第23张图片

        然后联系了下其中一篇审计复现成功文件包含的文章作者,对比发现是我当时用的是phpstudy_pro,他复现的时候用的是phpstudy2018,最终经过一系列的探究,初步估计是是这个Virtual Directory Support选项没开启的差别。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第24张图片

        然后也通过几次实验,发现Virtual Directory Support选项,phpstudy 2016、phpstudy 2018默认开启,phpstudy_pro默认关闭。那么这个选项到底是什么东西呢,翻阅相关资料可以找到说明:

提问:我在phpinfo.php中看到“虚拟目录支持”已禁用,如何启用它?php virtual-directory

回答:简而言之:你不容易。而且你不应该。更长的故事:PHP应该提供无共享的环境。在这种情况下,这意味着如果两个脚本并行运 行,则它们不应相互干扰。在大多数情况下,这没有问题,因为不同的脚本使用不同的进程。 (带有mod_prefork,FastCGI,fpm等的Apache模块)但是在某些情况下,人们在线程环境中将PHP用作模块。 (Microsoft IIS模块,Apache mod_mpm模块等。)如果是这种情况,PHP不能依靠操作系统来分隔上下文,而必须自己执行。一个相关区域是当前工作目录。您提到的选项与此有关,名称令人误解:它不是“虚拟目录支持”,而是“虚拟当前工作目录支持”。它是文件系统操作的抽象。因此,当两个PHP请求位于不同的线程和类似include “./foo.php”;的代码中时,您希望该代码相对于请求的主脚本而不是环境的全局状态。 VCWD支持可以做到这一点。因为仅与线程环境相关,所以启用/禁用绑定到PHP是否构建线程安全的设置,该设置在编译时完成。除非您需要,否则此功能已关闭。作为用户,您不必关心它-它与使用流或PHP脚本中的内容的能力无关。

回答的链接地址:https://www.soinside.com/question/Rc3TmJPKAexifU4FruqDCL

        注意几个关键词“虚拟当前工作目录支持”、“文件系统操作的抽象”、“该设置在编译时完成”。因此,初步猜测导致这个问题的便是这个选项。实际利用:(以下内容引用自学弟zwq笔记)

        1.我们通过前面的文件包含学习知道了可以通过首页的include函数直接包含一个XXX.XXX.php的文件,其中XXX.XXX是我们传的参数,index.php会自动拼接一个.php后缀,这时我们如果需要getshell就需要把其中的.php给截断,这里用到的是用windows文件名的最大长度是260字节来进行截断,除此之外,include在变量action前还拼接了一个"files/",所以这里我们在文件包含的时候特别要注意一下被包含的文件和index.php之间的位置关系
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第25张图片

        2.既然知道了具体的原理,那我们这时候就需要来getshell。文件包含可以把包含的文件用来作为php来执行,既然要用到包含,那他网站所处的目录或者下级目录下面必须要有我们需要包含的文件,此时我们又不知道他文件目录下有什么文件可以利用,因此我们首先需要想要上传一个文件。

        3.看完熊海cms_v1.0的前台,找不到可以上传文件的地方,这时候我们去后台寻找。经过寻找我们可以发现在后台-发布内容-发表文章下面可以进行图片的上传,这时候我们只需要新建一个txt文档,然后输入我们的php一句话木马: ,把这个txt文档改为jpg后缀,通过后台-发布内容-发表文章这个上传点来把我们的图片上传
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第26张图片

        4.上传好了webshell,我们如果需要使用菜刀等工具必须得先知道他上传后文件的路径**(这里我们无法使用菜刀,可能只能使用蚁剑)**,只需要用浏览器的审查元素功能(F12)就可以找到我们上传图片的地址。(可以手动访问一下看看文件是不是存在)
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第27张图片

        5.知道文件上传地址之后,我们先使用我们的工具hackbar来测试我们上传的webshell是不是可以执行,这时候我们只需要在hackbar里面先使用load加载url地址**(这里的url地址需要我们构造好文件包含后的地址)**,在POST data里面填写shell=phpinfo();,然后点execute

熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第28张图片
        如果网页显示出了phpinfo()页面,就表示我们的webshell可以执行,判断完webshell是否可以执行之后,我们用webshell管理工具-蚁剑来进行连接,url地址填文件包含以后的地址,连接密码填我们一句话木马里用post方法传的变量(这里我们可以使用谷歌浏览器里的一个插件叫hackbar)
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第29张图片

        6.连接成功
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第30张图片



“坑三”:蚁剑连接后乱码

        需要选择base64编码,如果选默认的会无法连接。因为default(默认)通信过程不采编码与加密操作,明文传输(不推荐,特殊字符会被转义导致出错)下图为乱码的图。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第31张图片

        这里再介绍一下windows下包含的一个小技巧,这里举两个例子
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第32张图片

        直接从例子里面可以看出来,传入file=5<参数就可以包含到了我们的596a62sd.php(这是随便取的),大概原理根据windows的一些特性,我们输入的<会转换成*,而被转换的*类似于linux中的通配符,所以这里就可以利用这个特性来用<进行文件包含。具体解析可以看 http://www.jinglingshu.org/?p=8790 这篇文章介绍的内容。



扩展&回顾:php中的截断绕过姿势

%00

利用条件:PHP版本<=5.3、magic_quotes_gpc=off、

%00即NULL是会被GPC和addslashes函数过滤掉,所以要想用%00截断,需要GPC关闭以及不被addslashes函数过滤,另外在PHP5.3之后的版本全面修复了文件名%00截断的问题,这个版本以后也是不能用这种方式截断。

        漏洞原理:PHP是一种跨平台的服务器端的嵌入式脚本语言,它大量地借用C,Java和Perl语言的语法,并耦合PHP自己的特性,这个%00便是使用了C语言中的字符串处理函数,在连接字符串的时候,0字节(\0)将作为字符串结束符,%00在URL解码后为\0,\0是C语言中字符串结束符,遇到\0不能再读取后面的字符串。因此以它来进行截断。而该漏洞常用在文件包含和文件上传中,下面我将通过实例3和实例4分别为大家演示。

备注:在C语言里面,字符时用\0,指针是用NULL,0x00很少见,一般直接用0代替;这三个本身是一个东西。

“实例3”: 在文件包含中的利用

        如下图所示,就以此处漏洞文件,把addslashes函数去掉,然后去尝试用%00包含。首先这个实例里我的PHP版本为5.2.17,magic_quotes_gpc=off,看似满足利用条件,但是因为这里有经过addslashes函数处理,把%00处理成了\0,因此包含失败。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第33张图片

        那么要想成功利用的话,这里我直接删掉了addslashes函数,GET请求得到的参数r不经过处理直接传递给$file,%00截断成功,显示了phpinfo信息,包含成功。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第34张图片

“实例4”: 在文件上传漏洞中的应用

        这里用实验室内网搭建的upload-labs的Pass-11关卡
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第35张图片

        先来看其源码存在漏洞的地方,$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; 可以看到有save_path这个保存路径的参数且该参数可控(通过GET传参),因此可以用%00进行截断,成功上传 “ssn.php” ,用蚁剑连接拿下webshell。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第36张图片


小tip分享:

0x00

利用条件:PHP版本<=5.3、magic_quotes_gpc=off

这里和%00类似,只是说%00是GET下的,到了POST这里描述为0x00。

“实例5” :这里用实验室内网搭建的upload-labs的Pass-12关卡

        这个关卡和实例4Pass-11的区别就是把本来GET方式获取的save_path参赛变成了POST获取,那么利用的思路也是一样的,用%00截断,但是实际操作过程和上一关有点不太一样。下图演示的是错误的示范,用和上一关一样的操作方式会发现利用失败,这是因为上一关里面,因为save_path这个参数是GET方式传递的,而%00传递给服务器是十六进制的\0便可以截断,但是这里传参变成了POST,如果再用上次的办法直接在body里面修改,这时候传递的便是%00字符串了,显然字符串不能等于十六进制的\0,也就不能完成截断。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第37张图片

        那么我们就需要修改其为十六进制的\0,这里在burpsuite的Hex里面就可以完成编辑,在burpsuite的Hex里面,是http请求内容经过了十六进制编码的结果,这里有个小技巧,如下图四个步骤,先在raw页面的文件后缀后面写个"+“,你其实写其他的也行,只是”+“方便查找,因为”+“的十六进制是"2b”。然后再切换到hex页面,找到那个文件路径参数所在的一行,再找到"2b",双击进行编辑改成"00",然后再返回raw选择下看看有没有空白的,有空白就是修改成功了,最后点send发送修改后的请求包,可以看到成功截断,完成了上传。

        这里再啰嗦一嘴,当时有个学弟看到这么操作好麻烦,貌似就是文件后面加个"空格"的事情,然后就还是直接去raw那里文件后缀后面加上个空格,想进行截断,结果肯定是不行的,不讲武德,不可取啊,至于为什么,你自己去理解下上文我讲的你要改的是十六进制,想办法改成\00去截断,你空格url编码后成了什么?怎么可能截断呢……所以啊,这些细节和原理是一定要刨根问底去探究清楚的,含糊不得。

"坑四” : BurpSuite无法正常使用(running没有打钩)

在Proxy的Intercept模块下出现以下提示
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第38张图片

发现Running没有激活,而且想勾选也勾选不动。

        可能的原因如下:

        一、 本地web服务器冲突

                解决方法:关闭phpstudy,tomcat,jenkins等web服务,然后即可勾选Running

        二、端口冲突

                解决方法:更换端口



?和 #

        首先在本地测试网站根目录准备测试文件:1.php 和 2.php 内容都为:
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第39张图片

        尝试使用?和#去截断1.php后的内容,可以看到都成功显示了phpinfo内容,截断成功。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第40张图片
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第41张图片

        然后再 尝试截断2.php.jpg的.jpg ,都失败了。
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第42张图片
熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞_第43张图片

总结:
?和 # 成功截断后面的内容是因为 ?和 # 后面的都不进行解析。
这只能算是url的一个特性,只能在发起请求的一端来截,和服务端的解析没什么关系。

作用:
这个我个人感觉只在ssrf的bypass里面可以利用下,既url里#忽略后面,@忽略前面,绕过一下。另外就是之前看的一篇文章phpcms v9.6.0任意文件上传漏洞,但是这里并不是利用了这个特性,而是程序的漏洞问题。



参考的文章资料:

熊海CMS_V1.0: 审计过程与漏洞分析–黑白天实验室
熊海CMS代码审计–ZAC安全
【PHP代码审计】熊海CMS v1.0–小红书
初级代码审计之熊海 CMS 源码审计–信安之路
熊海cms1.0代码审计–ghtwf01个人博客

你可能感兴趣的:(代码审计,安全,经验分享,php,cms)