dedecms /member/uploads_edit.php SQL Injection Vul

catalog

1. 漏洞描述
2. 漏洞触发条件
3. 漏洞影响范围
4. 漏洞代码分析
5. 防御方法
6. 攻防思考

 

1. 漏洞描述

Dedecms 5.3版本下的member/uploads_edit.php中的未限制文件上传漏洞允许远程攻击者通过上传一个有两个扩展的文件名的文件,然后借助未知向量访问该文件而执行任意代码。这已经通过带.jpg.php的文件名所证实

Relevant Link:

http://cve.scap.org.cn/CVE-2009-2270.html
http://www.cnnvd.org.cn/vulnerability/show/cv_id/2009070008


2. 漏洞触发条件

0x1: POC

<form id="frmUpload" enctype="multipart/form-data" action="http://127.0.0.1/dedecms5.5/member/uploads_edit.php?dopost=save&title=ss&oldurl=1'.php" method="post">
<!-- oldurl是注入点 -->
    <input type="file" name="addonfile" id="addonfile" size="50"><br>
    <input name="mode" type="hidden" value="2">
    <input id="btnUpload" type="submit" value="Upload">
</form>

Relevant Link:

http://www.wooyun.org/bug.php?action=view&id=48894
http://www.2cto.com/Article/201012/80026.html


3. 漏洞影响范围
4. 漏洞代码分析

/member/uploads_edit.php

else if($dopost=='save')
{
    $title = HtmlReplace($title,2);
    if($mediatype==1) $utype = 'image';
    else if($mediatype==2)
    {
        $utype = 'flash';
    }
    else if($mediatype==3)
    {
        $utype = 'media';
    }
    else
    {
        $utype = 'addon';
    }
    $title = HtmlReplace($title,2);
    //获取"."前面的文件名
    $exname = ereg_replace("(.*)/","",$oldurl);
    //获取"."之外的扩展名
    $exname = ereg_replace("\.(.*)$","",$exname);
    //返回上传的文件名
    $filename = MemberUploads('addonfile',$oldurl,$cfg_ml->M_ID,$utype,$exname,-1,-1,true);
    //$filename带入函数查询
    SaveUploadInfo($title,$filename,$mediatype);
    ShowMsg("成功修改文件!","uploads_edit.php?aid=$aid");
}

\member\inc\inc_archives_functions.php

function SaveUploadInfo($title,$filename,$medaitype=1,$addinfos='')
{
    global $dsql,$cfg_ml,$cfg_basedir;
    if($filename=='')
    {
        return false;
    }
    if(!is_array($addinfos))
    {
        $addinfos[0] = $addinfos[1] = $addinfos[2] = 0;
    }
    if($medaitype==1)
    {
        $info = '';
        $addinfos = GetImageSize($cfg_basedir.$filename,$info);
    }
    $addinfos[2] = @filesize($cfg_basedir.$filename);
    $row = $dsql->GetOne("Select aid,title,url From `#@__uploads` where url like '$filename' And mid='".$cfg_ml->M_ID."'; ");
    $uptime = time();
    if(is_array($row))
    {
        $query = "Update `#@__uploads` set title='$title',mediatype='$medaitype',
                     width='{$addinfos[0]}',height='{$addinfos[1]}',filesize='{$addinfos[2]}',uptime='$uptime'
                     where aid='{$row['aid']}'; ";
        $dsql->ExecuteNoneQuery($query);
    }
    else
    {
        //$filename未进行过滤就带入SQL查询,造成SQL注入
        $inquery = "INSERT INTO `#@__uploads`(title,url,mediatype,width,height,playtime,filesize,uptime,mid)
           VALUES ('$title','$filename','$medaitype','".$addinfos[0]."','".$addinfos[1]."','0','".$addinfos[2]."','$uptime','".$cfg_ml->M_ID."'); ";
        $dsql->ExecuteNoneQuery($inquery);
    }
    return true;
}


5. 防御方法

/member/uploads_edit.php

