DVWA系列2:SQL Injection

前言

SQL 注入是比较常见的攻击类型,之前一直听说过,也尝试看过一些教程,但其中的单引号,字符串拼接等感觉有点抽象,不知道为什么要这么做。这次就使用 DVWA 的环境来演练一下吧。

在这里我们的目标是获取所有的用户名和密码(虽然不是明文)

打开 SQL Injection 页面,将级别调整为 Low

1. 情况分析

正常情况下,我们输入 1,点击 submit 按钮,就会得到这个用户的用户名信息:

此时我们输入 1 AND 1 = 1,再次点击 Submit 按钮,发现并没有报错。而我们输入 1' 再点击按钮后,会提示错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1

说明网页程序将我们的输入内容放入了数据库的查询语句中,即存在可以注入的地方

SQL 注入分为 数字型注入字符型注入 等等多种类型。数字型注入 意思为查询条件为数字类型,同样 字符型注入 意思为查询条件是字符(串)类型的。在我们的场景中,是输入单了引号才报错,说明是 字符型注入

2. Low 难度实操

A. 大概猜测

根据网页上的业务可以大致猜测一下查询语句为:

SELECT * FROM 用户表 WHERE 用户ID = '传入的值';

为了验证猜想,我们传入 1' OR 1 = 1 #,第一个 ' 用于闭合之前的引号,后面的 # 号 用于注释SQL语句后面的内容(原查询语句中的 ' 和 可能的后面内容)。实际执行的 SQL 语句即为:

SELECT * FROM 用户表 WHERE 用户ID = '1' OR 1 = 1 #';

可以看到执行成功,符合我们的预期。

B. 判断字段数量

我们需要判断下返回当前结果的这条查询语句的实际查询字段情况。拼接上 1' UNION SELECT 1, 2 #,并尝试往后逐步增加列数。这里利用的是 Union 操作要求查询的字段数量相等。实际执行的 SQL 语句为:

SELECT f1, f2 ...... FROM 用户表 WHERE 用户ID = '1' UNION SELECT 1, 2 #';

如果拼接上 Union 查询语句没报错,则可以确定查询字段的数量。根据结果中1,2的顺序(我们拼接进去的),可以确定返回字段的顺序。此处只有两个,比较简单。

此处也可以通过 Order By 来判断。Order By 后面加数字,表示按照查询出来的第几列排序,如 Order By 2,意思为按照查询出来的第 2 列排序,而如果没有这么多列,就会有报错信息。据此可以判断查询出的列数量。

C. 获取敏感信息

由于我们的目标是查询用户表中的用户名和密码,因此我们需要找到对应的数据库,对应的表,对应的字段。对于 MySQL 数据库,这些内容存储在 information_schema 这个数据库中。

首先利用 Union,查出当前数据库中所有的表。输入 ' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #。MySQL 内置的group_concat 函数可以将多个列组合起来。(此时不在 ' 前输入既有的 id 的值 1,这样可以避免查出我们不需要的数据,只需一行就得到了结果)

可以看到当前数据库中有 guestbook 和 users 这两张表。显然我们的目标就是 users 表了,继续查询这个表中有哪些列。输入 ' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' # ,得到结果:

距离目标已经很近了!继续输入 ' union select 1,group_concat(concat(user, '-', password)) from users #,得到结果:

Low 的目标达成(怎么感觉怪怪的)!接下来探索 Medium 难度吧!

3. Medium 难度准备工作

A. 引入 BurpSuite

将难度调整为 Medium,可以看到已经没有了输入框,变成了下拉选择:

其实对于 WEB 页面来说,无论是输入框,还是下拉选择,或者是其它方式,最终反映到与后端服务器的交互,都是通过 HTTP 请求(当然还有 WebSocket)。如果我们可以拦截这些请求,并尝试修改,不是一样可以达到注入的目的吗。我们可以使用 Burp Suite 来实现这个操作(Burp Suite 有很多其它的功能,这里用得比较简单)。

