如何找到SQL注入中的鹽

SantosPena 7年前發布 | 28K 次閱讀 SQL注入 SQL 安全相關

介紹

很多人說 Web 應用滲透測試是一個應用已有工具和方法的已知區域,但其實每個項目都會遇到一些新的技術和令人感興趣的新場景,這些挑戰令人興奮。我們從相對簡單的 SQL 盲注入手,展現其如何被利用到可以執行遠程代碼。我們在測試的過程中會用到 Dunacn ,這是我們用來輔助 SQL 盲注利用的簡單框架。

SQL盲注

最初的漏洞存在于應用編輯器,提交的參數之一只是簡單的連接成了 SQL 查詢語句,而沒有進行檢查和過濾。但是我不能通過應用程序的響應或錯誤信息來得到注入的結果。因此,這是一個簡單的盲注場景,但是對于從數據庫中提取想要的數據仍然不容易。為了簡單起見我使用了 SQLmap,但是我無法得到工具可識別的注射參數。像往常一樣,我還是使用了 Duncan,Duncan 可以提取像這樣場景下的數據。我創建了一個簡單的模塊,使用下列表達式來執行請求(后端使用的數據庫是 PostgreSQL):

"ascii(substr(cast((%s) as varchar),%d,1))<%d"

Duncan 會用可執行的請求參數來代替第一個占位符(%s),第二個占位符指明了我要猜測的字符位置,第三個占位符是猜測的字符值。Duncan 會開始執行多線程的請求來檢索注入請求的結果。在映射數據庫結構后,我就有希望快速得到能登錄應用管理交互界面的密碼。

$ wc -l mytarget.py # Including blank lines, imports, and everything...
22 mytarget.py
$ python run_duncan.py --use mytarget.SimpleDuncan --query "select password from users where id=1" --pos-end 33 --threads 5 --charset 0123456789abcdef
deadbeefdeadbabedeadbea7deadc0de

為了提高效率,我使用自定義的字符集,并且基于之前測試的結果設置了最大長度,看起來該應用程序以十六進制存儲了密碼的 MD5 哈希值。我成功的得到了一些重要用戶的密碼哈希值,我也得到了我自己的哈希值以便進行驗證。我嘗試了帳號、密碼、相關信息的多種組合,但是這都和數據庫中存儲的不一致。

深入研究

很明顯,在密碼的哈希過程中有“鹽”的參與,但我不知道“鹽”是什么。有可能是前綴形式、后綴形式或者級聯哈希構造(如 MD5(MD5(password)||salt) )等,但是沒辦法猜出它使用的是哪種方法。幸運的是,我記起我看過的 一篇文章 ,講的是如何使用數據庫的元數據來 SELECT 當前執行的請求,他稱之為 SQL inception 。如果哈希的計算在數據庫中而不是在應用程序中計算,這就是一個機會,我可以捕捉設置哈希過的密碼的請求,從而了解哈希值是如何生成的。首先,我必須要找出我注入了什么。盡管我猜測我使用 UPDATE 指令 修改了用戶表,但有些其他請求被我的注入破壞也是有可能的,那么在這種情況下這個方法就是不切實際的。幸運的是我是正確的,看起來我確實成功注入了 UPDATE 指令:

注:事實上,我可以利用并行執行來檢索 UPDATE ,但是我選擇了用另一個請求注入,雖然這樣的利用過程變得效率更低。

$ python run_duncan.py --user mytarget.SimpleDuncan --query "select upper(query) from pg_stat_activity" --pos-end 6 ascii-end 97
UPDAT

我試圖找到設置密碼的那部分請求,但有趣的是我得到了完全不可信的結果。幾經測試后,我決定找出更多關于 pg_stat_activity 表的信息:

$ python run_duncan.py --user mytarget.SimpleDuncan --query "select cast(count(*) as varchar) from pg_stat_activity" --pos-end 4 --charset 0123456789
35

似乎其他人也在使用數據庫,最初的請求得到了錯誤的數據。為了解決這個問題,我使用 WHERE 來限制我請求得到的結果:

$ python run_duncan.py --user mytarget.SimpleDuncan --query "select cast(strpos(upper(query),'MD5') as varchar) from pg_stat_activity WHERE query like '%S2S2S2%'" --pos-end 4 --charset 0123456789
156

由于 WHERE 子句將會被包含在 ps_stat_activity 表的查詢屬性中,它保證了查詢請求可以包含它本身。找到調用 MD5 函數的位置我就可以查看參數了:

$ python run_duncan.py --user mytarget.SimpleDuncan --query "select upper(query) from pg_stat_activity WHERE query like '%S2S2S2%'" --pos-end 4 --ascii-end 97 --pos-start 150 --pos-end 180 --threads 10
ORD = MD5('MYPASS#SOMESALT#'

清楚了哈希值是如何構建的,我就可以在基于 GPU 的破解器中加載之前收集的管理員哈希。 oclHashcat 在破解 MD5 時的表現很好,大部分的密碼都可以通過暴力破解得到,特別是在“鹽”不變的情況下。現在我可以使用破解后的密碼,加上用 WPScan 枚舉的用戶名可以登錄一個 WordPress 博客的管理面板。在 WordPress 的管理頁面,我以 PHP 模版的名義上傳了一個后門程序,此時我就可以以服務器高級權限來執行遠程代碼了。

結論

在這篇文章中,我展示了 SQL inception 這項技術應用到滲透測試中如何解決實際問題,以及如何根據 Duncan 的結果進行微調來得到最佳結果。我們也想強調密碼的管理和存儲仍然是簡單 Web 應用和復雜企業系統的主要弱點。我們給開發者和管理員的建議:

  • 使用參數化請求或 ORM 用于數據庫訪問,已經到了 2015 年,你不應該再使用手工拼接的 SQL 請求了!
  • 使用現代密碼擴展算法用于密碼存儲,Bcrypt、PBKDF2、Scrypt 和 yescrypt 都 各有優勢 ,從實際情況來看,這些設計都能顯著的提高攻擊者破解的難度。MD5 和 SHA-* 的設計都不是適合密碼存儲而是標定指紋。
  • 使用盡量長的、獨特的“鹽”,前面提到的大多數算法都允許你自己定制“鹽”
  • 你系統的安全性不應該依賴于“鹽”或所使用算法的保密性
  • 使用離線的密碼管理器,不同的系統永遠不要使用相同的密碼
  • 如果不得不將密碼記在心里,使用 長密碼短語 來代替傳統的密碼。教你的用戶用相同的方式來貫徹落實密碼策略,而不是 用長密碼來代替復雜的密碼

 

來自:http://www.freebuf.com/articles/web/124785.html

 

 本文由用戶 SantosPena 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!