0%

xss基础

  • XSS 篡改连接

    • JS 代码

      1
      2
      3
      4
      5
      6
      <script>
      window.onload=function(){ /*当窗口加载时执行匿名代码*/
      var link=document.getElementsByTagName("a"); /*html中,<a> 标签是超链接标签*/
      for(i=0;i<link.length;i++) link[i].href="http://noone40404.github.io";
      }
      </script>

      直接在输入框中提交,所有的连接都指向的我的博客

      而针对没有输入框的网站,我们需要构造一个 url ,即

      1
      2
      3
      4
      5
      6
      http://[ip]/dvwa/vulnerabilities/xss_r/?name=<script>
      window.onload=function(){ /*当窗口加载时执行匿名代码*/
      var link=document.getElementsByTagName("a"); /*html中,<a> 标签是超链接标签*/
      for(i=0;i<link.length;i%2B%2B) link[i].href="http://noone40404.github.io";
      }
      </script>

      值得注意的是,浏览器会在本地将空格转义为 + 号,所以会导致死循环,解决方案是使用转义后的加号 %2B

    • 恶意网页创建

      beef-xss 生成对应hook,默认账号是 beef ,密码自己设定

      先看下 ip

      打开 apache2 ,在 /var/www/html/index.html 中加入上面给的代码

      此时再访问 http://[ip]/index.html 时,beef 后台能看到我们的机器

      beef 能做很多事情,以后再说。如此就创建好一个恶意网页

    • 篡改连接

      将创建好的恶意网站与构造的 url 结合

  • XSS 盗取用户信息

    • 原理与创建

      setoolkit 克隆一个与存在 XSS 漏洞网站的登陆网站相同的页面

      Social engineering Attacks-Website Attack Vectors-Credential Harvester Attack Method-Site Cloner

      钓鱼网站页面默认为本机网卡 ip , 再输入所克隆网站网址

      在钓鱼网站中输入的信息被成功截获

      将该网址与上面的 xss 恶意代码结合即可

  • 提交 XSS

    构造一个独一无二且不会被识别为恶意代码的字符串提交

    然后进行代码审查,寻找字符串是否在页面中显示

    查看前后标签,在 payload 前提前闭合

    这里就需要闭合双引号 " 以及加粗标签 </b>

    对于存在输入长度限制的,F12maxlength 即可

    • html 事件

      浏览器内置的事件处理器能监视诸如单击鼠标等用户行为,通过 JS 可以将事件处理器作为属性给特定标签,并在事件发生时执行 JS 命令或函数

      onclickondblclick 是较常用的处理器,能在单击/双击鼠标时运行脚本

      onmouseover 在鼠标移动至元素之上时运行脚本

      例:

      1
      onmouseover=alert("xss")

      注意引号闭合

    • 空格属性探测

      输入空格时,可以发现空格后的被转成标签

      在加个等于号,发现等号后的自动加上了双引号,则此时 xss 代码就不需要双引号

    • JS 伪协议

      JS 代码放在 javascript: 后的 url 中,可以将其添加到客户端。该协议声明了 url 的主体是任意的 JS 代码,含有多个语句时用分号隔开,例

      1
      javascript:alert("xss");
    • xss 绕过 $1$

      最简单的将识别到的关键词替换为空

      • 双写
      • 编码

        1
        eval(atob('[base64_code]'));

        eval 函数返回括号内字符串运行结果

        atob 解码 base64

    • xss 绕过 $2$

      对于所有 script 标签,加上 x 变成 xscript

      先尝试伪协议绕过,但是发现被转换成了 javaxscript

      结合空格,躲开关键词检索,即 javascr ipt

    • IE 特性绕过 $1$

      输入时屏蔽了双引号

      一个仅存在于 IE 中的特性是两个 ` 可以闭合左边的双引号,其余同上

    • IE 特性绕过 $2$

      对输入的字符进行转义,使无法用 "> 直接闭合

      另一个存在于 IE 中的特性是可以用 css 命令中包含 JS 代码,格式如下:

      1
      background:url("javascript:alert("xss");");
    • IE 特性绕过 $3$

      cssexpression 可以将 css 属性与 JS 代码关联起来,即 expression([JS_code]) 。而前端过滤名单中有 expression ,考虑用注释符 /**/ 破坏字符完整性,例:

      1
      xss.expre/**/ssion(if(!window.x){alert("xss"); window.x=1;})

      这里最前面的 xss 可以理解为函数名,自定即可。window.x 声明了一个全局窗口变量,默认为 $0$ ,而最后将其改为 $1$ 是防止该代码反复执行

    • $16$ 进制绕过

      同样面临着 < 被转义,字符串为 value 类型的情况,而且对于单个 \ 会进行替换

      可以用 $16$ 进制对尖括号进行转义得到 \x3c\x3e

      如此可以构造 payload:

      1
      \\x3cscript\\x3e alert("xss");\\x3c/script\\x3e
    • unicode 绕过

      不能用 $16$ 进制转换尖括号了,可以用 unicode 试试

      \u003c\u003e

    • 源与同源

      源包含了协议,主机号与端口号,严格遵循 协议://主机号:端口

      仅当三者完全相同时,才认定为属于同源,例:

      http://www.qwq.comhttps://www.qwq.com不是同一源

      而对于不同源,存在同源策略,阻止一个源上的恶意代码访问另一个源上的资源

      特殊的是,对于 IE 存在互信域,域中可以相互访问

      并且 IE 在判断同源时不考虑端口

      • 关于 document.domain

        domain 属性可以进行降域,因为同源策略认为域与子域并非同源,而设置他们的 document.domain 可以使浏览器认为他们为同一域

  • xss-filter 过滤器

    • htmlspecialchars() / htmlentities

      将预定义的字符 &,",',<,> 转换为html 实体,例

      1
      2
      3
      $str="<script>alert("xss");</script>";
      $new_str=htmlspecialchars($str);
      echo $new_str;

      并不会跳出弹窗,而是显示

      1
      <script> alert("xss") </script>
    • strip_tags()

      移除原字符串中的 html,xml,php 标签,如上例,会输出

      1
      alert("xss");
  • 编码转义

    • url 编码

      考虑到传输问题,选用了较小且通用的安全字母表。而 url 需要包含不在表内的二进制数据与字符,所以 url 存在转义机制将不安全的字符编码为安全字符再传输

      其形式是 %[xx] ,后跟两位表示字符 ASCII 码的十六进制数

    • html 编码

      某些字符出现在值中时不安全,例如 <> 会被误认为标签,所以 html 重新编码后可以正确显示这些字符

      分为实体编码与进制编码

      实体编码以 & 开头,将标签 < 转为实体 <

      进制编码以 &# 开头,加上字符的数值,其可以是十进制ASCII 码或者 Unicode 编码

    • JS 编码

      \u 后面加 $4$ 位十六进制数字,或者 \x 后加 $2$ 位十六进制数字,按字符的 unicode 编码,不足位数用 $0$ 填充

      ctf常用网站

  • payload 与自动化

    kali 下自带 payload 字典,位于 /usr/share/wordlist/wfuzz/Injections

    burpsuite-intruder 即可

  • XSS 注入位置

    • GET

      url中出现的提交参数出现在页面中

    • POST

      在表单中提交的参数出现在页面中

    • JSON

      提交数据出现在封闭的 <script></script>

    • 自定义 http 头型

      对于 burp 抓包,手动加入 http 头的内容,当显示在页面上时

  • 靶场内容:

    • level2

      < 被转义成 html 实体

      但看下面,value 处没有过滤,那么这就是注入点,闭合 value 即可

      1
      ?keyword="><script>alert("")</script>
    • level3

      value 处也被转义,但可以发现括号没有,用不带 < 的命令尝试

      注意引号的闭合,由于 value 前后都是单引号,有 payload

      1
      'onmouseover='alert()

      闭合结果如下:

    • level4

      看一下过滤,尖括号转义,value 处是删去尖括号

      如上一题即可,注意要闭合的引号是双引号

    • level5

      关键词被添加了下划线,大小写失效

      挨个试一下常用的 xss 语句:

      1
      2
      3
      4
      <script> alert(1) </script>
      <img src= οnerrοr=alert(1)>
      <svg οnlοad=alert(1)>
      <a href=javascript:alert(1)>

      发现最后一个超链接没有被过滤

      再闭合前面的括号即可

    • level6

      仍是过滤了大部分函数,但经测试都可以用大小写绕过

    • level7

      <script> 被过滤为 <> ,自然想到双写绕过

    • level8

      仍是关键词加下划线,尝试绕过判断,用上面提过的编码:

      1
      javascrip&#x74:alert()

      &#x74=t

    • level9

      前端返回的结果是链接不合法,测试结果是必须包含 http:// 才会被接受,所以可以将其放在最后并注释

      1
      javascrip&#x74:alert()//http://
    • level10

      看源码发现有三个隐藏的值,分别向其中输入参数,

      发现只有 t_sort 有显示

      注入过程发现尖括号被吞了

      onclick 或者 onmouseover ,注意这里页面上是没有 t_sort 的,需要手动添加一个 type 使其可以被点击

      1
      " onmouseover=alert() type="text"
    • level11

      四个隐藏值还是只有 t_sort 能用,但过滤了双引号,用十六进制转换没用

      但注意 t_ref ,联想到 referer 头,hackbar 传一下发现可行

      payload 与上题一样即可

    • level12

      同理 hackbarUA 即可,注意要保留原始 UA 否则会被服务器拒绝

    • level13

      同理要提交 cookie ,但没有用户名,burp 抓包找一下

      那么要上传的 cookie 即为

      1
      user=call+me+maybe " onmouseover=alert() type="text"
    • level14

      这关调用的 exifviewer 已经失效了,但可以复现一下

      这针对于读取 exif 图片文件信息的网站,将图片的的 exif 信息改为恶意代码,上传后网站会读取并执行该代码

    • level15

      没看懂

    • level16

      替换 script 且无法绕过,尝试可以用 <img src 绕过

      空格也被替换,使用 url 编码表

      1
      <img%0asrc=""%0aonerror=alert()>
    • level17-20

      flash 做不了