XSS介绍
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Web脚本代码(html、javascript、css等),当用户浏览该页面时,嵌入其中的Web脚本代码会被执行,从而达到恶意攻击用户的特殊目的。
攻击者利用此漏洞,可以获取其他合法用户的Cookie身份信息、访问地址等,通过获取到的Cookie信息,即可以被攻击者的身份访问Web应用,如获取到管理员的Cookie,就可以以管理员的身份访问应用系统。
挖掘思路
XSS漏洞的关键在于寻找没有被过滤的参数,且这些参数传入到输出函数
经常存在于富文本、图片引用、文字格式设置、论坛留言、用户信息等
XSS类型分类
案例参照https://www.jianshu.com/p/4fcb4b411a66
反射型XSS
又称非持久型XSS,之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含恶意代码的链接发送给受害者,当受害者点击该链接时,恶意代码被传输到目标服务器上,然后服务器将恶意代码“反射”到受害者的浏览器上,从而在该浏览器上执行了恶意攻击脚本。目前大多数浏览器都具有反射型XSS保护功能,所以相对来说反射型的危害相对较低。
案例
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>XSS</title> </head> <body> <form action="" method="get"> <input type="text" name="input"> <input type="submit"> </form> <br> <?php echo ‘output:<br>‘.$_GET[‘input‘]; ?> </body> </html>
上述案例是当将以GET方式提交的字符串输出,因为没有任何过滤所以当提交JS代码时候会触发提交的语句
document.cookie
就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。储存型XSS
又称持久型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库或文件中。这种攻击多见于论坛、SNS社交网站、微博等系统,攻击者在发帖、发表文章、发微博的过程中,将恶意脚本连同正常信息一起注入到内容之中,发送到网站服务器储存下来,恶意脚本也永久地被存放在论坛服务器的后端储存器中,当其他用户浏览这个被注入了恶意脚本的内容时,恶意脚本则会在他们的浏览器中得到执行,从而实现攻击目的。
案例
<span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <html> <head> <title>XssStorage</title> </head> <body> <h2>Message Board<h2> <br> <form action="xss1" method="post"> Message:<textarea id=‘Mid‘ name="desc"></textarea> <br> <br> Subuser:<input type="text" name="user"/><br> <br> <input type="submit" value="submit" onclick=‘loction="XssStorage.php"‘/> </form> <?php if(isset($_POST[‘user‘])&&isset($_POST[‘desc‘])){ $log=fopen("sqlStorage.txt","a"); fwrite($log,htmlspecialchars($_POST[‘user‘])."\r\n"); # 在此对用户输入数据$_POST[‘user‘]进行过滤 fwrite($log,$_POST[‘desc‘]."\r\n"); fclose($log); } if(file_exists("sqlStorage.txt")) { $read= fopen("sqlStorage.txt",‘r‘); while(!feof($read)) { echo fgets($read)."</br>"; } fclose($read); } ?> </body> </html></span>
当输入字符串时候,先将输入的数据保存在一个地方,可以是文件也可以是数据库,这里是保存在sqlStorage.txt,然后再返回到页面
我们这边发现只有XSS2弹出,因为htmlspecialchars()函数对用户输入的<>
做了转义处理。
再看一下文件
可以看到这些都是刚刚输入的保存在文本里的字符,可以明显发现<>被转义了
DOM型XSS
基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞
特征:整个过程都是在前端完成的,没有后端的参与(纯前端的操作!)
案例参考:https://www.cnblogs.com/wangtanzhi/p/12239918.html
<?php $xss = $_GET[‘xss‘]; ?> <input type="text" id="text" value="<?php echo $xss;?>"> <div id="print"></div> <script type="text/javascript"> var text = document.getElementById("text"); var print = document.getElementById("print"); print.innerHTML = text.value; </script>
playload: ?xss=<img src=x onerror=alert(/xss/)>
杂言
XSS其实原理很简单,就是闭合标签,不过正因为这个,所以有很多骚姿势,后续还会出XSS系列的闯关游戏,最近被考试和实习问题缠的没时间,系统学习代码审计进度慢下来了,还要去看一下以前一些零碎的东西,害