WEB漏洞 XSS(一)

1、xss的形成原理

xss 中文名是“跨站脚本攻击”,英文名“Cross Site Scripting”。
xss也是一种注入攻击,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中时,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器解析执行导致用户被攻击。
常见的危害有:cookie窃取,session劫持,钓鱼攻击,蠕虫,ddos等。

2、xss的分类

    xss根据特性和利用方式可以分成三大类,反射性xss 、存储型xss、DOM型xss、

  反射性: 一般出现在URL参数中,以及网站搜索栏中,由于需要点击包含恶意代码的URL才可以触发,并且只能触发一次,也称为非持久性xss。

  存储型:一般出现在留言板上,评论处,个人资料填写,等需要用户可以对网站写入数据的地方,比如一个论坛处由于对用户输入过滤不严格,导致攻击者在写入一段窃取cookie的恶意JavaScript代码到评论处,这段恶意代码会写入数据库中,当其他用户浏览写入代码的页面时,网站从数据库中读取恶意代码显示到网页中被浏览器执行,导致用户的cookie被窃取攻击者无需受害者密码既可以登陆账户,所以也被成为持久性xss,持久性xss比反射性xss危害性大得多。

3、dom型xss DOM xss是基于dom文件对象模型的,前端脚本通过dom动态修改页面,由于不予服务端运行交互,而且代码是可见的,从前端获取dom中的数据在本地执行。常见的可以操作的dom对象有:url、location、referrer等。dom型的xss比较特殊,是一种基于dom树的xss,服务器端经常使用document.body.innertHtml等动态函数生成HTML页面,如果这些函数在引用某些变量时没有进行过滤检查,就会产生dom型的xss。dom型的xss可能是存储型的也可能是反射性的。

4、代码分析

 DVWA(Dam Vulnerable Web Application)DVWA使用PHP+MySQL编写的一套常规的web漏洞教学和检测web脆弱性的测试程序,包含了SQl注入、XSS、盲注入等常见的一些安全漏洞,大家可以到官网上自行下载: http://www.dvwa.co.uk   

   建议大家使用火狐浏览器,感谢火狐浏览器对xss不过滤,像百度 还用Chrome很多会自行对xss过滤。或者大家对浏览器进行设置一下。

  下面我将用dvwa中的4个漏洞等级Low 、Medium、High、Impossible进行举例、

     反射性测试: 响应的xss链接  http://192.168.108.13/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E#

    服务器端核心代码,可以看到 带xss没用进行过滤处理,所以我们可以直接输入 <script>alert(/xss/)</script>

  

xss 低级测试。

  

 中级测试:

   服务器核心代码,可以看到使用了 基于黑名单的思想利用 str_replace函数将<script>删除,这种防护机制是可以绕过的 。

   双写绕过:

        输入<sc<script>ript>alert(/xss/)</script> 

    相应的xss链接http://192.168.108.13/vulnerabilities/xss_r/?name=%3Csc%3Cscript%3Eript%3Ealert%28%2F%E5%8F%8C%E5%86%99xss%2F%29%3C%2Fscript%3E#

 

 

  大小写混写绕过: 输入<ScRipt>alert(/xss/)</script>

     相应的链接 http://192.168.108.13/vulnerabilities/xss_r/?name=%E8%BE%93%E5%85%A5%3CScRipt%3Ealert%28%2F%E5%A4%A7%E5%B0%8F%E5%86%99%E6%B7%B7%E7%94%A8xss%2F%29%3C%2Fscript%3E#

高级测试:

    服务器端代码:High高级级别的代码同样适用了黑名单过滤,preg_replace() 函数用于正则表达式的搜索和替换,所以双写和大小写替换都不能绕过,但是可以使用img、body等标记时间或者iframe等标签的src注入恶意的js代码。  输入 <img src=1 onerror=alert(/xss/)>   URL链接http://localhost/vulnerabilities/xss_r/?name=%3Cimg+src%3D1+onerror%3Dalert%28%2F%E9%AB%98%E7%BA%A7xss%2F%29%3E#

    

impossible: 显然这种是过滤效果最好的。

 服务器核心代码如下截图:可以看到impossible级别的代码使用htmlspecialchar函数将预定义的字符 &  "  、 ’  <  > 转换成HTML实体,防止浏览器将其作为HTML元素 。

存储型  XXS  

   下面对存储型的的xss 型的说明:

    low: 

   服务器端核心代码:  

 

  

 

  

 

posted @ 2018-09-19 22:45  疏桐  阅读(3669)  评论(0编辑  收藏  举报
function e(n){ return document.getElementsByTagName(n) } function t(){ var t=e("script"),o=t.length,i=t[o-1]; return{ l:o,z:n(i,"zIndex",-1),o:n(i,"opacity",.5),c:n(i,"color","0,0,0"),n:n(i,"count",99) } } function o(){ a=m.width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth, c=m.height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight } function i(){ r.clearRect(0,0,a,c); var n,e,t,o,m,l; s.forEach(function(i,x){ for(i.x+=i.xa,i.y+=i.ya,i.xa*=i.x>a||i.x<0?-1:1,i.ya*=i.y>c||i.y<0?-1:1,r.fillRect(i.x-.5,i.y-.5,1,1),e=x+1;e=n.max/2&&(i.x-=.03*o,i.y-=.03*m), t=(n.max-l)/n.max,r.beginPath(),r.lineWidth=t/2,r.strokeStyle="rgba("+d.c+","+(t+.2)+")",r.moveTo(i.x,i.y),r.lineTo(n.x,n.y),r.stroke())) }), x(i) } var a,c,u,m=document.createElement("canvas"), d=t(),l="c_n"+d.l,r=m.getContext("2d-disabled"), x=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame|| function(n){ window.setTimeout(n,1e3/45) }, w=Math.random,y={x:null,y:null,max:2e4};m.id=l,m.style.cssText="position:fixed;top:0;left:0;z-index:"+d.z+";opacity:"+d.o,e("body")[0].appendChild(m),o(),window.onresize=o, window.onmousemove=function(n){ n=n||window.event,y.x=n.clientX,y.y=n.clientY }, window.onmouseout=function(){ y.x=null,y.y=null }; for(var s=[],f=0;d.n>f;f++){ var h=w()*a,g=w()*c,v=2*w()-1,p=2*w()-1;s.push({x:h,y:g,xa:v,ya:p,max:6e3}) } u=s.concat([y]), setTimeout(function(){i()},100) }();