继续深入学习SQL注入
通过SQL注入,我们不仅可以获取数据库内容,还可以通过具有一定权限的数据库用户,对操作系统进行操作,本文讲的就是文件系统进行的操作。
本部分参考lcamry先生的《SQL注入天书》的background 3
相关操作函数
Load_file(file_name):读取文件并返回该文件的内容作为一个字符串
使用条件:
A.必须有权限读取并文件必须完全可读
B.欲读取文件必须在服务器上
C.必须指定文件完整的路径
D.欲读取文件必须小于max_allowed_packet
如果上述任一条件不能满足则文件不能被读出,函数返回空。其实这里最难满足的是条件要求
在实际的注入中,这里有两个难点需要解决
a.绝对物理路径
b.构造有效的畸形语句(报错爆出绝对路径)
在很多PHP程序中,当提交一个错误的Query,如果display_errors==on ,程序就会暴露WEB目录的绝对路径,只要知道路径,那么对于一个可以注入的PHP程序来说,整个服务器的安全将受到严重的威胁
示例
select 1,2,3,4,5,6,7,hex(replace(load_file(char(99,58,92,119,105,110,100,111,119,115,92,114,101,112,97,105,114,92,115,97,109)))
这里的char()函数可绕过某些黑名单的过滤
利用hex()将文件内容导出来,读取二进制文件,尤其是smb文件时可以使用
利用LOAD DATA INFILE 和 LOAD_FILE 命令,将文本文件读到数据库中
首先我们需要创建一个简单的文本文件,用于存储导入数据库的表格信息
接着在Mysql控制台运行下列命令,创建一张表用于保存上述信息
接下来便可以开始我们的导入工作了
load data infile '文件路径" into table authors fields terminated by ' ';
OK导入成功,接下来看看效果
在执行操作的时候容易碰到没有权限的问题,
我们可以找到mysql目录下的bin,打开my.ini,找到包含secure_file_priv的项,对其包含的路径做一个注释即可
我们还可以任意内容(数据库操作也可)到文件中去,这里需要文件权限。
语法为
select ……… into outfile 'file_name' [file_name]不能已存在的文件
a.直接导入内容
select version() into outfile 'c:\\xxx\\xxx\\xxx\\xxx.txt'
select into outfile '文件路径'
b.插入内容到文件结尾
Select version() Into outfile “c:\\phpnow\\htdocs\\test.php” LINES TERMINATED BY 0x16进制文件
解释:通常是用‘\r\n’结尾,此处我们修改为自己想要的任何文件。同时可以用FIELDS TERMINATED BY
当前台无法导出数据时,可使用下列语句
select load_file(‘c:\\wamp\\bin\\mysql\\mysql5.6.17\\my.ini’)into outfile ‘c:\\wamp\\www\\test.php’
采用sqli-labs level7(dump into outfile)进行实验
发现是'))格式
结果为三
结果显示出错,我们检查一下文件是否创建成功
OK,文件已创建
连接成功,为所欲为吧