sql注入之outfile

《sql注入之outfile》 图片.png

传送门:

接着上次的教程,我们这次将sqli-labs的lesson 7。这里用到了一个比较神奇的东西——outfile。因为Sunny对我的服务器做了一些权限限制,而且大家对于注入的流程已经有了一定的了解,所以我们这次试验主要在mysql中完成即可。大家在平时写代码的过程中可能看到过某些语句,比如说:

select [column...] from [table_name] into outfile [path];

这就是我们今天要说的重点,这个语句通常是可以用于导出数据信息的,但是也可以被sql注入利用。具体的做法也很简单,首先我们可以先想办法找出对象服务器的系统是什么,然后找到apache的根目录,后面要做的大家可能也都知道了,就是利用上面这个语句,将一个文件放到根目录中。这个过程是不是看着有点眼熟,不错,这种做法感觉像不像木马。把我们的要执行的php文件放到apache的目录中,然后我们再访问这个php文件,结果不就是相当于让服务器执行了我们想要执行的内容。不得不说,这真是php的动态性的好处,直接热部署文件都可以执行。
下面,Sunny就带大家来感受一下这个过程吧。首先我们登录mysql中:

《sql注入之outfile》 图片.png

随便选择一个数据库,我这里就选择我们注入的security数据库:

《sql注入之outfile》 图片.png

然后我们就来实践之前我们说到过的语句,数据我就随便选了,路径我们就选择apache的根目录:

select * from users into outfile '/var/www/html/aa';

结果报错了:

《sql注入之outfile》 图片.png

因为我们限制了mysql的导入导出的文件权限,只能将文件导入或导出到指定位置。
那么我们就来查看它所说的安全的位置是在哪里,我们可以用下面的语句来进行查询:

show variables like 'secure_file_priv';

《sql注入之outfile》 图片.png

所以,我们只能将文件导出到那里,或者从那里导入文件了:

select * from users into outfile '/var/lib/mysql-files/aa';

可以看到导出成功了:

《sql注入之outfile》 图片.png

同样的,我们可以尝试导出一个php文件,比如:

select '<?php phpinfo() ?>' into outfile '/var/lib/mysql-files/test.php';

《sql注入之outfile》 图片.png

然后,我们再去/var/lib/mysql-files 目录下查看是否真的导出成功了:

《sql注入之outfile》 图片.png

《sql注入之outfile》 图片.png

《sql注入之outfile》 图片.png

总结

outfile这个方法其实在实际注入过程中,要说破坏性确实比较大——实际上对数据的破坏危害性也非常大,如果可以成功,理论上是可以对整台服务器造成危害的;但是这个问题真的非常容易防治,在严格的文件权限管理下,基本上很难成功,比如Sunny这次尝试,只能将文件放到/var/lib/mysql-files目录中,而无法放到apache的目录中,这也就意味着这个php文件无法运行——当然,如果尝试用shell的话或许有办法?
总而言之,言而总之。在sql注入中,如果可能找到注入点的话,极大概率是用盲注完成的。下一篇,Sunny将和大家分享一下盲注的内容,大家将会打开sql注入新世界的大门。

欢迎评论留言交流,有两种方式:

第一种

评论留言

第二种

邮箱联系:zsunny@yeah.net

    原文作者:程序员Sunny
    原文地址: https://www.jianshu.com/p/1f97795443ce
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