博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XSS编码初析
阅读量:5172 次
发布时间:2019-06-13

本文共 2831 字,大约阅读时间需要 9 分钟。

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

这里仅涉及到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

","",$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 .= '
'; $html .= '
click this url'; $html .= '
'; echo "$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) &#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x31;&#x29; %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

代码如下:

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

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

其中的转化语句如下:

HTML编码 <img src=1 οnerrοr=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解码操作。

转载于:https://www.cnblogs.com/vspiders/p/7399093.html

你可能感兴趣的文章
Flexbox 布局教程
查看>>
敏捷个人学习----为什么的力量
查看>>
软件开发的技术网站
查看>>
Cesium专栏-裁剪效果(基于3dtiles模型,附源码下载)
查看>>
Python自动化开发从浅入深-进阶(socketServer)
查看>>
自然语言交流系统 phxnet团队 创新实训 个人博客 (十一)
查看>>
最近学到一些linq和面向对象的经验分享
查看>>
LeetCode:路径总和II【113】
查看>>
angularJs内置指令63个
查看>>
简单介绍.Net3.0 中跨线程访问控件
查看>>
oracle imp 工具可能出现的问题
查看>>
bzoj1045题解
查看>>
学习Cocos2d的博客 --推荐
查看>>
SpringMVC中@RequestMapping参数设置
查看>>
lea实现加法
查看>>
主动FTP vs. 被动FTP 权威解释
查看>>
谈谈对网站性能优化的认识
查看>>
Codeforces Round #413 B. T-shirt buying
查看>>
13组件与容器
查看>>
文件操作
查看>>