Python:SQLMap源碼精讀之基於時間的盲注(time-based blind)

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   檔案   資料   io   

基於時間的盲注(time-based blind)

  測試應用是否存在SQL注入漏洞時,經常發現某一潛在的漏洞難以確認。這可能源於多種原因,但主要是因為Web應用未顯示任何錯誤,因而無法檢索任何資料。

  對於這種情況,要想識別漏洞,向資料庫注入時間延遲並檢查伺服器響應是否也已經延遲會很有協助。時間延遲是一種很強大的技術,Web伺服器雖然可以隱藏錯誤或資料,但必須等待資料庫返回結果,因此可用它來確認是否存在SQL注入。該技術尤其適合盲注。

源碼解釋

代碼位置:在checkSqlInjection函數中(\lib\controller\checks.py 檔案,大約第444行左右)

使用了基於時間的盲注來對目標網址進行盲注測試,代碼如下:
# In case of time-based blind or stacked queries# SQL injectionselif method == PAYLOAD.METHOD.TIME:    # Perform the test‘s request    trueResult = Request.queryPage(reqPayload, place, timeBasedCompare=True, raise404=False)    if trueResult:        # Confirm test‘s results        trueResult = Request.queryPage(reqPayload, place, timeBasedCompare=True, raise404=False)        if trueResult:            infoMsg = "%s parameter ‘%s‘ is ‘%s‘ injectable " % (place, parameter, title)            logger.info(infoMsg)            injectable = True

其中,重點注意Request.queryPage函數,將參數timeBasedCompare設定為True,所以在Request.queryPage函數內部,有這麼一段代碼:

if timeBasedCompare:    return wasLastRequestDelayed()

而函數wasLastRequestDelayed()的功能主要是判斷最後一次的請求是否有明顯的延時,方法就是將最後一次請求的回應時間與之前所有請求的回應時間的平均值進行比較,如果最後一次請求的回應時間明顯大於之前幾次請求的回應時間的平均值,就說明有延遲。

wasLastRequestDelayed函數的代碼如下:

def wasLastRequestDelayed():    """    Returns True if the last web request resulted in a time-delay    """    # 99.9999999997440% of all non time-based sql injection affected    # response times should be inside +-7*stdev([normal response times])    # Math reference: http://www.answers.com/topic/standard-deviation    deviation = stdev(kb.responseTimes)    threadData = getCurrentThreadData()    if deviation:        if len(kb.responseTimes) < MIN_TIME_RESPONSES:            warnMsg = "time-based standard deviation method used on a model "            warnMsg += "with less than %d response times" % MIN_TIME_RESPONSES            logger.warn(warnMsg)        lowerStdLimit = average(kb.responseTimes) + TIME_STDEV_COEFF * deviation        retVal = (threadData.lastQueryDuration >= lowerStdLimit)        if not kb.testMode and retVal and conf.timeSec == TIME_DEFAULT_DELAY:            adjustTimeDelay(threadData.lastQueryDuration, lowerStdLimit)        return retVal    else:        return (threadData.lastQueryDuration - conf.timeSec) >= 0

每次執行http請求的時候,會將執行所響應的時間append到kb.responseTimes列表中,但不包括time-based blind所發起的請求。

為什嗎?

從以下代碼就可以知道了,當timeBasedCompare為True(即進行time-based blind注入檢測)時,直接返回執行結果,如果是其他類型的請求,就儲存回應時間。

if timeBasedCompare:    return wasLastRequestDelayed()elif noteResponseTime:    kb.responseTimes.append(threadData.lastQueryDuration)

另外,為了確保基於時間的盲注的準確性,sqlmap執行了兩次queryPage。

如果2次的結果都為True,那麼就說明目標網址可注入,所以將injectable 設定為True。著作權

作       者:曾是土木人

轉載請註明出處:http://www.cnblogs.com/hongfei/p/sqlmap-time-based-blind.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.