[代码审计day1] bluecms v1.6

访问: 6 次

前言

代码审计之路正式开启,从入门级的bluecms分析开始。

开始审计

目录结构

重点文件

几乎所有文件都包含了/include/common.inc.php,基本的函数在/include/common.fun.php

/common.inc.php对输入都经过了addslashes过滤,但遗漏了$_SERVER,getip()未经任何过滤,存在十分大的安全隐患。

SQL注入


这里的$ad_id没有引号闭合,所以addslashes函数对其无效,造成注入。
image.png
同理:在/admin/ad.php

image.png

在/uploads/comment.php

这里用getip()获得IP,上面已经分析过了,没有经过任何过滤,但是这里我用报错注入没有成功,不知道啥原因。最后用了时间盲住。


同理:在/uploads/guest_book.php

$online_ip=getip();
...
elseif ($act == 'send')
{
...
$sql = "INSERT INTO " . table('guest_book') . " (id, rid, user_id, add_time, ip, content) 
            VALUES ('', '$rid', '$user_id', '$timestamp', '$online_ip', '$content')";
...

任意url跳转

在/uploads/user.php

elseif($act == 'do_login'){
$from = !empty($from) ? base64_decode($from) : 'user.php';
  ......
showmsg('欢迎您 '.$user_name.' 回来,现在将转到...', $from);

这里from变量没有经过函数过滤,可以直接利用,不过需要base64编码。

反射型XSS

在/uploads/user.php

 $from = !empty($_REQUEST['from']) ? $_REQUEST['from'] : '';
 ...

elseif($act == 'reg')
{
    if (!empty($_SESSION['user_id']) && $_SESSION['user_id'] != 1)
    {
        showmsg('您已经登录,请先退出登录再注册!');
    }
    if (!isset($_SESSION['last_reg']))
    {
        $_SESSION['last_reg'] = 0;
    }
    elseif ($timestamp - $_SESSION['last_reg'] < 30) 
    {
        showmsg('为防止恶意注册,请于30秒后再来注册!');
    }
    template_assign(array('current_act', 'from'), array('注册新用户', $from));
     $smarty->display('reg.htm');
}

reg.htm
<input type="hidden" name="from" value="{#$from#}" />

image.png

存储型XSS

在/uploads/user.php

elseif ($act == 'do_add_news') {
...
$content = !empty($_POST['content']) ?filter_data($_POST['content']) : '';
...

function filter_data($str)
{
    $str = preg_replace("/<(\/?)(script|i?frame|meta|link)(\s*)[^<]*>/", "", $str);
    return $str;
}

过滤太小孩了直接刚

前端有转义,直接刚
image.png

宽字节拿admin

在/uploads/data/config.php

在/uploads/admin/login.php

elseif($act == 'do_login'){
...
if(check_admin($admin_name, $admin_pwd)){
         update_admin_info($admin_name);
...

function check_admin($name, $pwd)
{
    global $db;
    $row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$name' and pwd = md5('$pwd')");
     if($row['num'] > 0)
     {
         return true;
     }
     else
     {
         return false;
     }
}


END

这个cms可谓是漏洞百出,基本对输入的过滤都是小学生水平,通过一晚上的代码审计,仍在从小型cms慢慢过渡到中型cms的路上。沉下心好好debug,好好跟踪。

署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
Edit with markdown