MySQL数据库测试
MySQL服务器有一些特殊性,因此一些利益需要特别定制的应用程序
测试
当在MySQL数据库支持应用程序中发现SQL注入漏洞时根据MySQL的版本和用户的DBNS上的权限不同,可能会发生许多的不同的攻击。
- 从4.0开始:union查询
- 从4.1开始:子查询
- 从5.0开始:储存过程储存函数和名为information_shema
- 从5.0.2版本:触发器
注意:在4.0版本之前的MySQL版本,没有实现子查询功能和union语句,只能使用布尔值或者基于时间的盲注。
http://www.example.com/page.php?id=2
单引号问题
再利用SQL注入特性之前,必须考虑在语句中使表示的字符串,因为web应用程序经常回转义单引号
MySQL将转义的(/')解释成为字符而不是元字符,为了工作,有俩种情况需要区分
1.web APP转义单引号
2.web APP不转义单引号
多混合查询
MySQL数据库连接器不支持多个分组查询,无法支撑多个非同构SQL命令在一个单一的一个SQL注入漏洞
信息收集
MySQL服务器的特性,可以从其他的DBMS忽略MySQL语句中的子句。
1/*! and 1=0*/
如果MySQL是存在,注释块中的语句将会被解释
三种方法可以获得信息
- 通过全局标量@@version
- 使用函数[version]
- 通过版本号/!40110 and 1=0/表示注释指纹
用户登录
MySQL服务器依赖的用户有俩种
[user()]:用户连接内部服务器
[current user()]:内部用户执行的查询
联合注入:
1 and 1=0 union select user()
推断注入:
1 and user() like 'root%'
数据库名称的使用:
联合注入:
1 and 1=0 union select database()
推断注入:
1 and user() like 'db%'
攻击向量
写入权限
如果被连接的用户有file权限并且单引号没有被转义,'into outfile'可以对文件的查询结果进行输出。
select * from table into outfile '/tmp/file'
注意:没有办法绕过文件名附近的单引号,如果存在有一些清理单引号,如escape(''),将无法使用此子句
读取权限:
load_file()函数是一个本地函数,在文件系统允许的权限下可以读取文件,如果用户存在file权限,使用前面描述的技术可以绕过单引号转义处理。
load_file('filename')
标准注入攻击:
在一个标准SQL的标准注入中,你可以将结果直接显示到页面上,作为正常输出或者是mysql错误,通过我们了解的SQL注入攻击和MySQL的特性,可以很容易的实现。主要取决于MySQL数据库的版本。一个好的攻击方法是通过强制函数、程序、或者服务器本身来抛出错误来了解结果。
外部SQL注入
外部SQL注入可以通过使用'into outfile'来完成
SQL盲注
SQL盲注是使用的是,mysql服务器自带的一套有用的函数
字符串的长度:length(str)
从给定的字符串获得字符串:substring(string,offset,#chart_return)
基于时间的盲注benchmark(基准测试)和sleep:
benchark(#ofcycle,action_to_be_performed)
当布尔盲注没有任何的结果的时,可以使用基准函数进行定时攻击
sleep()当MySQL>5.0时作为基准测试的替代
注入工具:
mutiple DBMS SQL injection tool(http://www.sqlpowerinjector.com)
sqllbftools
SQLmap
mysqloit
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构