谈论 PHP与XSS

本文将讨论一些脚本攻击问题,以及如何解决XSS脚本攻击问题

美好的周末就用来学点知识吧!!!

------------------------------------------------------------------------------------------------------------

文章目录


XSS跨站脚本攻击

首先通过一张图来了解一下XSS垮站脚本攻击的过程

XSS是什么

  • XSS (Cross Site Scripting),即跨站脚本攻击,是一种常见于 Web 应用中的计算机安全漏洞。
  • 恶意攻击者往 Web 页面里嵌入恶意的客户端脚本,当用户浏览此网页时,脚本就会在用户的浏览器上执行,进而达到攻击者的目的。比如获取用户的 Cookie、导航到恶意网站、携带木马等。
  • 借助安全圈里面非常有名的一句话:*所有的输入都是有害的。大部分的 XSS 漏洞都是由于没有处理好用户的输入,导致恶意脚本在浏览器中执行。任何输入提交数据的地方都有可能存在 XSS。

总得来说:XSS是web安全中最为常见的漏洞,XSS全称是Cross Site Script。XSS攻击通常指黑客通过"HTML注入"篡改了网页,插入了恶意脚本,从而控制用户浏览的一种攻击。

XSS类型:反射型、存储型和DOM型。

反射型

  1. 也被称为非持久性XSS,是现在最容易出现的一种XSS漏洞。

  2. 当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。这个过程就像一次反射,故称为反射型XSS。

  3. 非持久型XSS漏洞实际上大多数攻击数据是包含在URL中的,类似这样的:http://www.xxxxx.com/test.asp?hi=\[code\]。需要用户的浏览器访问到这个URL恶意代码才执行,攻击者一般会把URL发给用户让用户通过浏览器去访问。不过URL里面带有稀奇古怪的代码确实有点奇怪,为了掩人耳目,攻击者可以发一个看起来没问题的URL,再通过那个页面跳转到恶意的URL,甚至也可以让一个域名转向到恶意URL,把那个域名发给用户。

存储型

  1. 存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本。

  2. 允许用户存储数据的Web应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击,比如我在某个论坛发帖的时候,论坛没有对传入的HTML作处理,那么我就可以发一个帖子内容包含的帖子,然后就守株待兔地等着来看帖子的人执行恶意脚本了。

  3. 持久型XSS漏洞是把恶意脚本存储到了数据库,访问页面的时候完全没有预兆,这就是存储型XSS。存储型XSS与反射型XSS、DOM型XSS相比,具有更高的隐蔽性,危害性也更大。它们之间最大的区别在于反射型XSS与DOM型XSS执行都必须依靠用户手动去触发,而存储型XSS却不需要。

  4. 存储型XSS的数据流向是:前端-->后端-->数据库-->后端-->前端

DOM型

  1. DOM的全称为Document Object Model,即文档对象模型,DOM通常用于代表HTML、XHTML和XML中的对象。

  2. 使用DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。通过JavaScript可以重构整个HTML页面,而要重构页面或者页面中的某个对象,JavaScript就需要知道HTML文档中所有元素的"位置"。而DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据DOM规定,HTML文档中的每个成分都是一个节点。

特别注意:

基于DOM型的XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段。

寻找XSS漏洞方法

在寻找XSS漏洞时,先随便输入东西观察页面的响应方式,然后查看页面源码,然后构造合适的alert()弹窗来发现

XSS payload 是什么

攻击者的恶意脚本称为XSS payload

$_SERVER["PHP_SELF"] 变量

该变量是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。

php 复制代码
$_SERVER["PHP_SELF"]
变量会发送表单数据到当前页面,而不是跳转到不同的页面
$_SERVER 中存储了包括头信息,路径,脚本位置等
powershell 复制代码
<?php
   echo '<pre>';
   print_r($_SERVER);
   echo '</pre>';
?>

PHP_SELF\] =\> /servertest.php 在 $_SERVER 数组中存储的众多值中,存储了一个键为 'PHP_SELF' 的值,也就是 $_SERVER\["PHP_SELF"\],该值存储的内容是:当前执行脚本的文件名,与 document root 有关。 $_SERVER\["PHP_SELF"\] 该地址不包含 url 中的参数,比如你访问的 url 地址为:http://localhost/selectform.php?par=123\&par2=333 而 $_SERVER\["PHP_SELF"\] 的值为 /selectform.php 。

