跨站脚本(简称为XSS或跨站脚本或跨站脚本攻击)是针对Web应用程序的安全漏洞攻击,允许用户插入恶意的脚本,从而当用户浏览网页时,插入的脚本就会执行。从而达到攻击的目的。
1.反射型XSS
反射型XSS又叫非持久性XSS,反射型XSS注入的恶意代码不会保存在服务器端,需要欺骗用户去点击恶意链接才能攻击成功。一般通过XSS来窃取用户的cookie。
反射型XSS攻击流程:
2.存储型XSS
存储型XSS又叫持久型XSS,攻击脚本会永久存储在目标服务器中。例如在个人信息或者留言板之类的地方插入恶意脚本,用户访问这些带有恶意脚本的页面时会触发恶意脚本中的代码。
存储型XSS攻击流程:
3.DOM型XSS
DOM型XSS也属于反射型XSS的一种,是通过修改页面的DOM节点形成的XSS。
DOM节点:
能触发DOM型XSS的属性
document.referer
window.name
location
innerHTML
document.write
eval
小结
在三种类型的XSS漏洞中,存储型的XSS危害最大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触,只要被攻击者访问了该页面就会遭受攻击。而反射型和DOM型的XSS则需要我们去诱使用户点击我们植入了恶意脚本的URL,比如利用社会工程学或者利用在其他网页挂马的方式。
反射型XSS
页面源码:
<div id="xssr_main"><p class="xssr_title">Which NBA player do you like?</p><form method="get"><input class="xssr_in" type="text" maxlength="20" name="message" /><input class="xssr_submit" type="submit" name="submit" value="submit" /></form><?php echo $html;?></div></div><!-- /.page-content --></div>
</div><!-- /.main-content --><?php
include_once $PIKA_ROOT_DIR.'footer.php';?>
这里有一个用户提交的页面,用户可以在此提交数据,数据提交之后会交给后台处理。但是站点在前端对输入的长度进行了限制,我们须在控制台上修改输入的长度。
之后,我们可以在输入框中提交数据: ,看看有什么反应。
页面直接弹出了hello的页面,可以看到我们插入的语句已经被页面给执行了。
存储型XSS
页面源码:
<div class="main-content"><div class="main-content-inner"><div class="breadcrumbs ace-save-state" id="breadcrumbs"><ul class="breadcrumb"><li><i class="ace-icon fa fa-home home-icon"></i><a href="xss.php">xss</a></li><li class="active">存储型xss</li></ul><!-- /.breadcrumb --><a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"data-content="无用提示:这个留言板的框框是可以拉长和拉宽的,还行不,大兄弟!">点一下提示~</a></div><div class="page-content"><div id="xsss_main"><p class="xsss_title">我是一个留言板:</p><form method="post"><textarea class="xsss_in" name="message"></textarea><br /><input class="xsss_submit" type="submit" name="submit" value="submit" /></form><div id="show_message"><br /><br /><p class="line">留言列表:</p><?php echo $html;$query="select * from message";$result=execute($link, $query);while($data=mysqli_fetch_assoc($result)){
echo "<p class='con'>{
$data['content']}</p><a href='xss_stored.php?id={
$data['id']}'>删除</a>";}echo $html;?></div></div></div><!-- /.page-content --></div>
</div><!-- /.main-content --><?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
这里有一个留言板提交的页面,数据提交给后端之后,后端会将数据存储在数据库中。然后当其他用户访问这个页面的留言时,后端调出该数据,显示给用户,XSS代码就被执行了。
我们在留言框中提交数据: 。
再刷新下查看反应。
这时恶意代码就插入到数据库中了。
DOM型XSS
<div class="main-content"><div class="main-content-inner"><div class="breadcrumbs ace-save-state" id="breadcrumbs"><ul class="breadcrumb"><li><i class="ace-icon fa fa-home home-icon"></i><a href="xss.php">xss</a></li><li class="active">DOM型xss</li></ul><!-- /.breadcrumb --><a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"data-content="先到这里把什么是dom搞明白了在说http://www.w3school.com.cn/htmldom/">点一下提示~</a></div><div class="page-content"><div id="xssd_main"><script>function domxss(){
var str = document.getElementById("text").value;document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";}//试试:'><img src="#" onmouseover="alert('xss')">//试试:' οnclick="alert('xss')">,闭合掉就行</script><!--<a href="" onclick=('xss')>--><input id="text" name="text" type="text" value="" /><input id="button" type="button" value="click me!" onclick="domxss()" /><div id="dom"></div></div></div><!-- /.page-content --></div>
</div><!-- /.main-content --><?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
从what do you see?中,我们需要对代码进行闭合操作。如,’>。
点击click me!。
发现弹出hello
这里发现,我们插入的语句已经被页面给执行了。
这个就是DOM型XSS漏洞