RTFSC——SQLMap源碼(慢慢更給本身)

 由於主要是本身看SQLMap源碼有個記錄,因此寫上來的東西,對我我的來講就是想到什麼寫什麼,比較雜亂,推薦看參考中各位大牛的文章。html

==============================================================python

  1. 流程圖
  2. 目錄結構
  3. 流程
  4. 源碼詳讀

==============================================================mysql

  1. 流程圖

  2. 目錄結構

    1. sqlmap-master
      ├── doc
      ├── extra
      ├── ISSUE_TEMPLATE.md
      ├── lib
      ├── plugins
      ├── procs
      ├── README.md
      ├── shell
      ├── sqlmapapi.py
      ├── sqlmap.conf
      ├── sqlmap.py
      ├── tamper
      ├── thirdparty
      ├── txt
      ├── udf
      ├── waf
      └── xml

              doc: 一些文檔,Readme.pdf 內容跟wiki內容大部分一致,值得一看sql

              extra: 一些外部工具 shell

              lib: 核心源碼實現數據庫

              plugins:插件。generic子文件爲通用的一些相關插件、 dbms子文件夾具體到各類特定數據庫相關的一些插件(鏈接器、枚舉、指紋、文件系統、語法、接管相關)會在exploit SQL injection中用到。api

              procs: 幾種特定數據庫預設的一些具備必定功能的SQL代碼段。bash

              shell: 被轉碼的一些shell,使用/extra/cloak/cloak.py能夠轉回源碼cookie

              tamper: 存放衆多tamper腳本session

              thirdparty: 第三方腳本

              txt: 一些文本類型的內容,爆破用的字典、目錄、表等,UA信息。

              udf: mysql 和 postgresql的一些UDF文件(多平臺、多架構)

              waf: 識別waf用到的一些指紋信息等。

            xml: banner子文件夾,一些用於識別的banner信息;payload子文件夾,各類injection技術的payload信息;boundaries、errors、livetests、queries的相關靜態信息。

  3. 流程

    1. sqlmap.py
      
      #函數入口
      =============sqlmap.py=============
      main()
      	checkEnvironment()
      	#運行環境監察
      	setPaths(modulePath())
      	#設置一些路徑信息,並檢查一些文件的可用性
      	banner()
      	#打印一些banner信息
      	
      	cmdLineOptions.update(cmdLineParser().__dict__)
      	#解析命令行參數到cmdLineOptions這個屬性字典
      	initOptions(cmdLineOptions)
      	#初始化conf、kb屬性字典,並用cmdLineOption中的設置項填充conf
      		
      		
      	init()
      	#一系列的初始化工做(包含對conf、kb的填充)	
      	
      	start()
      =============controller.py=============
      #此中存在大量須要用戶指定纔會觸發的處理流程,因此我略過一些操做,只挑一些提
      start()
          if conf.url and not any((conf.forms, conf.crawlDepth)):
              kb.targets.add((conf.url, conf.method, conf.data, conf.cookie, None))	
      	#將target的一些信息添加到kb
      	
      	for targetUrl, targetMethod, targetData, targetCookie, targetHeaders in kb.targets
      	#開始循環對每一個url進行處理和造做
      	#將一些kb.target信息設置到conf中
      	
      	initTargetEnv()
          #初始化target environment,初始化並設置一些參數
      	parseTargetUrl()
      	#解析URL,將信息設置到conf中
      	
      	#從kb中判斷是否進行過injection,並設置testSqlInj
      	
      	setupTargetEnv()
      	#設置target Env
      	#建立目標結果目錄
      	#解析並設置請求的參數
      	#設置session.sqlite
      	#從session.sqlite中恢復數據
      	#存儲結果
      	#添加認證信息
      	
      	if not checkConnection(suppressOutput=conf.forms) or not checkString() or not checkRegexp()
      	#測試鏈接有效性、測試響應中返回字符串、測試響應中正則的匹配
      	
      	checkWaf()
      	#使用預設的語句,測試是否存在WAF
      	
      	identifyWaf()
      	#識別WAF
      	
      	checkNullConnection()
      	#測試NUllConnection
      	
      	
          skip = (place == PLACE.USER_AGENT and conf.level < 3)
          skip |= (place == PLACE.REFERER and conf.level < 3)	
      	...
      	#根據level、risk設置一些測試位置
      	
      	checkDynParam(place, parameter, value)
      	#檢測參數的動態性
      	
      	heuristicCheckSqlInjection(place, parameter)
      	#進行啓發式注入測試,簡單測試是否存在注入、XSS、文件包含
      	
      	checkSqlInjection(place, parameter, value)
      
      =============checks.py=============
      checkSqlInjection(place, parameter, value)
      
      	injection = InjectionDict()
      	#用於存放注入過程當中一些信息
      	
      	tests = getSortedInjectionTests()
      	#tests 中爲各類要測試的payload
      	#內容來自/sqlmap/xml/payloads/下,最初不會對其排序,只是從conf中讀到當前環境
      	
      	#開始循環執行各test
      	#接下來的若是隻指定了-u參數,由於injection內容多爲空,第一層循環會會跳過大段內容。
      	#這些內容與 dbms technique reduceTest 等相關,這些內容會由於循環過程當中檢測到必定結果,而且由用戶輸入一些東西以後,被啓用
      	
      	if conf.dbms is None:
      		...
      	#開始進行dbms的識別
      	kb.heuristicDbms = heuristicCheckDbms(injection)
      	#若是dbms 未識別 也未指定,則進行boolen-based 簡單測試,對dbms進行識別
      	#若是檢測出來,會由用戶決定是否跳過其餘DBMS的tests、是否包含全部關於該數據庫的測試,從而大幅減小tests的數量。
      	
      	if stype == PAYLOAD.TECHNIQUE.UNION:
      	#判斷是不是union注入,而後根據用戶命令行參數指定一些union注入參數。這只是其中一條斷定處理,
      	#接下來進行一系列斷定和處理
      
      	agent.cleanupPayload(test.request.payload, origValue=value if place not in (PLACE.URI, PLACE.CUSTOM_POST, PLACE.CUSTOM_HEADER) else None)
      	#開始進行生成payload
      	
      	comment = agent.getComment(test.request) if len(conf.boundaries) > 1 else None
          fstPayload = agent.cleanupPayload(test.request.payload, origValue=value if place no
      	for boundary in boundaries:
      	#對boundary 的一些處理,跳過level 不符合的條目,肯定clause、where可用,解析boundary 先後綴等一些值
      	#關於這些字段的意義,能夠看boundaroes.xml開頭的註釋
      	#略略略,做者註釋寫的好清晰。
      	
          if fstPayload:
              boundPayload = agent.prefixQuery(fstPayload, prefix, where, clause)	
      	#拼接payload、prefix、suffix、comment爲reePayload
      	
      	for method, check in test.response.items():
      	#開始執行test 請求,判斷是否payload注入成功,此處是分技術的 此處method #容易起歧義,與--technique弄混,注意此處對應於test.response中的method,而--technique對應於request中
      	#B: Boolean-based blind SQL injection(布爾型注入)
      	#E: Error-based SQL injection(報錯型注入)
      	#U: UNION query SQL injection(可聯合查詢注入)
      	#T: Time-based blind SQL injection(基於時間延遲注入)
      	
      	#此處對應的是PAYLOAD類 的 Method,而--technique指定的參數對應於PAYLOAD類的SQLINJECTION
      	
      	#保存結果
      	#注入成功,結果寫入injection中
      	#對應的host寫入kb中
      
      	#跳回conntroller.py
      =============controller.py=============
      
      	#一些無注入參數的提示。
      	#若是有相關參數。將結果寫入文件;寫入session.sqlite(相關字段在enums.py -> class HASHDB_KEYS);打印一些信息。
      	#若是存在多注入參數,則提示選擇
      	#提示注入確認
      	
      	action()
      	#對存在漏洞的參數,進行exploit SQL injection 和一些深刻的操做。
      =============action.py=============
      	action()
      	#在識別數據庫或指定數據庫的基礎上
      	#該函數具體執行什麼操做須要由用戶進行由命令行參數進行制定
      	#只有指定了,被解析進conf中,纔會進行
      	
      	
      	基本流程至此基本結束
  4. 源碼詳讀

    1. agent.py (reading @2016-12-18

Refs:

http://www.91ri.org/13785.html

http://blog.csdn.net/wangyi_lin/article/details/8555117

相關文章
相關標籤/搜索