【漏洞练习-Day12】DM企业建站系统 v201710 中的 sql注入漏洞【CNVD-2017-34212】

开始练习【红日团队】的PHP-Audit-Labs 代码审计 Day12
链接:https://github.com/hongriSec/PHP-Audit-Labs
感兴趣的同学可以去练习练习
预备知识:
内容题目均来自 PHP SECURITY CALENDAR 2017
Day 12 - String Lights代码如下:

$sanitized = [];

foreach ($_GET as $key => $value) {
  $sanitized[$key] = intval($value);
}

$queryParts = array_map(function ($key, $value) {
  return $key . '=' . $value;
}, array_keys($sanitized), array_values($sanitized));

$query = implode('&', $queryParts);

echo "<a href='/images/size.php?" .
  htmlentities($query) . "'>link</a>";

漏洞解析 :
根据题目意思,这里考察的应该是个 xss漏洞 , 漏洞触发点应该在代码中的 第13-14行。这两行代码的作用是直接输出一个html的<a>标签。代码中的 第3-5行foreach循环$_GET传入的参数进行了处理,但是这里有个问题。我们看下 第4行 的代码,这行代码针对 $value进行类型转换,强制变成int类型。但是这部分代码只处理了$value变量,没针对 $key变量进行处理。经过了 第3-5行 的代码处理之后,根据 &这个符号进行分割,然后拼接到 第13行echo语句中,在输出的时候又进行了一次htmlentities 函数处理。 htmlentities函数主要是会对一些特殊符号进行HTML实体编码。
具体定义如下:

htmlentities() 函数

功能:

htmlentities() 函数把字符转换为 HTML 实体。

定义:

htmlentities(string,flags,character-set,double_encode)

说明:
参数 描述
string 必需。规定要转换的字符串。
flags 可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
character-set 可选。一个规定了要使用的字符集的字符串。
double_encode 可选。一个规定了是否编码已存在的 HTML 实体的布尔值。
  • ENT_COMPAT(默认值):只转换双引号。
  • ENT_QUOTES:两种引号都转换。
  • ENT_NOQUOTES:两种引号都不转换。

范例:

在这里插入图片描述
这里附上一个 HTML 中有用的字符实体表
在这里插入图片描述
经过上面的分析,我们再回到题目,想想如何构造一下攻击payload。我们先梳理一些已知信息:

  • 这里的$query 参数可控
  • htmlentities函数在这里可逃逸单引号
  • xss的漏洞触发点在 <a>标签。

<a>中,我们可以通过 javascript 事件来执行js代码,例如: onclick这类事件,因此最后的poc构造如下:

http://10.211.55.2:100/day12/xss.php?a=a'onclick%3dalert(1)%2f%2f=c

在这里插入图片描述

实例分析:

本次实例分析, DM企业建站系统 v201710 中的 sql注入漏洞 来进行分析 。

漏洞POC 本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!

漏洞分析:

首先,我们可以从cnvd上面看到一些相关信息,如下:
在这里插入图片描述
从漏洞通告中可以发现一些有用的信息,漏洞位置在登陆处,搭建的时候提示后台登陆口位置在 admindm-yourname/g.php文件中
在这里插入图片描述
打开这个文件,发现重定向到 admindm-yournamemod_common/login.php 文件中,所以漏洞触发点应该就在这个文件中。

打开 admindm-yournamemod_common/login.php这个文件,一眼就看到漏洞位置,截取部分相关代码如下:
在这里插入图片描述
第15行很明显存在sql注入漏洞,通过拼接的方式直接插入到select语句中。 第15行中的 $user变量是通过POST 方式提交上来,其值可控。但是上图的 第3行 代码调用 htmlentitiesdm函数,对 POST 数据进行了处理,我们跟进这个 htmlentitiesdm函数。该函数位置在 component/dm-config/global.common.php文件中,截取关键代码如下:
在这里插入图片描述
这个函数是调用 htmlentities函数针对输入的数据进行处理。前面我们已经介绍过了这个函数的用法,这里这个函数的可选参数是ENT_NOQUOTES,也就是说两种引号都不转换。下面我们来看个小例子:
在这里插入图片描述
这里我猜测开发者应该是考虑到了xss的问题,但是由于htmlentities这个函数选择的参数出现了偏差,导致这里我们可以引入单引号造成注入的问题。

我们看看最新版是怎么修复,使用 beyond compare 对比两个版本代码的差别。
在这里插入图片描述
新版修复的时候将可选参数修改为 ENT_QUOTES ,这个参数的作用就是过滤单引号双引号,我们来看看下面这个例子,就很容易明白了这个参数的作用了。
在这里插入图片描述

漏洞利用:

这里因为没有回显,所以是盲注,下面是验证截图:
在这里插入图片描述

修复建议:

针对htmlentities这个函数,我们建议大家在使用的时候,尽量加上可选参数,并且选择 ENT_QUOTES参数。
在这里插入图片描述
我们看看对比的效果

在这里插入图片描述

结语

再次感谢【红日团队】

发布了35 篇原创文章 · 获赞 19 · 访问量 5188

猜你喜欢

转载自blog.csdn.net/zhangpen130/article/details/104022862