為什麼 sqlmap 源碼看起來那麼費勁?
最近在看sqlmap的源碼,參考了烏雲上的源碼分析,可是越看越混亂,想提升在python編程方面的能力,該怎麼辦?
謝邀,是這樣的:
1. 首先你應該搞懂它的架構體系,模塊與分層,設計模式等。說白了,你得懂軟體工程。
我為什麼會在技能表裡特別推薦讀它的源碼,絕不僅它的 SQL 注射能力一流,還因為它的軟體工程牛逼到不行。你可以想像下,能打造如此穩定的框架工具已經不是件簡單的事。如果你深入下去就會發現裡面處處是軟體工程那些優秀思想,關於這點比起曾經的 w3af 不知道要牛逼多少倍,後來 w3af 卧薪嘗膽搞了次重寫,才有現在的地位。
這個軟體工程舉些具體的點吧,比如並發,如果你連什麼是並發,什麼是線程、鎖、條件、信號、超時、異常等概念都不懂;再複雜點並發里進程、線程、協程的差異是什麼;再再複雜點 Python GIL、垃圾回收、性能陷阱;再再再複雜點 Python 那些內置模塊、第三方模塊的 ugly 點的 hack,看到這些源碼你估計會哭死…哦,對了,如果你並不熟 Python,那麼那些 Pythonic 的技巧估計也會讓你懷疑自己、懷疑世界…
說的題外話:如果你把 sqlmap 當產品來讀,還能讀出更多東西;如果你把 sqlmap 當作開源社區運作模式來讀,又能讀出更多東西。如果不是因為它的開源運作、產品、軟體工程、SQL 注射的一流,我們也不會持續用它並提交貢獻代碼與 Bugs 反饋。
正因為這種優秀,你要讀的東西可多了,當然難!
2. 要吃透 sqlmap,還有一個非常關鍵的是,熟練 SQL 注射各類技術與技巧,熟練基於 SQL 的後續滲透技巧,sqlmap 支持幾乎所有主流資料庫的注射。
這又是一大難題。如果你不熟悉,你絕對想不到它為什麼那樣發包,為什麼那樣處理…
哦,對了,如果你並不是一名滲透手,你絕對難以思考到為什麼 sqlmap 集成了那一堆技巧。
3. 雖然有人寫了些小而美的工具來比拼 sqlmap 的一些不足,但還是向 sqlmap 致敬,他們在不斷改進。
以上是我從事黑客工程化數年經驗的一些回饋。不用怕,啃久了自然熟。
最後,./sqlmap.py -h 開啟一個縱深知識領域吧:)
-----------
補充下,這就是為什麼我們有些源碼風格類似 sqlmap,吸收好的。
計劃在我公眾號(lazy-thought)里展開寫寫 sqlmap 和一些優秀的 Python 黑客工具,僅計劃而已,感興趣那關注吧。最近,一直在做內部的分散式集群掃描器,有機會集中精力的閱讀了一下SQLMap代碼,在完全兼容SQLMap Payloads的基礎上重新實現了SQL掃描器。
SQLMap做為一款工具是非常優秀的,但不適合做集群並發,所以要重寫。
從軟體設計上來說,層次是很清晰的,但具體的代碼實現上有不太優雅的地方,尤其是regex用的太多(我不太喜歡用regex)。
包括幾個方面:
1、和所有的程序一樣,啟動的時候要先裝在配置和初始化系統變數,其中重要的兩個配置是payloads 和 dbms相關的信息;
payloads中分為兩部分: boundary 和 testing 。。很重要
2、對payloads的管理,當給出一個url,如何獲得污染的url,這個過程比較複雜3、網路控制部分;4、http 響應分析,這個部分和 如何污染關係很大;5、邏輯判斷,涉及到很多演算法一般過程:
1、先猜測dbms,具體實現就是用一段可以導致Database出錯的參數注入進去,根據響應輸出來找到對應的dbms,很可能找不到,就盲注入。。。
2、進行不同的payloads注入,主要包括以下幾個: payload的注入很有意思,根據參數值的類型(數值,字元串),有些請求還要進行SQL轉意,比如: Error-Based/UNION Query,原因很簡單,避免干擾對輸出的分析。比如 :CONCAT(0x20,,)這樣的函數,如果被執行了,就是一個字元串。 2.1 Error-based : 一般分析不到dbms,基本上也無法實現Error-based,分析原理很簡單,看響應輸出是否有特定的字元串; 2.2 Boolean-based: 通過成對的邏輯真和邏輯假(僅是可能)構造請求,根據每次的響應輸出,對比內容的差異範圍。。。 2.3 QUNION Query: 在枚舉列的時候那個演算法很精妙; 2.4 Timer-based: 根據多次的rt,經過方差演算法,推斷,這個受網路影響比較大,在獲取dbname 處的演算法和Boolean-based一樣,演算法也是很精妙的,其實就是枚舉+二分法。隨便簡單寫了一些,希望對你有幫助。SQLMap是個很好的工具,但沒有那麼複雜,只要花點時間閱讀代碼,可以搞懂的。
對了,還需要了解各種資料庫知識,裡面涉及到很多資料庫相關的知識。。。越難得越有價值,當然,這得符合你的價值尺度,通俗地說,就是對你現在或者以後有沒有用,如果你是一個做應用的那麼沒啥用,如果你是一個py程序員那麼可用,再或者你是信息安全愛好者那麼好用,再或者你是黑帽py那麼很適合,嗯,你既然都想讀了,那就是你承認了它的價值,那麼就靜下心來吧,其實吧,我感覺難是浮躁表現的一種形式,拿出決心來要得就是那種不到黃河不死心的決心,好吧,其實我不懂py-_-#,只是路過。
推薦閱讀:
※營銷人想學python,卻被卡在pycharm官網下載不了這環,求助?
※pycharm和eclipse+pydev的對比?
※0基礎小白學python,我想打算學習selenium+python 這一塊,該怎麼辦?
※做數據分析里有哪些Python能做,而MATLAB不能做的?
※如何看待 MATLAB R2015a 開始支持調用 Python?