" XSS易容术---bypass之编码混淆篇+辅助脚本编写"

一、前言
本文原创作者:vk,本文属i春秋原创奖励计划,未经许可禁止转载!
很多人对于XSS的了解不深。
一提起来就是:“哦,弹窗的”、”哦,偷cookie的。”
骚年,你根本不知道什么是力量。虽然我也不知道,哈哈。
好了,不瞎扯了,进入今天的主题:
XSS易容术---bypass之编码混淆

二、正文
1、总括
很多时候,我们的一些关键字被过滤。
直接闭合前面payload,插入测试语句<script>alert(/xss/)</script>
是弹不出窗的。
原因有很多,过滤方式也有很多,所以绕过的姿势自然也不少。
但并不是什么情况都能绕过的,例如:

[JavaScript] 纯文本查看 复制代码

?


1

2

3

<div>

  <?php echo htmlspecialchars($_POST[‘xss‘]); ?>

</div>

接收过来的数据,被php函数htmlspecialchars处理
这个函数是转实体,转实体后,你再怎么折腾,也绕过不了。

2、xss常用的编码
第一个,html实体编码,例如:alert()
第二个,进制类,例如:\x61\x6c\x65\x72\x74\x60\x78\x73\x73\x60,某些时候,也有不带x,例如:\5c\6a
第三个,Unicode,例如:\u0061\u006c\u0065\u0072\u0074\u0060\u4e2d\u6587\u4e5f\u53ef\u4ee5\u0060
第四个,纯转义,例如:\‘   \"   \<   \> ,这样的在特殊字符前加\进行转义。
先变个魔术,猜猜这样的代码能不能成功弹窗。

[JavaScript] 纯文本查看 复制代码

?


1

<img src=# onerror=eval("\x61\x6c\x65\x72\x74\x28\x2fxss/)")>

 
|
|不
|准
|偷
|看
|
|
|
|
好吧,可以弹窗如图:
 
那这样呢:

[JavaScript] 纯文本查看 复制代码

?


1

<img src="javascript:alert(1)">

|
|
|
|不
|准
|偷
|看
|
|
|
|
|
|
|
是不行的哦!你可以自己试试
 
是不是颠覆了你的xss观。
什么?js伪协议不能用了?
哈哈,其中奥妙无穷,跟我一起来探索吧。

3、编码的正确使用姿势。
3.1    总论
我相信很多人都知道,是有那么几个编码是运用在xss的bypass里的(bypass就是绕过)
但是具体怎么用,什么时候用,在哪里用,并不清楚。
这可是有讲究的,瞎用的话浏览器可不帮你解析。
除非你有这个工具:

它会告诉你什么时候,用什么编码,辅助你学习。
什么?这个工具在哪?
额,没错,这是笔者自己写的,在后面会放出源码~~
好了废话不多说,总结如下:
3.2    编码运用总结
html标签中:

  • html中当然会支持html实体编码,例如&#61,也有&lt;
  • 支持十六进制,但是要以&#x开头,其中x大写小写无所谓。
  • 支持十进制,要以&#开头,注意,没有x哦。
  • 支持数字部分高位补充0,例如&#00000000061,&#61这两是一样的。
  • 可能你已经发现了,后缀有没有;  都无所谓

javascript中:

  • eval函数里,支持十六进制,但是要以 \x 开头,x只能小写!必须两位,例如:\x5c
  • eval函数里,支持八进制,但是要以 \ 开头。必须两位,例如:\134
  • eval函数里,还支持\u前缀的unicode,本质是:16进制的ascii码。必须是四位,例如:\u005c

注意了,这个可和html实体编码不一样,对格式比较严格,不能随便在数字部分补充0。

聪明的童鞋可能已经发现了:
为什么第一个说的是html标签,第二个没说script标签呢?
以为js代码不一定要在script标签中啊。
比如这个:

[JavaScript] 纯文本查看 复制代码

?


1

<img src=# onerror=alert(/xss/)>

