利用sql注入读取服务器文件,如何通过SQL注入获取服务器本地文件

13426ae9f12024c9423998b59d10dbba.png

写在前面的话

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()。

f47f28cdbfeb0961a91097536f854f0d.png

我们可以从上面这段代码中看到,如果我们可以想办法修改查询语句,然后让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ℑ_download=Download

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值