如何進行sqlmap源碼分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
我也是一個小白,總結自己對sqlmap的理解,也分享一些自己覺得好用的方法給大家。
對照目錄結構我們來梳理一下:
這里我是下載的sqlmap最新版本1.4.3.12
1.data目錄包含可以搭建的圖形化界面模板,shell后門(里邊的代碼是經過加密的),udf提權功能,數據庫注入檢測載荷等
2.doc目錄是針對不同國家和地區的使用說明
3.extra目錄有一些額外功能,運行cmd、shellcode,icmp協議的反彈shell(是的icmp是可以用來反彈shell的,在平時的滲透過程中碰到傳統的tcp,udp反彈shell不成功,可以考慮使用icmp協議或者DNS協議進行反彈shell),以及發出聲響(beep)等
4.lib/目錄包含了sqlmap的多種連接庫,如五種注入類型請求的參數、提權操作等。(這個目錄需要我們重點關注)
5.plugins/ 數據庫信息和數據庫通用事項
6.tamper目錄包含了各種繞過腳本(這個非常好用)
7.thirdparty目錄 sqlmap使用的第三方的插件
sqlmap.conf sqlmap的配置文件,如各種默認參數(默認是沒有設置參數、可設置默認參數進行批量或者自動化檢測)
sqlmap.py sqlmap主程序文件
sqlmapapi.py sqlmap的api文件,可以將sqlmap集成到其他平臺上
swagger.yaml api文檔
sqlmap.py
我們先來看看五個比較重要的函數
對于程序的一些問題及修復,寫成了補丁函數,優先執行。
在 DirtyPatches 中,首先設定了 httplib 的最大行長度(httplib._MAXLINE
),接下來導入第三方的 windows 下的 ip地址轉換函數模塊(win_inet_pton
),然后對編碼進行了一些替換,把 cp65001
替換為 utf8
避免出現一些交互上的錯誤,這些操作對于 sqlmap 的實際功能影響并不是特別大,屬于保證起用戶體驗和系統設置的正常選項,不需要進行過多關心。
為了消除交叉引用的問題,一些子程序中的函數會被重寫,在這個位置進行賦值
這個函數的作用就是去檢測運行環境,包括檢查模塊路徑,檢查 Python 版本,導入全局變量
這三個全局變量可以說貫穿宇sqlmap運行的整個過程,尤其是conf,kb
獲取路徑
該函數是為了打印banner信息
是一個AttribDict,AttribDict又是什么?
這個類通過override了幾個super method
.
修改原生的dict
定制成了自己項目需要的屬性字典.
原來的字典的用法:dict1["key"]
現在的自定義字典的用法:dict1.key
跟進cmdlineParser()
這里將我們輸入的命令行參數選項進行判斷和拆分,轉變成dict鍵值對的形式存入到cmdLineOptions
1.init()中主要包含所有初始變量的初始值,這些初始值在 init()
的設定主要是引用各種各樣的函數來完成基礎設置,我們沒有必要依次對其進行分支,只需要用到的時候知道回來尋找就可以了。
2.第二部分就是各種測試包括冒煙測試,模糊測試等
測試過的 url 參數信息會保存到 kb.testedParams 中
3.測試完成之后就進入我們的工作流程
controller.py文件
下邊這部分代碼就是核心的檢測方法
for targetUrl, targetMethod, targetData, targetCookie, targetHeaders in kb.targets: try: if conf.checkInternet: infoMsg = "checking for Internet connection" logger.info(infoMsg) if not checkInternet(): warnMsg = "[%s] [WARNING] no connection detected" % time.strftime("%X") dataToStdout(warnMsg) valid = False for _ in xrange(conf.retries): if checkInternet(): valid = True break else: dataToStdout('.') time.sleep(5) if not valid: errMsg = "please check your Internet connection and rerun" raise SqlmapConnectionException(errMsg) else: dataToStdout("\n") conf.url = targetUrl conf.method = targetMethod.upper().strip() if targetMethod else targetMethod conf.data = targetData conf.cookie = targetCookie conf.httpHeaders = list(initialHeaders) conf.httpHeaders.extend(targetHeaders or []) if conf.randomAgent or conf.mobile: for header, value in initialHeaders: if header.upper() == HTTP_HEADER.USER_AGENT.upper(): conf.httpHeaders.append((header, value)) break conf.httpHeaders = [conf.httpHeaders[i] for i in xrange(len(conf.httpHeaders)) if conf.httpHeaders[i][0].upper() not in (__[0].upper() for __ in conf.httpHeaders[i + 1:])] initTargetEnv() parseTargetUrl() testSqlInj = False if PLACE.GET in conf.parameters and not any((conf.data, conf.testParameter)): for parameter in re.findall(r"([^=]+)=([^%s]+%s?|\Z)" % (re.escape(conf.paramDel or "") or DEFAULT_GET_POST_DELIMITER, re.escape(conf.paramDel or "") or DEFAULT_GET_POST_DELIMITER), conf.parameters[PLACE.GET]): paramKey = (conf.hostname, conf.path, PLACE.GET, parameter[0]) if paramKey not in kb.testedParams: testSqlInj = True break else: paramKey = (conf.hostname, conf.path, None, None) if paramKey not in kb.testedParams: testSqlInj = True if testSqlInj and conf.hostname in kb.vulnHosts: if kb.skipVulnHost is None: message = "SQL injection vulnerability has already been detected " message += "against '%s'. Do you want to skip " % conf.hostname message += "further tests involving it? [Y/n]" kb.skipVulnHost = readInput(message, default='Y', boolean=True) testSqlInj = not kb.skipVulnHost if not testSqlInj: infoMsg = "skipping '%s'" % targetUrl logger.info(infoMsg) continue if conf.multipleTargets:
初始化當前檢測的目標,包括:url,method,Data,Cookie,headers相關字段
從conf字典中取出來檢測用的參數
檢測是否已經測試過該目標
這部代碼是針對多個目標
接下來再經過setupTargetEnv()函數,
這里看一下對于請求的處理方式,主要是將 get 或 post 發送的數據解析成字典形式,并保存到 conf.paramDict 中
回歸之前的 start()方法中的 foreach targets 的循環體中,在 setupTargetEnv() 之后,我們現在已經知道了關于這個目標的所有的可以嘗試注入測試的點都已經設置好了,并且都存在了 conf.paramDict 這個字典中了。
讀取session文件(如果存在的話),并讀取文件中的數據,保存到 kb 變量中
接下來就是checkWaf,這里就是檢測是否有waf(這里有個奇怪的地方就是本次下載的sqlmap目錄里邊少了waf目錄)
接著檢查空連接(nullConnection)、檢查頁面穩定性,以及對參數、測試列表進行排序
nullConnection:根據官方手冊,是一種不用獲取頁面內容就可以知道頁面大小的方法,這種方法在布爾盲注中有非常好的效果
如果啟用 --null-connection,計算頁面相似率就只是很簡單的通過頁面的長度來計算
頁面相似率的算法在sqlmap的檢測過程中起到了灰常重要,還有高斯分布在sqlmap進行異常檢測的時候也起到了很重要的作用。
看完上述內容,你們掌握如何進行sqlmap源碼分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。