如何進行sqlmap源碼分析,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)一直通過網(wǎng)站建設(shè)和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實效"的一站式服務(wù),以網(wǎng)站設(shè)計、成都網(wǎng)站制作、移動互聯(lián)產(chǎn)品、營銷型網(wǎng)站服務(wù)為核心業(yè)務(wù)。十載網(wǎng)站制作的經(jīng)驗,使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價格便宜而且實用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。
我也是一個小白,總結(jié)自己對sqlmap的理解,也分享一些自己覺得好用的方法給大家。
對照目錄結(jié)構(gòu)我們來梳理一下:
這里我是下載的sqlmap最新版本1.4.3.12
1.data目錄包含可以搭建的圖形化界面模板,shell后門(里邊的代碼是經(jīng)過加密的),udf提權(quán)功能,數(shù)據(jù)庫注入檢測載荷等
2.doc目錄是針對不同國家和地區(qū)的使用說明
3.extra目錄有一些額外功能,運行cmd、shellcode,icmp協(xié)議的反彈shell(是的icmp是可以用來反彈shell的,在平時的滲透過程中碰到傳統(tǒng)的tcp,udp反彈shell不成功,可以考慮使用icmp協(xié)議或者DNS協(xié)議進行反彈shell),以及發(fā)出聲響(beep)等
4.lib/目錄包含了sqlmap的多種連接庫,如五種注入類型請求的參數(shù)、提權(quán)操作等。(這個目錄需要我們重點關(guān)注)
5.plugins/ 數(shù)據(jù)庫信息和數(shù)據(jù)庫通用事項
6.tamper目錄包含了各種繞過腳本(這個非常好用)
7.thirdparty目錄 sqlmap使用的第三方的插件
sqlmap.conf sqlmap的配置文件,如各種默認(rèn)參數(shù)(默認(rèn)是沒有設(shè)置參數(shù)、可設(shè)置默認(rèn)參數(shù)進行批量或者自動化檢測)
sqlmap.py sqlmap主程序文件
sqlmapapi.py sqlmap的api文件,可以將sqlmap集成到其他平臺上
swagger.yaml api文檔
sqlmap.py
我們先來看看五個比較重要的函數(shù)
對于程序的一些問題及修復(fù),寫成了補丁函數(shù),優(yōu)先執(zhí)行。
在 DirtyPatches 中,首先設(shè)定了 httplib 的最大行長度(httplib._MAXLINE
),接下來導(dǎo)入第三方的 windows 下的 ip地址轉(zhuǎn)換函數(shù)模塊(win_inet_pton
),然后對編碼進行了一些替換,把 cp65001
替換為 utf8
避免出現(xiàn)一些交互上的錯誤,這些操作對于 sqlmap 的實際功能影響并不是特別大,屬于保證起用戶體驗和系統(tǒng)設(shè)置的正常選項,不需要進行過多關(guān)心。
為了消除交叉引用的問題,一些子程序中的函數(shù)會被重寫,在這個位置進行賦值
這個函數(shù)的作用就是去檢測運行環(huán)境,包括檢查模塊路徑,檢查 Python 版本,導(dǎo)入全局變量
這三個全局變量可以說貫穿宇sqlmap運行的整個過程,尤其是conf,kb
獲取路徑
該函數(shù)是為了打印banner信息
是一個AttribDict,AttribDict又是什么?
這個類通過override了幾個super method
.
修改原生的dict
定制成了自己項目需要的屬性字典.
原來的字典的用法:dict1["key"]
現(xiàn)在的自定義字典的用法:dict1.key
跟進cmdlineParser()
這里將我們輸入的命令行參數(shù)選項進行判斷和拆分,轉(zhuǎn)變成dict鍵值對的形式存入到cmdLineOptions
1.init()中主要包含所有初始變量的初始值,這些初始值在 init()
的設(shè)定主要是引用各種各樣的函數(shù)來完成基礎(chǔ)設(shè)置,我們沒有必要依次對其進行分支,只需要用到的時候知道回來尋找就可以了。
2.第二部分就是各種測試包括冒煙測試,模糊測試等
測試過的 url 參數(shù)信息會保存到 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:
初始化當(dāng)前檢測的目標(biāo),包括:url,method,Data,Cookie,headers相關(guān)字段
從conf字典中取出來檢測用的參數(shù)
檢測是否已經(jīng)測試過該目標(biāo)
這部代碼是針對多個目標(biāo)
接下來再經(jīng)過setupTargetEnv()函數(shù),
這里看一下對于請求的處理方式,主要是將 get 或 post 發(fā)送的數(shù)據(jù)解析成字典形式,并保存到 conf.paramDict 中
回歸之前的 start()方法中的 foreach targets 的循環(huán)體中,在 setupTargetEnv() 之后,我們現(xiàn)在已經(jīng)知道了關(guān)于這個目標(biāo)的所有的可以嘗試注入測試的點都已經(jīng)設(shè)置好了,并且都存在了 conf.paramDict 這個字典中了。
讀取session文件(如果存在的話),并讀取文件中的數(shù)據(jù),保存到 kb 變量中
接下來就是checkWaf,這里就是檢測是否有waf(這里有個奇怪的地方就是本次下載的sqlmap目錄里邊少了waf目錄)
接著檢查空連接(nullConnection)、檢查頁面穩(wěn)定性,以及對參數(shù)、測試列表進行排序
nullConnection:根據(jù)官方手冊,是一種不用獲取頁面內(nèi)容就可以知道頁面大小的方法,這種方法在布爾盲注中有非常好的效果
如果啟用 --null-connection,計算頁面相似率就只是很簡單的通過頁面的長度來計算
頁面相似率的算法在sqlmap的檢測過程中起到了灰常重要,還有高斯分布在sqlmap進行異常檢測的時候也起到了很重要的作用。
看完上述內(nèi)容,你們掌握如何進行sqlmap源碼分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!