因为还有很多攻击的形式没有尝试,考虑到操作便捷性和以后的使用,这里使用了另一台安装了 Kali Linux 的虚拟机,其中包含了很多其它的工具。请务必在法律允许的范围内使用!!!

官方网站下载 Kali Linux 针对 Vmware 虚拟机的镜像,并启动即可。默认的用户名和密码都是 kali

B. Burp Suite 拦截相关配置

我们需要先设置浏览器,让所有的流量都通过 BurpSuite (默认 8080 端口),这样才能拦截的到。打开 Firefox 浏览器(火狐大法好,破音),在 General 中找到 Network Settings,并设置代理为 localhost,端口号为 8080,如图:

在 Firefox 浏览器中打开我们的 DVWA 站点,调整 DVWA Security 中的难易度为 Medium,并打开我们要操作的 SQL Injection 页面。之后打开 BurpSuite,在 Proxy 一栏点击 Intercept is off 以打开拦截器。随后在 Firefox 浏览器中的流量都会被 BurpSuite 拦截。

4. Medium 难度实操

点击 DVWA 页面的 submit 按钮,可以在 Burp Suite 中看到如图所示的结果:

可以看到我们选择的参数被放在了红框所示的位置,接下来像在 Low 里面一样将注入的内容拼接到此处即可。

A. 注入类型判断

id=1 修改为 id=1' OR 1 = 1 #,并点击 Forward 按钮放行流量,可以看到 Firefox 浏览器中提示报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' OR 1 = 1 #' at line 1

这说明该注入漏洞不再是字符型注入了。尝试数字型注入,将 id=1 修改为 1 OR 1 = 1 #,再次放行流量,发现没有报错,网页展示了很多用户的信息,验证了 数字型注入 的猜测。

之后的思路和在 Low 里面的基本一样,唯一的不同是输入的内容在 BurpSuite 中修改

B. 判断字段数量

id=1 修改为 0 UNION SELECT 1, 2 #,没有报错,确定查询语句查询的字段数量是 2 个,同时确定字段顺序。

C. 获取敏感信息

查找数据库中所有的表,替换为:

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

需要注意的是,前面必须要带有值 0。 因为字符型注入可以直接用 ' 闭合为空字符串,而数字型注入如果没有值,我们替换后实际的执行语句就变成了: SELECT * FROM 表名 WHERE id = union select 1 ........ 这样,会造成语法错误。

查看表中所有的列。替换为:

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

此时发生了错误

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'users\' #' at line 1

可我们并没有传入 \'users\' 这样的东西进去。通过分析或者查看下DVWA的源代码(/var/www/html/vulnerabilities/sqli/source/medium.php)发现,此时将单引号转义了:

此时可以通过将字符串转换为十六进制来绕过转义。通过在线工具将字符串 users 转换为 7573657273,修改我们的拼接为:

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

可以看到此时得到了我们想要的结果:

获取用户名和密码。替换为:

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

原来的 '-' 也替换为了对应的十六进制 0x2d。获取到了结果:

Medium 的目标也达成了!!!

5. High 难度实操

查看页面和源代码发现,实际与之前的 Low 几乎一样,只是通过弹出页面,利用 Session 传值。而且多了一个 LIMIT 1,限制了返回数量只有1条而不是多条,如图:

而按照我们之前的注入操作都是一行返回,因此我们输入:

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

即可达成结果。

6. Impossible 难度实操?

Impossible 难度旨在为我们提供一个比较安全的代码示例:

调整为 Impossible 难度,实际是很难注入的了。

参考

DVWA-------简单的SQL注入

DVWA之SQL注入

DVWA SQL Injection SQL注入全等级分析与实践

DVWA-7.4 SQL Injection(SQL注入)-Impossible