这就是在on事件中。
这样会出现什么有意思的事情呢?
细心的同学也许发现了,没错,是混合双打:

2016-12-30 18:38 上传

img是html标签,里面用html编码是没问题的,而on事件里面可以直接解析js代码,
于是我使用eval函数,然后用js支持的编码替换内容,一样可以成功弹窗。
复杂使用起来就如一开始那副图那样,用了多种编码。

也可以这样:
 
书上还有说css里支持\开头的十六进制,但是笔者实验没有成功。Orz(ps:书比较旧,现在浏览器不支持很正常)

4、献上辅助脚本源码(html+js)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>xss编码转换器</title>
    <script>
    //提示框
        function tips(param){
            str=document.getElementById(‘tip‘);
            switch(param){
                case "&#":
                    str.innerHTML="提示:这个前缀只在html标签里才有效哦";
                break;
 
                case "bfstrin":
                    str.innerHTML="提示:对对,就是这里,输入需要编码的字符吧,例如:alert()";
                break;
 
                case "bfstrout":
                    str.innerHTML="提示:写好要转码的字符了吧,选择前缀后缀,以及位数哦。";
                break;
 
                case "\\x":
                    str.innerHTML="提示:这个前缀在eval里面有效哦,注意:必须选择16进制。";
                break;
 
                case "\\u":
                    str.innerHTML="提示:这个前缀在eval里面有效哦,注意:必须选择16进制,只能是四位(自动改好)。";
                break;
 
                case "\\":
                    str.innerHTML="提示:这个在css里面有效哦,但是只要ie6以前的浏览器才支持,Orz。";
                break;
 
                case "%":
                    str.innerHTML="提示:这个放在url里有效哦,%bf%27可是能干掉GBK的。";
                break;
 
                case " ":
                    str.innerHTML="提示:这个。。你竟然不要前缀了。";
                break;               
 
                case "af":
                    str.innerHTML="提示:这个只能配合&#用,而且可有可无。";
                break;
 
                case "jz":
                    str.innerHTML="提示:想换什么进制,eval只支持8进制和16进制,html标签支持10进制和16进制。";
                break;               
 
                case "num":
                    str.innerHTML="提示:html实体编码(&#)里面,ascii码前面可以任意插0,别的都不行。";
                break;               
 
                case "go":
                    str.innerHTML="提示:期待很久了吧,那啥,那个,失败了也和我没关系。。";
                break;               
 
                case "no":
                    str.innerHTML="提示:别,千万别,别按这个按钮,地球会毁灭。";
                break;
            }
        }
 
    //获取参数
        function getparam(){
            var bf=document.getElementById(‘bf‘).value;
            var af=document.getElementById(‘af‘).value;
            var jz=document.getElementById(‘jz‘).value;
            var num=document.getElementById(‘num‘).value;
            var param=[];
            param[0]=bf;
            param[1]=af;
            param[2]=jz;
            param[3]=num;
            return param;   
        }
 
    //取数,转ascii
        function enasc(){
            enstr=document.getElementById(‘bfstr‘).value;
            var bfstrarr=new Array();
            for(i=0;i<enstr.length;i++){
                tmpstr=enstr.substr(i,1);
                bfstrarr[i]=tmpstr.charCodeAt();
            }
            return bfstrarr;
        }
 
    //编码主函数
        function enxsscode(){
            var param=getparam();
            var bfstrarr=enasc();
            var destr="";
            for(i=0;i<bfstrarr.length;i++){
                bfstrarr[i]=bfstrarr[i].toString(param[2]);   //换进制
                var bu=0;
                if(param[0]=="\\u")
                    bu=4-String(bfstrarr[i]).length+1;
                else
                    bu=param[3]-String(bfstrarr[i]).length+1;
                 
                if(param[2]==16 && param[0]=="&#")
                    destr+=param[0]+"x"+new Array(bu).join(‘0‘)+""+bfstrarr[i]+""+param[1];
                else if(param[2]==16 && param[0]=="\\u"){
                    destr+=param[0]+new Array(bu).join(‘0‘)+""+bfstrarr[i]+""+param[1];
                }else{   
                    destr+=param[0]+new Array(bu).join(‘0‘)+""+bfstrarr[i]+""+param[1];
                }           
            var afstr=document.getElementById(‘afstr‘);
            afstr.value=destr;
            }
        }
    </script>
