一、前言
本文原创作者: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>

 

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

  1. SWF加解密资源索引之加密混淆篇【转】

    ============================ SWF加解密资源索引之加密混淆篇 ============================ [心得] swf加密混淆器(带源码) http:/ ...

  2. BAT脚本编写教程简单入门篇

    BAT脚本编写教程简单入门篇 批处理文件最常用的几个命令: echo表示显示此命令后的字符 echo on  表示在此语句后所有运行的命令都显示命令行本身 echo off 表示在此语句后所有运行的命 ...

  3. BAT脚本编写教程入门提高篇

    BAT脚本编写教程入门提高篇 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”. %[1-9]表示参数,参数是指在运行批处理 ...

  4. Gatling脚本编写技巧篇(二)

    脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...

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

    最近一直在研究XSS的攻防,特别是dom xss,问题慢慢的迁移到浏览器编码解码顺序上去. 今儿被人放鸽子,无奈在KFC看了两个小时的资料,突然有种豁然开朗的感觉. 参考资料先贴出来: 1. http ...

  6. 【编码题篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题

    编写一个方法 求一个字符串的字节长度假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var byt ...

  7. [转载]使用32位64位交叉编码混淆来打败静态和动态分析工具 - wildsator

    0×00 摘要 混淆是一种能增加二进制分析和逆向工程难度与成本的常用技术.主流的混淆技术都是着眼于使用与目标CPU相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...

  8. v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码

    本篇关键词:指令格式.条件域.类型域.操作域.数据指令.访存指令.跳转指令.SVC(软件中断) 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 ...

  9. 【朝花夕拾】Android编码风格篇

    结合51CTO学院中张凌华老师讲的编码风格课程,对自己平时工作中的形成的一些编码风格做一些总结. 一. 项目开发目录命名: Requirement - 需求相关文档 Design - 设计 Plann ...

随机推荐

  1. MVCS框架的注意点

    1.Service最好用一个接口对应一个service(便于增加扩展方法) 2.除Services和Model外都需继承自各自对应的父类 3.View不要轻易重写Start和Awake方法(含与启动有 ...

  2. 关于oracle的锁表解决session marked for kill

    oracle 使用的过程中,有时候会遇到锁表的情况,数据库增.删.改.查都是会锁表的,但是锁的类型会不同, 大多是行锁,部分会是表锁. 在oracle运行中,一直是有表在锁的,只不过很快一个操作结束, ...

  3. Codeforces 1098 简要题解

    文章目录 前言 A题 B题 C题 D题 E题 传送门 前言 没错因为蒟蒻太菜了这场的最后一道题也咕掉了,只有AAA至EEE的题解233 A题 传送门 题意简述:给出一棵带点权的树,根节点深度为111, ...

  4. 2018.12.08 codeforces 939E. Maximize!(二分答案)

    传送门 二分答案好题. 题意简述:要求支持动态在一个数列队尾加入一个新的数(保证数列单增),查询所有子数列的 最大值减平均值 的最大值. 然而网上一堆高人是用三分做的. 我们先考虑当前的答案有可能由什 ...

  5. 2018.10.26 bzoj2721: [Violet 5]樱花(数论)

    传送门 推一波式子: 1x+1y=1n!\frac 1 x+\frac 1 y=\frac 1 {n!}x1​+y1​=n!1​ =>xy−x∗n!−y∗n!xy-x*n!-y*n!xy−x∗n ...

  6. Jquery中parentsUntil函数调用最容易犯的三个错误

    来自 :http://jquery01.diandian.com/post/2012-01-16/14500044 Jquery中parentsUntil函数调用最容易犯的三个错误 Jquery的pa ...

  7. win10 VMware ubuntu12.04 虚拟机不能上网【已解决】

    参考  :链接. 本机环境:Ubuntu 12.04 无线上网(连接手机热点). 主机:Win 10. 步骤1:VMware安装运行后,默认会有3个虚拟网络,VMnet0,VMnet1,VMnet8. ...

  8. 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树

    1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...

  9. BZOJ 1024 [SCOI2009]生日快乐 (搜索)

    1024: [SCOI2009]生日快乐 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3025  Solved: 2201[Submit][Statu ...

  10. MySQL RR模式下如何加锁

    锁的算法有三种,如下: record lock.gap lock.next_key lock 在不同的隔离级别下,所使用的锁的算法如下: RC:仅有record 锁 RR:有record和next_k ...