绕过 HTML 实体

Posted

技术标签:

【中文标题】绕过 HTML 实体【英文标题】:Bypass HTML entities 【发布时间】:2019-09-10 06:50:11 【问题描述】:

有没有办法绕过输入清理并进行 html 注入。

这是 bWAPP 的一个练习。当我尝试进行 HTMLi 时,会检查输入验证并清理特殊字符。附加了清理代码,是否有其他方法可以绕过代码并进行 HTML 注入?

function xss_check_3($data, $encoding="UTF-8")

    // htmlspecialchars - convert specialchars to HTML entities
    //  '&'(ampersand) becomes '&'
    // '"'(double quotes) becomes '"' when ENT_NOQUOTES is not set
    // "'"(Single quotes) becomes ''' (or ') only when ENT_QUOTES is 
      set
   // '<'(lessthan) becomes '&lt;'``
   // '>'(greterthan) becomes '&gt;'

  return htmlspecialchars($data, ENT_QUOTES, $encoding);

【问题讨论】:

【参考方案1】:

htmlspecialchars() 是清理 HTML 输入的正确方法。这基本上就是该函数的设计目的。

但请注意,如果输入不是 UTF-8 编码的,则可能会出现问题

htmlspecialchars 上的 php 文档说(强调我的):

某些字符在 HTML 中具有特殊意义,如果要保留其含义,则应由 HTML 实体表示。此函数返回一个带有这些转换的字符串。如果您需要翻译所有关联命名实体的输入子字符串,请改用 htmlentities()。

如果传递给此函数的输入字符串和最终文档共享相同的字符集,则此函数足以准备输入以包含在 HTML 文档的大多数上下文中。 但是,如果输入可以表示最终文档字符集中未编码的字符,并且您希望保留这些字符(作为数字或命名实体),则此函数和 htmlentities()(仅编码具有命名实体等价物)可能是不够的。您可能必须改用 mb_encode_numericentity()。

(然而它不足以防止 SQL 注入)

【讨论】:

以上是关于绕过 HTML 实体的主要内容,如果未能解决你的问题,请参考以下文章

通过实体框架更新时如何绕过唯一键约束(使用 dbcontext.SaveChanges())

使用 html 实体执行跨站点脚本

HTML5画布游戏静态实体元素

htmlspecialchars函数绕过

xss绕过姿势总结

XSS绕过实战练习