专栏首页玄魂工作室看代码学安全(12)误用htmlentities函数引发的漏洞

看代码学安全(12)误用htmlentities函数引发的漏洞

原文链接:https://zhuanlan.zhihu.com/p/47353814

本文由红日安全成员: l1nk3r 编写,如有不当,还望斧正。

前言

大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。现在大家所看到的系列文章,属于项目 第一阶段 的内容,本阶段的内容题目均来自 PHP SECURITY CALENDAR 2017 。对于每一道题目,我们均给出对应的分析,并结合实际CMS进行解说。在文章的最后,我们还会留一道CTF题目,供大家练习,希望大家喜欢。下面是 第12篇 代码审计文章:

Day 12 - String Lights

题目代码如下:

漏洞解析 :

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

htmlentities — 将字符转换为 HTML 转义字符 string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] ) 作用:在写PHP代码时,不能在字符串中直接写实体字符,PHP提供了一个将HTML特殊字符转换成实体字符的函数 htmlentities()。

注:htmlentities() 并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数)。第2个参数取值有3种,分别如下:

  • ENT_COMPAT(默认值):只转换双引号。
  • ENT_QUOTES:两种引号都转换。
  • ENT_NOQUOTES:两种引号都不转换。

这里附上一个 HTML 中有用的字符实体表

经过上面的分析,我们再回到题目,想想如何构造一下攻击 payload 。我们先梳理一些已知信息:

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

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

/?a'onclick%3dalert(1)%2f%2f=c

实例分析

本次实例分析选择 DM企业建站系统 v201710 中的 sql注入漏洞 来进行分析。首先,我们可以从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 参数。

我们看看对比的效果

结语

看完了上述分析,不知道大家是否对 htmlentities 函数在使用过程中可能产生的问题,有了更加深入的理解,文中用到的代码可以从 这里 下载,当然文中若有不当之处,还望各位斧正。如果你对我们的项目感兴趣,欢迎发送邮件到 hongrisec@gmail.com 联系我们。

本文分享自微信公众号 - 玄魂工作室(xuanhun521)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shell模板变量替换

    我们经常使用一些模板语言来处理一些变量替换。比如jsp,php,velocity,freemarker,thymeleaf等。那对于shell来说,应该怎样替换...

    Ryan-Miao
  • WP插件 Antivirus 汉化版 —— 免受后门主题的困扰

    AntiVirus,一款扫描当前使用主题可能存在恶意代码的WordPress插件,主要扫描主题模板中存在的不知名代码和加密代码。扫描后将结果给出供管理员手动判断...

    神无月
  • 一名 40 岁“老”程序员的反思……

    “今年我快40岁了,做过Java开发、带过团队,也在一家A轮企业做过CTO,但是学历本科,没有大厂背书,‘上了年纪’,不够互联网化,看似十几年经验,但有什么用处...

    养码场
  • 浅析php.ini设置与Web安全

    php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如 system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的...

    周俊辉
  • 「大学生学编程系列」第六篇:如何学习C语言?

    现在很多人初学者直接选择C语言的人已经变得越来越少了,主要原因还是在招聘岗位数量上无法和java,php等高级语言想媲美,但并不代表C语言已经穷途末路没有前景了...

    程序员互动联盟
  • Web安全开发规范手册V1.0

    团队最近频繁遭受网络攻击,引起了部门技术负责人的重视,笔者在团队中相对来说更懂安全,因此花了点时间编辑了一份安全开发自检清单,觉得应该也有不少读者有需要,所以将...

    汤青松
  • 干货|Python 获取网易云音乐热门评论

    最近在研究文本挖掘相关的内容,所谓巧妇难为无米之炊,要想进行文本分析,首先得到有文本吧。获取文本的方式有很多,比如从网上下载现成的文本文档,或者通过第三方提供的...

    fishexpert
  • 用KODExplorer建私有云,打开网页就能远程访问文件!

    这里主要利用基于PHP开发的KODExplorer来搭建私有云,蒲公英异地组网实现服务的远程访问。

    之至top
  • web统计原理及实现方法汇总总结—网站统计中的数据收集

    在php、jsp、asp后端总揽一切的时代,网站统计基本是后台的事情——其实web开发,也没有前端这个职位,网站设计(现在的UI)不仅要前途还要用dreamwa...

    周陆军
  • 在 LNMP 一键安装包的环境下安装 ThinkPHP5 访问报错 500 的解决方法

    目前 LNMP 一键安装包已经是 1.5 的版本了,一个朋友找我帮她看服务器环境的时候出现了这个问题,修改伪静态目录不生效

    沈唁

扫码关注云+社区

领取腾讯云代金券