else if($dopost=='save')
{
    $title = HtmlReplace($title,2);
    if($mediatype==1) $utype = 'image';
    else if($mediatype==2)
    {
        $utype = 'flash';
    }
    else if($mediatype==3)
    {
        $utype = 'media';
    }
    else
    {
        $utype = 'addon';
    }
    $title = HtmlReplace($title, 2);
    /* 对$oldurl进行有效过滤 */
    $oldurl = HtmlReplace($oldurl);
    /* */
    $exname = preg_replace("#(.*)/#", "", $oldurl);
    $exname = preg_replace("#\.(.*)$#", "", $exname);
    $filename = MemberUploads('addonfile', $oldurl, $cfg_ml->M_ID, $utype,$exname, -1, -1, TRUE);
    SaveUploadInfo($title, $filename, $mediatype);
    ShowMsg("成功修改文件!", "uploads_edit.php?aid=$aid");
}


6. 攻防思考

Copyright (c) 2015 LittleHann All rights reserved

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sql脚本如下:use kdd99; create table kdd99_accounts ( account_id integer, district_id integer, frequency varchar(20), date DATE ); load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/kdd99_accounts.csv' into table kdd99_accounts CHARACTER SET gb2312 fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n'; create table Kdd99_card( card_id integer, disp_id integer, issued DATE, type varchar(10) ); load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Kdd99_card.csv' into table Kdd99_card CHARACTER SET gb2312 fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n'; create table Kdd99_disp( disp_id integer, client_id integer, account_id integer, type varchar(6) ); load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Kdd99_disp.csv' into table Kdd99_disp CHARACTER SET gb2312 fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n'; create table Kdd99_trans( trans_id integer,account_id integer,date date,type varchar(2),operation varchar(20),amount long,balance long,k_symbol varchar(20),bank varchar(4),account long ); load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Kdd99_trans.csv' into table Kdd99_trans CHARACTER SET gb2312 fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n';请问如何验证客户开通信用卡之后,其账户余额相较于开卡之前是否有提升
05-26
可以通过以下SQL语句来验证客户开通信用卡之后,其账户余额是否有提升: ``` SELECT kdd99_accounts.account_id, kdd99_accounts.frequency, SUM(CASE WHEN Kdd99_trans.type = 'PRIJEM' THEN Kdd99_trans.amount ELSE 0 END) - SUM(CASE WHEN Kdd99_trans.type = 'VYDAJ' THEN Kdd99_trans.amount ELSE 0 END) AS balance_before_card, SUM(CASE WHEN Kdd99_trans.type = 'PRIJEM' AND Kdd99_trans.trans_id > (SELECT MIN(Kdd99_trans.trans_id) FROM Kdd99_trans WHERE Kdd99_trans.account_id = kdd99_accounts.account_id AND Kdd99_trans.type = 'VYBER' AND Kdd99_trans.date > Kdd99_card.issued) THEN Kdd99_trans.amount ELSE 0 END) - SUM(CASE WHEN Kdd99_trans.type = 'VYDAJ' AND Kdd99_trans.trans_id > (SELECT MIN(Kdd99_trans.trans_id) FROM Kdd99_trans WHERE Kdd99_trans.account_id = kdd99_accounts.account_id AND Kdd99_trans.type = 'VYBER' AND Kdd99_trans.date > Kdd99_card.issued) THEN Kdd99_trans.amount ELSE 0 END) AS balance_after_card FROM Kdd99_disp JOIN Kdd99_card ON Kdd99_disp.disp_id = Kdd99_card.disp_id JOIN kdd99_accounts ON Kdd99_disp.account_id = kdd99_accounts.account_id LEFT JOIN Kdd99_trans ON Kdd99_trans.account_id = kdd99_accounts.account_id WHERE Kdd99_card.type = 'VISA' GROUP BY kdd99_accounts.account_id, kdd99_accounts.frequency HAVING balance_after_card > balance_before_card; ``` 该SQL语句会查询出所有开通了VISA信用卡的客户账户,并计算出开卡之前和开卡之后的账户余额,然后筛选出开卡之后账户余额比开卡之前高的客户账户。如果有结果,则说明客户开通信用卡之后其账户余额有提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值