误用html entities函数引发的漏洞怎么解决

题目代码如下:

误用html entities函数引发的漏洞怎么解决

漏洞解析

根据题目意思,这里考察的应该是个 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 中有用的字符实体表

误用html entities函数引发的漏洞怎么解决

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

  • 这里的 $query 参数可控

  • htmlentities 函数在这里可逃逸单引号

  • xss的漏洞触发点在 <a> 标签。

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

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

误用html entities函数引发的漏洞怎么解决

实例分析

本次实例分析选择 DM企业建站系统 v201710 中的 sql注入漏洞 来进行分析。首先,我们可以从cnvd上面看到一些相关信息,如下:

误用html entities函数引发的漏洞怎么解决

从漏洞通告中可以发现一些有用的信息,漏洞位置在登陆处,搭建的时候提示后台登陆口位置在 admindm-yourname/g.php 文件中,打开这个文件,发现重定向到 admindm-yournamemod_common/login.php 文件中,所以漏洞触发点应该就在这个文件中。

误用html entities函数引发的漏洞怎么解决

打开 admindm-yournamemod_common/login.php 这个文件,一眼就看到漏洞位置,截取部分相关代码如下:

误用html entities函数引发的漏洞怎么解决

第15行 很明显存在sql注入漏洞,通过拼接的方式直接插入到select语句中。 第15行 中的 $user 变量是通过 POST 方式提交上来,其值可控。但是上图的 第3行 代码调用 htmlentitiesdm 函数,对 POST 数据进行了处理,我们跟进这个 htmlentitiesdm 函数。该函数位置在 component/dm-config/global.common.php 文件中,截取关键代码如下:

误用html entities函数引发的漏洞怎么解决

这个函数是调用 htmlentities 函数针对输入的数据进行处理。前面我们已经介绍过了这个函数的用法,这里这个函数的可选参数是 ENT_NOQUOTES ,也就是说两种引号都不转换。下面我们来看个小例子:

误用html entities函数引发的漏洞怎么解决

这里我猜测开发者应该是考虑到了xss的问题,但是由于 htmlentities 这个函数选择的参数出现了偏差,导致这里我们可以引入单引号造成注入的问题。

我们看看最新版是怎么修复,使用 beyond compare 对比两个版本代码的差别。

误用html entities函数引发的漏洞怎么解决

新版修复的时候将可选参数修改为 ENT_QUOTES ,这个参数的作用就是过滤单引号加双引号,我们来看看下面这个例子,就很容易明白了这个参数的作用了。

误用html entities函数引发的漏洞怎么解决

漏洞验证

这里因为没有回显,所以是盲注,下面是验证截图:

误用html entities函数引发的漏洞怎么解决

漏洞修复

针对 htmlentities 这个函数,我们建议大家在使用的时候,尽量加上可选参数,并且选择 ENT_QUOTES 参数。

误用html entities函数引发的漏洞怎么解决

我们看看对比的效果

误用html entities函数引发的漏洞怎么解决

结语

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

<?phprequire 'db.inc.php';if(isset($_REQUEST['username'])){    if(preg_match("/(?:w*)W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST['username'])){        die("Attack detected!!!");    }}if(isset($_REQUEST['password'])){    if(preg_match("/(?:w*)W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST['password'])){        die("Attack detected!!!");    }}function clean($str){    if(get_magic_quotes_gpc()){        $str=stripslashes($str);    }    return htmlentities($str, ENT_QUOTES);}$username = @clean((string)$_GET['username']);$password = @clean((string)$_GET['password']);$query='SELECT * FROM ctf.users WHERE name=''.$username.'' AND pass=''.$password.'';';#echo $query;$result=mysql_query($query);while($row = mysql_fetch_array($result)){    echo "<tr>";    echo "<td>" . $row['name'] . "</td>";    echo "</tr>";}?>
# 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函数引发的漏洞怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

文章标题:误用html entities函数引发的漏洞怎么解决,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/21582

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年8月30日 下午11:22
下一篇 2022年8月30日 下午11:24

