
尋找SQL注入點的 way
在企業中有如下幾種方式可以選擇;
- 自動化
- 白盒基于原始碼卡點審計
- 黑盒基于流量進行自動化掃描 - 手動
- 手動白盒看代碼
- 手動黑盒檢查
MySQL Inject 入門案例
沒有做任何過濾,直接把引數插入到SQL陳述句中,就是注入點;
PHP Demo:
// 接收來自前端輸入引數id
$uid = $_GET['id'];
// 構造查詢SQL陳述句,注意這里,uid引數沒做過濾就放到SQL陳述句中進行拼接
$sql = "select * from user where user_id = $uid";
// 陳述句也未使用預編譯,就執行查詢動作,SQL注入就是這么產生的
query($sql);
注意,上面只是一個演示案例,現在的Web框架基本是MVC模式的,Model層一般不接收前端的引數,接收前端引數一般在Control層完成,也就意味著查詢SQL注入的時候你需要跟蹤一個前端引數從Control層傳遞到Model,這期間,一個前端引數可能會經過十幾個函式的呼叫傳遞都是有可能的,這個時候考驗你的就不是技術了,而是耐心,
自動化審計的嘗試之旅
最開始使用的是Seay源代碼審計工具,后面使用的是Rips代碼審計工具,發現都不能滿足自己的需求,因為有個致命缺陷,就是會有遺漏的SQL注入找不全,這樣就非常危險了,你說XSS、CSRF這種攻擊客戶端的洞,漏幾個就漏幾個了,但SQL注入這種攻擊服務端的漏了幾個,如果漏的那幾個還被外部發現了,那飯碗還要不要了?
比較的結果是 Rips 比 Seay 誤報率、準確率要高好幾個檔次,使用Risp能提高審核的效率,但是并不能提高精度,所以正確用法的是,拿到陌生的代碼時,可以使用Rips先掃一遍,先找出一些容易找到SQL注入點,想要覆寫全,并且有精度的效果,往下看,
Taint這種引數污染標記跟蹤的工具又會比Rips的準確率高,
人工審計才能保證精度
精度和效率感覺是個矛盾;
Taint總會有誤報和漏的,畢竟taint是基于流量的,如果沒有人點擊那個url,是不可能檢測出來的,可以用一個笨方法來解決,現在的情景下,光靠檢測工具是可能的,只能說依靠工具輔助人來提高效率而已,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14074.html
標籤:其他
