XSS漏洞常见攻击方式
Posted The-Back-Zoom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS漏洞常见攻击方式相关的知识,希望对你有一定的参考价值。
1.危害
都是通过js脚本来实现的浏览器内核版本也会影响到js代码的实现
-
1、钓鱼欺骗
-
2、网站挂马
-
3、身份盗用
-
4、盗取网站用户信息
-
5、垃圾信息发送
-
6、劫持用户Web行为
-
7、XSS蠕虫
2.原理
XSS 属于被动式的攻击。攻击者先构造一个跨站页面,利用script、、等各种方式使得用户浏览这个页面时,触发对被攻击站点的http 请求。此时,如果被攻击者如果已经在被攻击站点登录,就会持有该站点cookie。这样该站点会认为被攻击者发起了一个http 请求。而实际上这个请求是在被攻击者不知情的情况下发起的,由此攻击者在一定程度上达到了冒充被攻击者的目的。精心的构造这个攻击请求,可以达到冒充发文,夺取权限等等多个攻击目的。在常见的攻击实例中,这个请求是通过script 来发起的,因此被称为Cross Site Script。攻击Yahoo Mail 的Yamanner 蠕虫是一个著名的XSS 攻击实例。YahooMail 系统有一个漏洞,当用户在web 上察看信件时,有可能执行到信件内的javascript 代码。病毒可以利用这个漏洞使被攻击用户运行病毒的script。同时Yahoo Mail 系统使用了Ajax技术,这样病毒的script可以很容易的向Yahoo Mail 系统发起ajax 请求,从而得到用户的地址簿,并发送病毒给他人。
3 .分类
3.1反射型
反射型XSS又称非持久型XSS,这种攻击方式往往具有一次性。
3.2存储型
存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。
3.3DOM型
从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的XSS漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段。
4.攻击方式
4.1反射型
攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞
4. 2存储型
这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意
4.3DOM型
用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞
5.绕过
5.1手动绕过
在介绍手动绕过之前必须先介绍一些编码方式
- 浏览器解析页面的过程:
html文档解析(DOM Tree) =》 浏览器发送获取嵌入在html中的对象
=》css解析 =》遇到JS解析,其他解析就停止
-
编码:
2.1 url编码:
%加上该字符串的ASSCALL2.2 html编码:
HTML实体编码: 以&开头,分号结尾的。 例如“<”的编码是“<”
字符编码:8进制或者16进制ASCALL或者Unicode编码,前面再加上.3 JS编码:
1.三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\\074”
2.两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\\x3c”
3.四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\\u003c”
4.对于一些控制字符,使用特殊的C类型的转义风格(例如\\n和\\r)
5.2XSS平台绕过
6.解决方案
1.过滤输入的字符包括"’" ““” “<” “>” "on"等
2.对输入到页面的数据进行相应的编码转换,包括HTML实体编码,JS编码等
7.自己写靶场学习
1. 创建数据库
create database loophole;
use loophole;
create table storage
(
id int auto_increment,
name char(10) not null,
message char(100) not null,
primary key (id)
)
comment 'xss存储型表';
#自动增加的键必须为主键
2.在phpstudy等web环境下建立如下文件
1. reflect.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XSS利用输出环境构造代码</title>
</head>
<body>
<h1>请输入你想显示的字符串</h1>
<form action="" method="get">
<input type="text" name="xss_input_name" placeholder="请输入字符串">
<input type="submit">
<img src="1" onerror="alert(xss)">
</form>
<br>
<!-- <pre>
<h1>解题答案</h1>
普通型: -->
<!-- 复杂型:'"><img src="" οnerrοr="alert(123)"><img src="' -->
<!-- </pre> -->
<?php
if(isset($_GET['xss_input_name']))
// echo $_GET["xss_input_name"] => 无任何过滤的xss
echo '<input type="text" value="' . $_GET["xss_input_name"] . '">';
// => 需要让input标签闭合,并且输出或者执行注入的js代码($_GET["xss_input_name"])
else
echo '<input type="text" value="请输入">';
?>
</body>
</html>
2.storage.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>存储型XSS</title>
<style>
div
width: 300px;
margin: auto;
background-color: rgb(red, green, blue);
table
width: 400px;
border-collapse: collapse;
text-align: center;
margin: auto;
table th,
table td
border: 1px solid;
padding: 5px;
table thead
background-color: lightcyan;
table caption
font-size: larger;
margin-bottom: 8px;
body>p
display: flex;
p>a
text-decoration: none;
color: #555;
border: 1px solid;
padding: 5px 10px;
margin: 10px 2px;
.active
background-color: seagreen;
color: white;
border: 1px solid seagreen;
</style>
</head>
<body>
<div>
<h1>请输入留言类容</h1>
<form action="" method="POST">
<label for="name">名字:</label><input type="text" name="name" id="name">
<br>
<label for="message">留言:</label><textarea name="message" id="message" cols="30" rows="10" placeholder="请输入留言"></textarea>
<input type="submit">
</form>
</div>
<?php
if (isset($_POST['message']))
$sql = <<<SQL
insert into storage(name,message) values (?,?);
SQL;
$db = new PDO('mysql:dbname=loophole', 'root', '901026yk');
$stmt = $db->prepare($sql);
$arr = [$_POST['name'], $_POST['message']];
$stmt->execute($arr);
$db = null;
$sql = <<<SQL
select * from storage;
SQL;
$db = new PDO('mysql:dbname=loophole', 'root', '901026yk');
$stmt = $db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();
$html = "
<table>
<caption>留言表</caption>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>message</th>
</tr>
</thead>
<tbody>
";
foreach($result as $items)
extract($items);
$html .= "
<tr>
<td>$id</td>
<td>$name</td>
<td>$message</td>
</tr>
";
$html .= " </tbody>
</table>";
echo $html;
?>
</body>
</html>
3.dom_xss.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XSS利用DOM树</title>
</head>
<body>
<script>
function show(event)
const input = event.target;
if(event.key == 'Enter')
let div = document.querySelector('.first');
// p.innerText = input.value;=>这样不会执行XSS代码
div.textContent = input.value
console.log(input.value);
input.value = null;
</script>
<div>
<h6>显示的类容如下:</h6>
<div class="first">
</div>
</div>
<div>
<h6>请输入你想显示的类容:</h6>
<input type="text" placeholder="请输入类容" onkeydown="show(event)">
</div>
</body>
</html>
8.靶场答案
8.1reflect.php
输入'"><img src="" onerror="alert(123)"><img src="'
构造html代码形成闭环,就可以进行xss攻击了
8.2storage.php
存储型xss,输入<script>alert(/xss/)</script>
即可
8.3dom_xss.html
这个不建议使用<script>alert(/xss/)</script>
进行XSS攻击,因为页面不会解析<script>alert(/xss/)</script>
,只会把<script>alert(/xss/)</script>
当作文本,所以不会执行js代码,使用<img src="" onerror="alert(123)">
即可
以上是关于XSS漏洞常见攻击方式的主要内容,如果未能解决你的问题,请参考以下文章