</head>
<style>
    #bg{
        text-align: center;
        margin:0 auto;
        border:2px ridge red;
        width:1200px;
        height:700px;
    }
    #header{
        background: #2f2f2f;
        border-bottom: 7px solid #a1cc33;
        height:60px;
        padding-top: 10px;
    }
    #left{
        float: left;
        border: 2px solid black;
        width: 500px;
        height: 500px;
        margin-left: 50px;
        margin-top: 20px;
    }
    #right{
        float: right;
        border: 2px solid black;
        width: 500px;
        height: 500px;
        margin-right: 50px;
        margin-top: 20px;
    }
    #mid{
        float: left;
        border: 2px solid green;
        width: 70px;
        height: 500px;
        margin-left: 10px;
        margin-top: 20px;       
    }
    #tip{
         
        margin-top: 15px;
        margin-bottom: 0px;
        height: 20px;
        text-align: center;
        color: red;
    }
    .param{
        margin-left: 2px;
        width: 55px;
    }
</style>
<body>
    <div id="bg">
        <div id="header">
            <h1 >XSS编码转换器</h1>-made by vk
        </div>
 
        <!--主体 -->
        <form action="" method="post">
        <div id="tip">
            提示:左边区域输入待转码的字符
        </div>
        <div id="left">
            <textarea name="bfstr" id="bfstr" cols="30" rows="10"
             ></textarea>
        </div>
        <div id="mid">
                <p >前缀:<br></p>
                <select name="bf" id="bf" class="param">
                    <option value="&#">&#</option>
                    <option value="\u">\u</option>
                    <option value="\x">\x</option>
                    <option value="\">\</option>
                    <option value="%">%</option>
                    <option value=" "> </option>
                </select>
                <br><br>
                后缀:
                <input type="text" id="af" name="af" value=";" class="param" />
                <br><br>
                进制:
                <select name="jz" id="jz" class="param">
                    <option value="8">8</option>
                    <option value="10">10</option>
                    <option value="16">16</option>
                </select>
                <br><br>
                位数:
                <input type="text" id="num" name="num" value="4" class="param" />
                <br><br>
                <input type="button" id="" name="" value="编码-->" class="param" />
                <br><br>
                <input type="button" id="" name="" value="<--解码" class="param"/>
                <br><br>
                <input type="button" id="" name="" value="jsfuck" class="param" />
        </div>
        <div id="right">
            <textarea name="afstr" id="afstr" cols="30" rows="10"  ></textarea>
        </div>
        </form>
    </div>
</body>
</html>

 

时间: 2024-11-03 21:58:55

" XSS易容术---bypass之编码混淆篇+辅助脚本编写"的相关文章

PHP 高级程序设计(1) - 编码规范及文档编写

PHP 高级程序设计学习笔记20140612 软件开发中的一个重要环节就是文档编写.他可以帮助未来的程序维护人员和使用者理解你在开发时的思路.也便于日后重新查看代码时不至于无从下手.文档还有一个重要的作用,在不用了解要访问对象的细节情况下也能很好的在对象之间进行交互.文档的编写有一些成熟的行业标准格式,遵守这些行业标准将有助于创建易于阅读的代表,并使自动生成手册成为可能. 编码规范 编码规范可能很多开发人员都有各自的观点也意见,且大家不尽相同.其实只要团队成员之间达成一致,遵循同一个标准就好.

【web安全】第二弹:XSS攻防中的复合编码问题

最近一直在研究XSS的攻防,特别是dom xss,问题慢慢的迁移到浏览器编码解码顺序上去. 今儿被人放鸽子,无奈在KFC看了两个小时的资料,突然有种豁然开朗的感觉. 参考资料先贴出来: 1. http://www.freebuf.com/articles/web/43285.html 2. http://www.freebuf.com/articles/web/10121.html 3. http://www.wooyun.org/whitehats/%E5%BF%83%E4%BC%A4%E7%