DVWA系列2:SQL Injection的更多相关文章

  1. (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析

    一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...

  2. (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析

    一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...

  3. 【DVWA】【SQL Injection】SQL注入 Low Medium High Impossible

    1.初级篇 low.php 先看源码,取得的参数直接放到sql语句中执行 if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQ ...

  4. 【DVWA】【SQL Injection(Blind)】SQL盲注 Low Medium High Impossible

    1.初级篇 Low.php 加单引号提交 http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1'&Submit=Submi ...

  5. dvwa学习之七:SQL Injection

    1.Low级别 核心代码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; ...

  6. DVWA靶场之SQL injection(blind)通关

    盲注,顾名思义,无法从界面上直接查看到执行结果,一般的SQL注入基本绝迹,最多的就是盲注 基本步骤:(由于没有回显了,相比一般的SQL注入,也就不需要确定查询字段数.判断回显位置了) 判断注入类型 破 ...

  7. DVWA靶场之SQL Injection通关

    SQL注入,一个大概的手工流程: 判断是否有注入,什么类型 破解SQL语句中查询的字段数是多少 确定回显位置 破库 破表 破字段 获得内容 Low: <?php if( isset( $_REQ ...

  8. 使用sqlmap注入DVWA的SQL Injection菜单

    1 使用sqlmap注入DVWA的SQL Injection菜单 本教程中的登陆地址:http://192.168.0.112/dvwa/login.php 1.1 获取cookie信息 1) 使用a ...

  9. sqlmap dvwa SQL Injection使用小记

    刚刚开始学习sql injection,初步使用sqlmap,使用 GET http://www.dvssc.com/dvwa/vulnerabilities/sqli/?id=1&Submi ...

  10. DVWA SQL Injection 通关教程

    SQL Injection,即SQL注入,SQLi,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的.SQL注入漏洞的危害巨大,常常会导致整个数据库被“脱 ...

随机推荐

  1. 齐博x2新用户手工注册接口

    由于手工注册有点太落后了,并不推荐,所以我们也没有单独的为API接口开发一个注册的页面,大家可以统一使用PC或WAP的注册页来当接口使用.请求地址是:http://qb.net/index.php/i ...

  2. 【JavaSE】面向对象三大特征——封装、继承、多态

    前言:本文主要介绍思想 封装 封装这一概念并不仅存在与面向对象中,甚至说封装这一概念不仅限于编程中,其实生活中的封装无处不在.比如 需求:你到银行取钱 参数:你只需要提供银行卡和密码 返回值:柜员会将 ...

  3. numpy(ndarray)和tensor(GPU上的numpy)速查

    类型(Types) Numpy PyTorch np.ndarray torch.Tensor np.float32 torch.float32; torch.float np.float64 tor ...

  4. 京东云开发者|ElasticSearch降本增效常见的方法

    Elasticsearch在db_ranking 的排名又(双叒叕)上升了一位,如图1-1所示;由此可见es在存储领域已经蔚然成风且占有非常重要的地位. 随着Elasticsearch越来越受欢迎,企 ...

  5. 图文详解丨iOS App上架全流程及审核避坑指南

    App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都"死"在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上架流 ...

  6. node 创建服务器方法

    方法一 let http = require('http') let httpserver = http.createServer(function(req,res){ res.writeHead(2 ...

  7. 修改Oracle共享池大小

    1.  sysdba登录数据库 [oracle@ufdb165 ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Wed Au ...

  8. 基于python的数学建模---蒙特卡洛算法

    import math import random m = input('请输入一个较大的整数') n = 0 for i in range(int(m)): x = random.random() ...

  9. MASA Framework -- 跨进程事件 IntegrationEventBus入门与设计

    概述 跨进程事件总线允许发布和订阅跨服务传输的消息, 服务的发布与订阅不在同一个进程中 在Masa Framework中, 跨进程总线事件提供了一个可以被开箱即用的程序 IntegrationEven ...

  10. java - - spring:定时任务

    转载:https://www.cnblogs.com/lishupeng/p/7680644.html 开启定时任务: <beans xmlns="http://www.springf ...