误用htmlentities函数引发的漏洞怎么解决
这篇文章主要介绍了误用html entities函数引发的漏洞怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇误用html entities函数引发的漏洞怎么解决文章都会有所收获,下面我们一起来看看吧。
为乐东黎族等地区用户提供了全套网页设计制作服务,及乐东黎族网站建设行业解决方案。主营业务为网站设计制作、网站制作、乐东黎族网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
题目代码如下:
漏洞解析:
根据题目意思,这里考察的应该是个 xss漏洞, 漏洞触发点应该在代码中的 第13-14行。这两行代码的作用是直接输出一个html的 标签。代码中的 第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。我们先梳理一些已知信息:
在 中,我们可以通过 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联系我们。Day12的分析文章就到这里,我们最后留了一道CTF题目给大家练手,题目如下:
"; echo "" . $row['name'] . " "; echo ""; } ?>
# Host: localhost (Version: 5.5.53) # Date: 2018-08-05 12:55:29 # Generator: MySQL-Front 5.3 (Build 4.234) /*!40101 SET NAMES utf8 */; # # Structure for table "users" # DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `pass` varchar(255) DEFAULT NULL, `flag` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; # # Data for table "users" # /*!40000 ALTER TABLE `users` DISABLE KEYS */; INSERT INTO `users` VALUES (1,'admin','qwer!@#zxca','hrctf{sql_Inject1on_Is_1nterEst1ng}'); /*!40000 ALTER TABLE `users` ENABLE KEYS */;
关于“误用html entities函数引发的漏洞怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“误用html entities函数引发的漏洞怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注创新互联行业资讯频道。
本文标题:误用htmlentities函数引发的漏洞怎么解决
分享URL:http://hbruida.cn/article/pcesod.html