第25天
SQL/PostgreSQL读写注入
前提:注入对象拥有SQL数据库的最高权限root(Access无法获得最高权限,因此也不适用读写注入)
使用方法:
INTO OUTFILE
子句将查询结果以文本格式写入文件,如果文件已经存在,查询会失败。
SELECT 1,一句话木马,3 INTO OUTFILE 'C:data.txt';
这条语句会将 一句话木马的内容导出到指定的文件中。如果攻击者可以控制这部分 SQL 语句,他们可能会将敏感数据导出到一个他们知道的位置。
LOAD_FILE()
可以用来从文件系统中读取文件的内容。通过 SQL 注入利用 LOAD_FILE() 可以允许攻击者读取数据库服务器上的任何文件,前提是 MySQL 的进程具有读取该文件的权限,并且文件的路径必须是绝对路径。
SELECT LOAD_FILE('C:data.txt')
这个语句将返回 data.txt
文件的内容,通过读取这样的文件,攻击者可能会获得敏感信息,进一步加深攻击的严重性。
所受限制:
secure-file-priv
变量通常在 MySQL 服务器的配置文件(如 my.cnf 或 my.ini)中设置。例如:
secure-file-priv = "/var/lib/mysql-files"
这样配置后,所有通过 LOAD DATA INFILE 和 SELECT … INTO OUTFILE 生成的文件都只能在 /var/lib/mysql-files 目录中进行操作,超过这个目录范围就会读写失败。
突破限制:
借助PhpMyAdmin或者其他可控MySQL后台(普通框内注入是不能修改的)
set global slow_query_log = 1; //打开MySQL日志记录
set global slow_query_log_file = "Shell路径(后缀.php)"; //设置日志存储路径
select 一句话木马 or sleep(11); //通过日志记录会将这句木马存储到日志中
也就相当于MySQL变相帮我们存储了一句话木马
SQL Sever
SQL Sever和PostgreSQL
的使用跟MySQL
其实很像,都可以查询版本信息,用户名和数据库名 等,不过在order by时MySQL
用的是数字:1、2、3而SQL Sever和PostgreSQL
用的是:null、null、null
SQL Sever用户最高权限名是sa,而不是root