混淆篇之字符串常见操作方法小结

1.0String 对象属性 属性 描述 constructor 对创建该对象的函数的引用 length 字符串的长度 prototype 允许您向对象添加属性和方法 2.0String 对象方法 方法 描述 anchor() 创建 HTML 锚. big() 用大号字体显示字符串. blink() 显示闪动字符串. bold() 使用粗体显示字符串. charAt() 返回在指定位置的字符. str.charAt(index)方法:获取指定索引 位置的字符,索 引从0开始,,//str[0]-

CSS编码设置篇utf-8与gb2312互转换

一.查看CSS文件编码 1.高版本DW新建将自带编码charset代码 在CSS文件中没有编码声明代码也不代表CSS文件没有编码这一特征,在高版本的DW软件中新建CSS文件会自动添加上编码声明代码. @charset "utf-8"; /*css Document*/ 2.在CSS文件中没有发现charset编码代码如何查看编码类型? 在DW软件中,打开CSS文件后,DW代码右下角状态栏可以看出当前CSS文件编码类型 /*CSS divcss* 石家庄水泵厂/ body{text-al

SpringBoot日记——编码配置篇

插入一个小篇章,有人在编写代码的时候,要么控制台乱码,要么页面乱码等等, 我这里有个配置,可以解决各种乱码问题,直接来看. # ==================== 编码配置 ==================== spring.banner.charset=UTF-8 server.tomcat.uri-encoding=UTF-8 spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.ht

混淆篇之数组的常用方法总结

序号 方法 举例 是否改变当前数组 1  instanceof 判断变量是否是数组对象 console.log(arr instanceofArray);//true 否 2  join   将数组的元素组起一个字符串   join(separator) //将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符 arr1 = [1,2,3,4,5]; result = arr1.join("|"); //a:[1,2,3,4,5] b:"1

【转发】前端进阶篇之如何编写可维护可升级的代码

原文出处: 叶小钗(@欲苍穹)   欢迎分享原创到伯乐头条 前言 我还在携程的做业务的时候,每个看似简单的移动页面背后往往会隐藏5个以上的数据请求,其中最过复杂的当属机票与酒店的订单填写业务代码 这里先看看比较“简单”的机票代码: 然后看看稍微复杂的酒店业务逻辑: 机票一个页面的代码量达到了5000行代码,而酒店的代码竟然超过了8000行,这里还不包括模板(html)文件!!! 然后初略看了机票的代码,就该页面可能发生的接口请求有19个之多!!!而酒店的的交互DOM事件基本多到了令人发指的地步:

【组件化开发】前端进阶篇之如何编写可维护可升级的代码

前言 我还在携程的做业务的时候,每个看似简单的移动页面背后往往会隐藏5个以上的数据请求,其中最过复杂的当属机票与酒店的订单填写业务代码 这里先看看比较“简单”的机票代码: 然后看看稍微复杂的酒店业务逻辑: 机票一个页面的代码量达到了5000行代码,而酒店的代码竟然超过了8000行,这里还不包括模板(html)文件!!! 然后初略看了机票的代码,就该页面可能发生的接口请求有19个之多!!!而酒店的的交互DOM事件基本多到了令人发指的地步: 当然,机票团队的交互DOM事件已经多到了我笔记本不能截图了

第16篇 Shell脚本基础(一)

1.什么是shell?shell是一个命令解释器. 是介于操作系统内核与用户之间的一个绝缘层.对于一个linux系统使用人员来说,shell是你驾驭类linux系统最基本的工具.所有的系统命令和工具再加上应用程序,对于shell脚本来说,都是可调用的.shell扮演者操作系统内核和用户的中间人的角色,用户通过键入shell command,然后shell通过解析用户输入,然后将请求转发给操作系统的内核进行处理. 1)一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系