溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行sqlmap源碼分析

發布時間:2021-11-03 09:05:23 來源:億速云 閱讀:228 作者:柒染 欄目:網絡安全

如何進行sqlmap源碼分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

sqlmap源碼分析

我也是一個小白,總結自己對sqlmap的理解,也分享一些自己覺得好用的方法給大家。

目錄結構

對照目錄結構我們來梳理一下:

這里我是下載的sqlmap最新版本1.4.3.12

如何進行sqlmap源碼分析

如何進行sqlmap源碼分析

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

我們先來看看五個比較重要的函數

如何進行sqlmap源碼分析

dirtyPatches()

對于程序的一些問題及修復,寫成了補丁函數,優先執行。

在 DirtyPatches 中,首先設定了 httplib 的最大行長度(httplib._MAXLINE),接下來導入第三方的 windows 下的 ip地址轉換函數模塊(win_inet_pton),然后對編碼進行了一些替換,把 cp65001 替換為 utf8 避免出現一些交互上的錯誤,這些操作對于 sqlmap 的實際功能影響并不是特別大,屬于保證起用戶體驗和系統設置的正常選項,不需要進行過多關心。

如何進行sqlmap源碼分析

resolveCrossReferences()

為了消除交叉引用的問題,一些子程序中的函數會被重寫,在這個位置進行賦值

如何進行sqlmap源碼分析

checkEnvironment()

這個函數的作用就是去檢測運行環境,包括檢查模塊路徑,檢查 Python 版本,導入全局變量

如何進行sqlmap源碼分析

這三個全局變量可以說貫穿宇sqlmap運行的整個過程,尤其是conf,kb

如何進行sqlmap源碼分析

setPaths(modulePath())

獲取路徑

如何進行sqlmap源碼分析

banner()

該函數是為了打印banner信息

如何進行sqlmap源碼分析

全局變量

cmdLineOptions

是一個AttribDict,AttribDict又是什么?

這個類通過override了幾個super method.

修改原生的dict定制成了自己項目需要的屬性字典.

如何進行sqlmap源碼分析

原來的字典的用法:dict1["key"]

現在的自定義字典的用法:dict1.key

如何進行sqlmap源碼分析跟進cmdlineParser()

這里將我們輸入的命令行參數選項進行判斷和拆分,轉變成dict鍵值對的形式存入到cmdLineOptions

如何進行sqlmap源碼分析

conf,kb

1.init()中主要包含所有初始變量的初始值,這些初始值在 init() 的設定主要是引用各種各樣的函數來完成基礎設置,我們沒有必要依次對其進行分支,只需要用到的時候知道回來尋找就可以了。

2.第二部分就是各種測試包括冒煙測試,模糊測試等

測試過的 url 參數信息會保存到 kb.testedParams 中

3.測試完成之后就進入我們的工作流程

如何進行sqlmap源碼分析

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相關字段

如何進行sqlmap源碼分析

從conf字典中取出來檢測用的參數

如何進行sqlmap源碼分析

檢測是否已經測試過如何進行sqlmap源碼分析該目標
如何進行sqlmap源碼分析

這部代碼是針對多個目標

如何進行sqlmap源碼分析

接下來再經過setupTargetEnv()函數,

如何進行sqlmap源碼分析

這里看一下對于請求的處理方式,主要是將 get 或 post 發送的數據解析成字典形式,并保存到 conf.paramDict 中

如何進行sqlmap源碼分析

如何進行sqlmap源碼分析


回歸之前的 start()方法中的 foreach targets 的循環體中,在 setupTargetEnv() 之后,我們現在已經知道了關于這個目標的所有的可以嘗試注入測試的點都已經設置好了,并且都存在了 conf.paramDict 這個字典中了。

讀取session文件(如果存在的話),并讀取文件中的數據,保存到 kb 變量中

接下來就是checkWaf,這里就是檢測是否有waf(這里有個奇怪的地方就是本次下載的sqlmap目錄里邊少了waf目錄)

接著檢查空連接(nullConnection)、檢查頁面穩定性,以及對參數、測試列表進行排序

nullConnection:根據官方手冊,是一種不用獲取頁面內容就可以知道頁面大小的方法,這種方法在布爾盲注中有非常好的效果

如果啟用 --null-connection,計算頁面相似率就只是很簡單的通過頁面的長度來計算

如何進行sqlmap源碼分析

頁面相似率的算法在sqlmap的檢測過程中起到了灰常重要,還有高斯分布在sqlmap進行異常檢測的時候也起到了很重要的作用。

看完上述內容,你們掌握如何進行sqlmap源碼分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女