由於主要是本身看SQLMap源碼有個記錄,因此寫上來的東西,對我我的來講就是想到什麼寫什麼,比較雜亂,推薦看參考中各位大牛的文章。html
==============================================================python
==============================================================mysql
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的相關靜態信息。
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中,纔會進行 基本流程至此基本結束
Refs: