目录

一、源码分析

1、index.php

2、impossible.php

二、SQL注入防范分析

1、Anti-CSRF 令牌

2、参数化查询

3、输入验证


本系列为通过《DVWA靶场通关笔记》的SQL Injection 关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践。本文为SQL Injection  impossible关卡的原理分析部分,讲解相对于low、medium和high级别,为何对其进行渗透测试是Impossible的。

一、源码分析

1、index.php

进入DVWA靶场SQL Injection源目录,找到index.php源码。

这段代码实现了这段 PHP 代码是 Damn Vulnerable Web Application (DVWA) 中 SQL 注入攻击演示页面的主控制器,主要功能包括:

  • 环境初始化:设置页面路径、验证用户身份、连接数据库。
  • 安全级别控制:根据用户 Cookie 中的安全级别设置(低、中、高、不可能),加载不同级别的实现文件。这些文件包含不同防护级别的 SQL 查询代码,用于演示不同难度的 SQL 注入场景。
  • 表单生成:根据安全级别动态生成不同的用户输入表单(低级、中级、高级、不可能共4个级别)
  • 环境检测:检查 PHP 配置中的魔术引号和安全模式,提供环境安全提示。
  • 结果展示:将 SQL 查询结果和安全参考资料链接整合到页面中。

经过注释后的详细代码如下所示。

<?php// 定义网站根目录路径常量,并引入页面处理工具
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';// 初始化页面,验证用户认证状态并启动PHPIDS防护模块
dvwaPageStartup( array( 'authenticated', 'phpids' ) );// 创建新页面实例并设置页面元信息
$page = dvwaPageNewGrab();
$page[ 'title' ]   = 'Vulnerability: SQL Injection' . $page[ 'title_separator' ].$page[ 'title' ];
$page[ 'page_id' ] = 'sqli';
$page[ 'help_button' ]   = 'sqli';
$page[ 'source_button' ] = 'sqli';// 连接数据库
dvwaDatabaseConnect();// 设置表单提交方式和级别文件
$method            = 'GET';
$vulnerabilityFile = '';
// 根据安全级别Cookie选择不同的级别实现文件
switch( $_COOKIE[ 'security' ] ) {case 'low':$vulnerabilityFile = 'low.php';break;case 'medium':$vulnerabilityFile = 'medium.php';$method = 'POST'; // 中等级别使用POST方法break;case 'high':$vulnerabilityFile = 'high.php';break;default:$vulnerabilityFile = 'impossible.php'; // 默认使用安全实现break;
}// 引入对应安全级别的SQL注入攻击实现文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/sqli/source/{$vulnerabilityFile}";// 检查PHP环境配置并生成警告信息
$WarningHtml = '';
// 检测魔术引号是否开启(已弃用的安全机制)
if( ini_get( 'magic_quotes_gpc' ) == true ) {$WarningHtml .= "<div class=\"warning\">The PHP function \"<em>Magic Quotes</em>\" is enabled.</div>";
}
// 检测安全模式是否开启(已弃用的安全机制)
if( ini_get( 'safe_mode' ) == true ) {$WarningHtml .= "<div class=\"warning\">The PHP function \"<em>Safe mode</em>\" is enabled.</div>";
}// 构建页面主体内容
$page[ 'body' ] .= "
<div class=\"body_padded\"><h1>Vulnerability: SQL Injection</h1>{$WarningHtml}<div class=\"vulnerable_code_area\">";// 高级安全级别使用JavaScript弹窗获取用户ID
if( $vulnerabilityFile == 'high.php' ) {$page[ 'body' ] .= "Click <a href=\"#\" onclick=\"javascript:popUp('session-input.php');return false;\">here to change your ID</a>.";
}
// 其他安全级别使用表单获取用户ID
else {$page[ 'body' ] .= "<form action=\"#\" method=\"{$method}\"><p>User ID:";// 中等级别使用下拉菜单限制输入范围if( $vulnerabilityFile == 'medium.php' ) {$page[ 'body' ] .= "\n				<select name=\"id\">";// 动态生成下拉选项(基于数据库行数)for( $i = 1; $i < $number_of_rows + 1 ; $i++ ) { $page[ 'body' ] .= "<option value=\"{$i}\">{$i}</option>"; }$page[ 'body' ] .= "</select>";}// 低级别和不可能级别使用文本框直接输入else$page[ 'body' ] .= "\n				<input type=\"text\" size=\"15\" name=\"id\">";$page[ 'body' ] .= "\n				<input type=\"submit\" name=\"Submit\" value=\"Submit\"></p>\n";// 不可能级别添加CSRF令牌保护if( $vulnerabilityFile == 'impossible.php' )$page[ 'body' ] .= "			" . tokenField();$page[ 'body' ] .= "</form>";
}// 添加查询结果区域和安全参考资料链接
$page[ 'body' ] .= "{$html} // 存储SQL查询结果的变量</div><h2>More Information</h2><ul><li>" . dvwaExternalLinkUrlGet( 'http://www.securiteam.com/securityreviews/5DP0N1P76E.html' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/SQL_injection' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/SQL_Injection' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'http://bobby-tables.com/' ) . "</li></ul>
</div>\n";// 输出HTML页面
dvwaHtmlEcho( $page );?>

2、impossible.php

进入DVWA靶场SQL Injection的source源码目录,找到impossible.php源码,分析其为何能让这一关卡名为不可能实现SQL注入渗透。

打开源码impossible.php,分析可知这段代码实现了用户信息查询功能,如下所示。

  • 验证用户登录状态:通过检查$_SESSION['id']判断用户是否已登录。
  • 查询用户信息:从数据库中查询当前登录用户的姓和名,并将结果以 HTML 形式展示。
  • 数据库操作流程:获取会话 ID 构建 SQL 查询 执行查询 解析结果 关闭连接。

详细注释后的impossible.php源码如下所示。

<?php// 检查是否通过GET方法提交了表单
if( isset( $_GET[ 'Submit' ] ) ) {// 验证CSRF令牌,防止跨站请求伪造攻击// 比较用户请求中的令牌与会话存储的令牌是否一致checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 从GET参数中获取用户ID$id = $_GET[ 'id' ];// 验证输入是否为数字(防止非数字类型的SQL注入)if(is_numeric( $id )) {// 准备SQL查询:从users表中查询指定ID的用户的名字和姓氏// 使用预处理语句防止SQL注入$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );// 将用户输入的ID绑定为整数类型参数// 这一步确保即使输入包含非数字字符也会被转换为整数$data->bindParam( ':id', $id, PDO::PARAM_INT );// 执行SQL查询$data->execute();// 获取查询结果的第一行$row = $data->fetch();// 确保查询只返回一行结果(防止越权访问)if( $data->rowCount() == 1 ) {// 提取查询结果中的名字和姓氏$first = $row[ 'first_name' ];$last  = $row[ 'last_name' ];// 输出用户信息(存在XSS风险,未对输出进行HTML转义)$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}}
}// 生成新的CSRF令牌并存储到会话中
generateSessionToken();?>

二、SQL注入防范分析

impossible.php 主要功能是处理用户提交的 ID 查询请求,通过验证 Anti-CSRF 令牌确保请求合法性,检查输入 ID 是否为数字,再使用 PDO 参数化查询从数据库中获取对应用户的姓名并反馈给用户,通过多重安全措施有效防范 SQL 注入等攻击。impossible.php 主要功能是处理用户提交的 ID 查询请求,通过验证 Anti-CSRF 令牌确保请求合法性,检查输入 ID 是否为数字,再使用 PDO 参数化查询从数据库中获取对应用户的姓名并反馈给用户,通过多重安全措施有效防范 SQL 注入等攻击。

  • 参数化查询(Prepared Statement):使用 PDO 预编译语句,分离 SQL 代码与用户输入数据。
  • 输入验证:限制输入为数字类型(is_numeric 检查)。
  • Anti-CSRF 令牌:防止跨站请求伪造,间接提升安全性。

1、Anti-CSRF 令牌

通过generateSessionToken生成随机令牌并存储在会话中,表单提交时包含该令牌字段,服务器端checkToken验证请求中的令牌与会话中存储的是否一致,不一致则拒绝请求。

// 验证令牌
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 生成令牌
generateSessionToken();
// 表单中包含令牌字段
$page[ 'body' ] .= "			" . tokenField();

CSRF 攻击依赖盗用用户身份发起恶意请求,而 Anti-CSRF 令牌为每个请求附加随机且时效性的验证信息。攻击者攻击者难以获取合法令牌,即使构造恶意请求,因令牌不匹配也会被拦截,间接保障 SQL 查询的输入来源合法性,降低恶意注入请求的成功率。

2、参数化查询

通过 PDO 预编译语句将 SQL 结构与用户输入分离,先用:id作为占位符定义查询模板,再通过bindParam绑定参数并指定类型为整数,最后执行查询。即使输入包含恶意 SQL 片段,也只会被当作数据处理,无法改变查询逻辑

$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();

预编译阶段 SQL 语句结构已固定,数据库会将占位符视为数据而非可执行代码。绑定参数时强制类型为整数(PDO::PARAM_INT),进一步确保输入仅作为数值处理,从根本上避免用户输入被解析为 SQL 指令,彻底阻断断裂取数据库控制权的注入路径。

3、输入验证

获取用户输入的id后,通过is_numeric函数验证其是否为数字。只有当输入为数字时,才执行后续数据库操作;非数字输入会被直接拦截,不进入查询流程。

$id = $_GET[ 'id' ];
if(is_numeric( $id )) {// 执行数据库查询
}

SQL 注入常依赖字符串拼接注入恶意指令,而数字类型输入无法包含引号、关键字等注入要素。is_numeric从输入源头限制数据类型,过滤掉包含字母、符号的潜在恶意输入,减少注入攻击的可能性。即使参数化查询存在疏漏,该验证也能作为第二道防线拦截风险输入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95365.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95365.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95365.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中事务的作用和定义

在 MySQL 中&#xff0c;​​事务&#xff08;Transaction&#xff09;​​ 是一组数据库操作的逻辑单元&#xff0c;这些操作要么​​全部成功执行​​&#xff0c;要么​​全部失败回滚​​&#xff0c;以确保数据库从一个一致状态转换到另一个一致状态。事务是关系型数据库&…

华为Fit4:腕间助手,守护你的健康,带你开启智慧生活

清晨被闹钟吵醒&#xff0c;想要关掉却怎么也找不到手机&#xff1f;经常睡很久却还是很困&#xff1f;重要的事情常常因为没有被记录和规划清楚最终变得手忙脚乱&#xff1f;人流拥挤的地铁上半天找不到刷码信息&#xff1f;这些问题是不是生活中常常遇到&#xff0c;别担心&a…

【交易系统系列36】揭秘币安(Binance)技术心脏:从公开信息拼凑“MatchBox”撮合引擎架构

一、 核心概览:从白皮书的豪言到监管文件的“实锤” 要理解币安的架构,我们首先要抓住几个关键的、有据可查的事实: 性能目标:在其早期白皮书中,币安宣称其撮合引擎能够达到每秒140万笔订单的处理能力。这串数字,无论是在当时还是现在,都代表着对系统吞吐量和低延迟的极…

SpringBoot08-Spring Boot 多环境配置

方式一&#xff1a;纯 Spring Profile&#xff08;最常用&#xff0c;官方推荐&#xff09;思路&#xff1a;用 application-{profile}.yml 切分配置&#xff0c;运行时指定用哪个 profile。 如何做&#xff1a;src/main/resources/application.ymlapplication-dev.ymlapplicat…

苍穹外卖项目笔记day04--Redis入门

Redis 概念 Redis 是一个开源的、高性能的键值存储系统&#xff0c;常被归类为NoSQL数据库。它支持多种数据结构&#xff0c;如字符串、列表、哈希、集合和有序集合&#xff0c;适用于缓存、消息队列、实时分析等多种场景。Redis是一个基于内存的key-value结构数据库。Redis …

OpenCV 图像处理实战与命令行参数配置:从轮廓检测到模板匹配

在计算机视觉领域&#xff0c;OpenCV 是一款功能强大且应用广泛的开源库&#xff0c;它提供了丰富的 API&#xff0c;支持图像读取、预处理、特征检测等多种操作。本文将结合实际代码案例&#xff0c;详细讲解如何使用 OpenCV 实现轮廓检测、轮廓近似、模板匹配等常用功能&…

深度学习---pytorch卷积神经网络保存和使用最优模型

在深度学习模型训练过程中&#xff0c;如何提升模型性能、精准保存最优模型并实现高效推理&#xff0c;是每个开发者必须攻克的关键环节。本文结合实际项目经验与完整代码示例&#xff0c;详细拆解模型训练优化、最优模型保存与加载、图像预测全流程&#xff0c;帮助大家避开常…

FPGA实现Aurora 64B66B图像视频点对点传输,基于GTY高速收发器,提供2套工程源码和技术支持

目录 1、前言Aurora 64B66B是啥&#xff1f;官方有Example&#xff0c;为何要用你这个&#xff1f;工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本方案在Aurora 8B10B上的应用 3、工程详细设…

LeetCode 524.通过删除字母匹配到字典里最长单词

给你一个字符串 s 和一个字符串数组 dictionary &#xff0c;找出并返回 dictionary 中最长的字符串&#xff0c;该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个&#xff0c;返回长度最长且字母序最小的字符串。如果答案不存在&#xff0c;则返回空字符串。 示例…

kali_linux

【2024版】最新kali linux入门及常用简单工具介绍&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了-CSDN博客

MyBatis 常见错误与解决方案:从坑中爬出的实战指南

&#x1f50d; MyBatis 常见错误与解决方案&#xff1a;从坑中爬出的实战指南 文章目录&#x1f50d; MyBatis 常见错误与解决方案&#xff1a;从坑中爬出的实战指南&#x1f41b; 一、N1 查询问题与性能优化&#x1f4a1; 什么是 N1 查询问题&#xff1f;⚠️ 错误示例✅ 解决…

蓝牙modem端frequency offset compensation算法描述

蓝牙Modem中一个非常关键的算法:频偏估计与补偿(Frequency Offset Estimation and Compensation)。这个算法是接收机(解调端)能正确工作的基石。 我将为您详细解释这个算法的原理、必要性以及其工作流程。 一、核心问题:为什么需要频偏补偿? 频偏的来源: 如第一张图所…

基于STM32的居家养老健康安全检测系统

若该文为原创文章&#xff0c;转载请注明原文出处。一、 项目背景与立项意义社会老龄化趋势加剧&#xff1a;全球范围内&#xff0c;人口结构正经历着前所未有的老龄化转变。中国也不例外&#xff0c;正快速步入深度老龄化社会。随之而来的是庞大的独居、空巢老年人群体的健康监…

简易TCP网络程序

目录 1. TCP 和 UDP 的基本区别 2. TCP 中的 listen、accept 和 connect 3. UDP 中的区别&#xff1a;没有 listen、accept 和 connect 4. 总结对比&#xff1a; 2.字符串回响 2.1.核心功能 2.2 代码展示 1. server.hpp 服务器头文件 2. server.cpp 服务器源文件 3. …

广电手机卡到底好不好?

中国广电于2020年与中国移动签署了战略合作协议&#xff0c;双方在5G基站建设方面实现了共建共享。直到2022年下半年&#xff0c;中国广电才正式进入号卡服务领域&#xff0c;成为新晋运营商。虽然在三年的时间内其发展速度较快&#xff0c;但对于消费者而言&#xff0c;广电的…

Git中批量恢复文件到之前提交状态

<摘要> Git中批量恢复文件到之前提交状态的核心命令是git checkout、git reset和git restore。根据文件是否已暂存&#xff08;git add&#xff09;&#xff0c;需采用不同方案&#xff1a;未暂存变更用git checkout -- <file>或git restore <file>丢弃修改&…

UniApp 基础开发第一步:HBuilderX 安装与环境配置

UniApp 是一个基于 Vue.js 的跨平台开发框架&#xff0c;支持快速构建小程序、H5、App 等应用。作为开发的第一步&#xff0c;正确安装和配置 HBuilderX&#xff08;官方推荐的 IDE&#xff09;是至关重要的。下面我将以清晰步骤引导您完成整个过程&#xff0c;确保环境可用。整…

华为云Stack Deploy安装(VMware workstation物理部署)

1.1 华为云Stack Deploy安装(VMware workstation物理部署) 步骤 1 安装软件及环境准备 HUAWEI_CLOUD_Stack_Deploy_8.1.1-X86_64.iso HCSD安装镜像 VMware workstation软件 VirtualBox安装包 步骤2 修改VMware workstation网络模式 打开VMware workstation软件,点“编辑”…

安全等保复习笔记

信息安全概述1.2 信息安全的脆弱性及常见安全攻击 • 网络环境的开放性物理层--物理攻击 • 物理设备破坏 ➢ 指攻击者直接破坏网络的各种物理设施&#xff0c;比如服务器设施&#xff0c;或者网络的传输通信设施等 ➢ 设备破坏攻击的目的主要是为了中断网络服务 • 物理设备窃…

【Audio】切换至静音或振动模式时媒体音自动置 0

一、问题描述 基于 Android 14平台&#xff0c;AudioService 中当用户切换到静音模式&#xff08;RINGER_MODE_SILENT&#xff09;或振动模式&#xff08;RINGER_MODE_VIBRATE&#xff09;时会自动将响铃和通知音量置0&#xff0c;当切换成响铃模式&#xff08;RINGER_MODE_NO…