【渗透测试】XSS手工挖掘到防御

本文深入探讨XSS攻击原理,包括反射型、存储型和DOM型XSS,并提供实战代码示例。同时,讲解如何手工挖掘XSS漏洞,以及有效的防御策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

在这里插入图片描述
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容

危害:

  • 盗取管理员cookie
  • XSS蠕虫
  • 挂马(水坑攻击)
  • 键盘记录等等。。。。。。

二、XSS分类

1、反射型

反射型xss又称非持久型xss,xss代码出现在url参数或者请求中,浏览器发出请求时,参数值作为输入提交到服务器,服务器接受处理后参数值出现在响应的html中,最后浏览器解析执行了这段xss代码。

代码

<?php
if (!empty($_GET["name"])){  // 接收前端参数
	echo $_GET["name"];      // 在页面打印参数,浏览器会解析该参数
}
?>

<!DOCTYPE html>

<html>
<head>

	<title></title>
</head>

<body>
<form>
	<input type="text" name="name"> 
	<input type="submit" name="">
</form>
</body>

</html>

在这里插入图片描述
在这里插入图片描述
服务器接受处理后参数值出现在响应的html中,js代码被执行
在这里插入图片描述
在这里插入图片描述
带有xss的链接:http://localhost/xss/fanshe.phpname=666%3Cscript%3Ealert%281%29%3C%2Fscript%3E

2、存储型

存储型xss又称持久型xss,它和反射型最大的区别就是,攻击脚本将被永久地存放在目标的数据库或文件中。

代码

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; // 插入到数据库中
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}
?>

在这里插入图片描述
攻击脚本被保存到数据库中
在这里插入图片描述
任何一个用户访问到该页面都会弹窗
在这里插入图片描述

3、DOM型

DOM XSS和反射型和存储型的差别是在于DOM XSS 的代码不需要服务器解析响应的直接参与,出发XSS靠的是浏览器DOM解析器的解析,可以完全认为是客户端的事情。

代码

<!DOCTYPE html>

<html>
<head>

	<title></title>
</head>

<body>
<form>
	<input type="text" name="name"> 
	<input type="submit" name="">
</form>
<script type="text/javascript">
	var temp = document.URL;                       //获取url地址 
	var index = document.URL.indexOf("name=") + 5; // 定位用户输入的参数
	var par = temp.substring(index);               // 截取内容
	document.write(decodeURI(par));                // 解码并输出到页面中
</script>
</body>

</html>

在这里插入图片描述
在这里插入图片描述

三、手工挖掘

看url参数输出位置
看输入框输出位置

输出点位置

1、输出在标签外(尖括号的外部)

需要构造标签,如果不能构造标签就不存在XSS漏洞。


在这里插入图片描述

2、输出到标签中

在这里插入图片描述


在这里插入图片描述
闭合引号
在这里插入图片描述

支持js事件的属性可以部闭合单双引号:onload,onclick 。。。。。。
不支持js事件的属性必须要闭合单双引号:class,id 。。。。。。

不闭合引号,构造事件属性
在这里插入图片描述

3、输出到script标签中


案例一需要闭合引号:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
案例二输入的内容可以插入到网页中:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、引号尖括号被过滤

8进制 16进制 unicode编码的标签可以被解析还原成为原来的标签
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、XSS防御

  1. XSS的防御需要根据实际情况对用户的输入进行严格的过滤,基于过滤的CSS防御方式通常分为两种:基于黑名单的过滤和基于白名单的过滤。后者的防御效果往往更好,对于用户在白名单之外的输入,可以直接忽略。在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。
  2. 在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS的损失。

httponly

设置成 TRUE,Cookie 仅可通过 HTTP 协议访问。 这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。 要有效减少 XSS 攻击时的身份窃取行为,可建议用此设置(虽然不是所有浏览器都支持),不过这个说法经常有争议。 PHP 5.2.0 中添加。 TRUE 或 FALSE

在这里插入图片描述
js脚本无法获取BDUSS的cookie信息

如果cookie加了httponly有没有办法获取到???
在这里插入图片描述
在这里插入图片描述
后端代码中使用过滤函数

<?php

echo htmlspecialchars("<>'\"");
echo "<br><br>";
echo addcslashes("'\"'");

?>

在这里插入图片描述
对特殊字符进行转义

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多学点技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值