获取当前页面的地址

要获取当前页面的地址时,你可以使用下面的方法进行获取

php 复制代码
 $url="http://".$_SERVER['HTTP_HOST']$_SERVER['PHP_SELF'];

例如:

powershell 复制代码
<?php
   echo '<pre>';
   print_r($_SERVER);
   $url="http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
   echo "<br>".$url;
   echo '</pre>';
?>
#所以可用 $_SERVER['PHP_SELF'] 很方便的获取当前页面的地址

特别 注意:

该地址是不包含 URL 中请求的参数(?及后面的字串)。要得到包含请求参数的完整 URL 地址,必须使用 $_SERVER['REQUEST_URI']

典型例子

Testxss.php

html 复制代码
<!DOCTYPE html>
<html>
<body>
<h2>test</h2>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
</form>
</body>
</html>
<!--观察在URL后面加入%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E --> 

查看源代码,发现这段代码不是我们期望的,这样,攻击者可以在 URL 后面随意加上攻击代码

解决方案

使用 htmlentities(_SERVER\['PHP_SELF'\]) 替代 _SERVER['PHP_SELF'],让 URL 中可能的恶意代码转换为用于显示的 html 代码而无法执行。

XSS例子

例1

php 复制代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS原理</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="xss_input">
<input type="submit">
</form>
<hr>
<?php
$xss = $_GET['xss_input'];
echo '你输入的字符为<br>'.$xss;
// echo '你输入的字符为<br>'."<script>alert('xss')</script>";
?>
</body>
</html>
bash 复制代码
注意:如果要表单提交数据到自己页面,action就设置为空
观察在表单中输入"<script>alert('xss')</script>"的结果!

例2

php 复制代码
<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>XSS</title> 
</head> 
<body> 
<form action="" method="get"> 
<input type="text" name="input">     
<input type="submit"> 
</form> 
<br> 
<?php 
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?> 
</body> 
</html> 

变量 $XssReflex 获取 get 方式传递的变量名为 input 的变量值(值为一个字符串),然后直接通过echo()函数输出,注意这中间并未对用户输入进行任何过滤。

  • 输入1,页面返回1;输入HELLO,页面返回HELLO

以上都为正常的输出,但如果输入一些javascript代码呢?如:

php 复制代码
<script>alert('xss')</script>

可以看到浏览器成功弹窗,说明输入的JavaScript代码成功被执行了。再查看网页html代码。

该弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等

存储型XSS---创建测试表

php 复制代码
	<?php
$servername = "localhost";
$username = "root";
$password = "Gdsdxy1234!";
$dbname = "myDB";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

$sql = "CREATE TABLE Xsstable (
id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
payload VARCHAR(50) NOT NULL,
reg_date TIMESTAMP
)";
if ($conn->query($sql) === TRUE) {
    echo "Table Xsstable created successfully";
} else {
    echo "创建数据表错误: " . $conn->error;
}
 $conn->close();
?>
bash 复制代码
注意:这里录入脚本时要转义:
<script>alert(\'xss\')</script>

留言文件:insertword.php

php 复制代码
<form action="" method="post">
    <input type="text" name="xss"/>
    <input type="submit" value="插入数据"/>
</form>

<?php
$servername = "localhost";
$username = "root";
$password = "Gdsdxy1234!";
$dbname = "myDB";
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$xss=$_POST['xss'];
//echo $xss;
$sql="insert into Xsstable(payload) values('$xss')";
if ($xss!==null){
    if(mysqli_query($conn, $sql)){
    echo "留言成功";}
}
 mysqli_close($conn);
?>
录入XSS的操作方法
  1. 首先,输入下列代码
php 复制代码
<script>alert(\'hack\')</script>  
  1. 注意:

    这里的hack的单引号要进行转义,因为sql语句中是单引号,所以这里不转义的话就会闭合sql语句中的单引号,不然注入不进去。

  2. 然后就能看到XSS语句已经插入到数据库中。

    然后当其他用户访问 insertwordshow.php 页面时,我们插入的XSS代码就执行了。

今天是11月的最后一天,明天起床就是2024年最后一个月了,无论是考公,考研,上班族,考证等等的朋友们,为了登上顶峰,共勉!!!(づ′▽`)づ

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习