相关推荐

  • 如何进行bee-box LDAP注入的环境配置

    一、综述 按照我的学习过程来说,我必须知道我进行web攻击的这个模型和漏洞的原理是什么,现在我就碰到个冷门,最初见到LDAP时是某次在某国企的渗透测试中发现一个冷门(经过授权的),激起了我对它的兴趣。 LDAP的概念: 全称:轻量级目录访问协议(Lightweight Directory Acces…

    2022年9月18日
    14100
  • windows驱动精灵amd安装失败如何解决

    驱动精灵amd安装失败: 1、安装驱动之前应该先查看一下操作系统是否合适。 32位驱动无法安装在64位驱动上。 2、安装前先检测驱动是否余有残留,将其清理干净,不然容易导致失败。 3、装之前可以先进行检测一下,如果缺少安装驱动的组件可以及时安装。 4、安装驱动前可以先将杀毒软件关闭,避免造成阻挠。 …

    2022年9月10日
    10700
  • html中的from标签的作用介绍

    在html中,from标签用于创建供用户输入的HTML表单(表单域),以实现用户信息的收集和传递,form中的所有内容都会被提交给服务器;语法“<form action=”提交地址” method=”提交方式” name=”表单名称&…

    2022年9月16日
    70700
  • windows 0xc00000f4蓝屏如何解决

    0xc00000f4蓝屏解决方法: 方法一: 1、一般来说,内存读取错误的情况只要重启一下电脑就可以解决了。 2、如果重启没解决,那么再次重启,然后在开机时按下“F8”进入如下界面。 3、接着选择其中的“安全模式”进入。 4、进入安全模式后,卸载最近一次电脑使用时安装的驱动和软件,再重启电脑即可。 …

    2022年9月15日
    7900
  • mysql怎么设置最大连接数

    方法一:命令行修改 我们只需要打开mysql的控制台,输入“set GLOBAL max_connections=1000;”语句,就可直接设置最大连接数,如下图所示: 注:这种方法标不治本,只能暂时的修改最大连接数,一点重启mysql,最大连接数又会变回原先设置的值。 方法二:通过mysql配置文…

    2022年9月15日
    9000
  • python找不到文件如何解决

    解决方法: 1、点击进入“此电脑”。 2、右击“此电脑”点击“属性”。 3、点击左侧“高级系统设置”。 4、选择“高级”点击“环境变量”。 5、双击“path”。 6、点击“新建”。 7、将python的路径安装进去即可。 读到这里,这篇“python找不到文件如何解决”文章已经介绍完毕,想要掌握这…

    2022年9月8日
    58300
  • mysql如何实现分组求和

    在mysql中,可以利用“GROUP BY”关键字和SUM()函数来实现分组求和,语法为“SELECT SUM(进行求和的字段名) FROM 表名 GROUP BY 需要进行分组的字段名;”。“GROUP BY”关键字可以根据一个或多个字段对查询结果进行分组,而SUM()函数根据分组情况分别返回不同…

    2022年9月21日
    66000
  • Word尾注和交叉引用的区别是什么

    尾注和交叉引用的区别: 答:尾注是给选中的文字添加注释,存在于文章的结尾。 而交叉引用则是把脚注和尾注以及题注全部都交叉在一起使用。 一个是针对标题和结尾,一个仅仅是存在于文章的结尾。 尾注和交叉引用更多介绍: 1、尾注是可以放在文章页面的最下面的,可以对一些元素加以说明。 2、还可以将引用文章的出…

    2022年8月31日
    21800
  • windows ddu卡在清理注册表如何解决

    解决方法: 1、其实卡在清理注册表是因为win10系统版本不兼容导致的无法正常显示问题。 2、虽然软件没有提示清理成功,但是显卡驱动程序其实已经完成清理或卸载了。 3、所以大家不需要担心,卡在清理注册表一段时间后,直接关闭或推出软件即可。 4、如果我们不确定的话,可以打开“设备管理器” 5、然后在显…

    2022年9月20日
    10100
  • 如何分析Win7蓝屏的解读和应对方案

    近期,深信服接到不少客户咨询关于Win7蓝屏大爆发的问题,大概内容指“Win7服役结束,微软不再更新补丁,电脑集体蓝屏,错误代码为F4,蓝屏与漏洞补丁有关联等等,并呼吁用户不要修复漏洞补丁”。 不过,从深信服收集上来的问题来看,并没有出现企业大规模Win7蓝屏的现象。我们通过追溯,发现比较早出现这一…

    2022年9月6日
    8700
联系我们
站长微信
站长微信
分享本页
返回顶部