XSS编码剖析

0×00 引言

很多不了解html、js编码的童鞋挖掘xss漏洞时,都是一顿乱插,姿势对了,就能获得快感,姿势不对,就么反应。另外在freebuf里,有很多文章介绍过跨站编码,有兴趣的,可以搜索下。

本文介绍常见的编码方法,能力不足,如有其他意见,请指正。

0×01 常用编码

URL编码:一个百分号和该字符的ASCII编码所对应的2位十六进制数字,例如“/”的URL编码为%2F(一般大写,但不强求)

HTML实体编码:

命名实体:&开头,分号结尾的,例如“<”的编码是“&lt;

字符编码:十进制、十六进制ASCII码或unicode字符编码,样式为“&#数值;,例如“<”可以编码为“&#060;”和“&#x3c;

JS编码:js提供了四种字符编码的策略,

1、三个八进制数字,如果不够个数,前面补0,例如“e”编码为“\145”
2、两个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\x65”
3、四个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\u0065”
4、对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)


CSS编码:用一个反斜线(\)后面跟1~6位的十六进制数字,例如e可以编码为“\65”或“65”或“00065”

复合编码:

所谓复合编码,也就是说输出的内容输出在多个环境中,例如

<td οnclick=”openUrl(add.do?userName=’<%=value%>’);”>11</td>

value的内容首先出现在一个URL中,这个URL在一段javascript总,而javascript代码又是html的一部分。所以解码的顺序就是HTML解码–>js解码–>url解码,那么正确的编码顺序就应该是url编码–>js编码–>html编码。

0×02基本概念

HTML解析器能识别在文本节点和参数值里的实体编码,并在内存里创建文档树的表现形式时,透明的对这些编码进行解码。

例如以下两种写法的功能是一样的(忽略里面的空格。。鄙视下这个编辑器):

<img src="http://www.example.com">
<img src="ht&# x74;p&#x3a;//www.example.com">

而下面的两个例子,实际上却没法真的加载图片,因为这种编码干扰了标签本身的结构。

<img src&# x3d;"http://www.example.com">
<img s&# x72;c="http://www.example.com">

下面了解下浏览器解析HTML的步骤:浏览器收到从服务器发送来的HTML内容,会从头解析,当遇到<script></script>时,会调用javascript脚本解析器解析javascript,并执行脚本,然后继续解析其他的HTML内容,对于一些需要触发才能执行的事件,当触发事件发送时,脚本解析器才会解析其中的脚本,在事件触发之前,它是HTML的一部分。

0×03实例剖析

3.1 HTML–>js编码

代码如下:

<?php
 
function htmlencode($str){
   if(empty($str)) return;
   if($str == "") return;
 
   $str = str_ireplace("<","",$str);
   $str = str_ireplace(">","",$str);
   $str = str_ireplace("script","",$str);
   $str = str_ireplace("img","",$str);
   $str = str_ireplace(":","",$str);
   $str = str_ireplace("javascript","",$str);
 
   return $str;
}
 
if(!array_key_exists ("name",$_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
 
 $isempty = true;
 
} else {
             
 $html .= '<pre>';
 $html .= '<a οnclick=" ' .htmlencode($_GET['name']).'">click this url</a>';
 $html .= '</pre>';
 
}
?>
 
<html>
<script>
 
</script>
</html>

可以看到,过滤了尖角号,script等标签,当输入javascript:alert(/xss/)时,系统返回的为:

我们现在分析一下$name的环境,$name先在html环境中,然后在javascript环境(onclick事件)中,浏览器解析的顺序是html解码–>js解码,所以我们将javascript:alert(/xss/)进行html编码,从而可以绕过限制(当然此处代码还有其他好几种绕过的方式,此处只是简单说明编码问题),因为在javascript解码时,$name已经被html解码了,那么处在javascript中的$name变量就是正常的js代码。

源代码为:

3.2 js–>html编码

代码如下:

<?php
 
if(!array_key_exists ("name",$_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
 
   $isempty = true;
 
} else {
   $value = $_GET['name'];
   $html .= '<pre>';
   $html .= "Your Name is :
       <div id='a'></div>
       <script>
           document.getElementById('a').innerHTML= "."'".htmlspecialchars($value)."'".";
       </script>
 ";
   $html .= '</pre>';
 
}
 
?>

可以看到,$value使用了htmlspecialchars进行了编码,htmlspecialchars会对&<>进行html编码,当输入<img src=1 οnerrοr=alert(/xss/)>时,系统不会弹框,因为特殊符号被html编码了。

我们现在分析下$value的环境,$value先在javascript中,然后在html环境中(通过innerHTML操作html),所以浏览器解码顺序为js解码–>html解码,所以我们可以对$value进行js编码,绕过htmlspecialchars限制,因为$value在html解码时,已经是正常的html代码了。

3.3 URL编码

此外,如果&等符号被过滤的话,可以对其进行URL编码,然后测试。

0×04 Tips

1、DOM:只有使用合规的完整闭合的HTML区块对每个innerHTML节点进行赋值,因为这样才不会改变被重写段落之外的文档层级结构。如果格式不对,在重写发生之前输入的数据会先按照规定的语法进行强制转换。

即通过DOM操作HTML时,可以使用<script>alert(/xss/)来代替<script>alert(/xss/)</script>,因为DOM会自动补全。

2、innerHTML只能使用<img src=1οnerrοr=alert(1)>这种方式来触发JS。而不能以<script>alert(1)</script>来触发,因为这种压根不会执行<script>..</script>之间的内容。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于DVWA(Damn Vulnerable Web Application)中的XSS(跨站脚本攻击)漏洞修复代码的分析,我可以给出一些简要的指导。 首先,我们需要理解XSS攻击的原理。XSS攻击是指攻击者通过在网页中注入恶意脚本来利用网站的漏洞,从而在用户浏览器中执行该脚本。DVWA是一个故意设计的漏洞应用程序,用于帮助开发人员了解和测试常见的Web应用程序漏洞。 在DVWA中,有一个名为"XSS - Stored"的漏洞模块,用于模拟存储型XSS漏洞。攻击者可以通过在留言板或评论系统中输入恶意脚本,然后当其他用户查看或访问该页面时,恶意脚本将在其浏览器中执行。 为了修复这个漏洞,你可以参考以下步骤: 1. 输入验证和过滤:对于用户输入的内容,应该进行适当的验证和过滤,以防止恶意脚本的注入。可以使用编程语言提供的函数或正则表达式对输入进行过滤和验证。 2. 转义输出:在将用户输入显示到网页上之前,需要对其进行转义处理。转义是指将特殊字符转换为其HTML实体编码,以防止浏览器将其解释为标记或脚本。 3. 内容安全策略(Content Security Policy,CSP):CSP是一种安全策略,可以通过限制网页中允许加载的资源来减少XSS攻击的风险。通过在HTTP响应报头中设置CSP,可以指定允许加载的资源类型、来源和策略。 4. 定期更新:及时更新DVWA应用程序和相关的依赖库,以确保漏洞修复和最新安全补丁的应用。 请注意,这只是一个简要的指导,实际修复过程可能会因具体情况而有所不同。在进行修复时,建议参考安全编程指南和最佳实践,并在测试环境中进行充分测试,以确保修复的有效性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值