MS Access SQL Injection
在线游乐场
数据库限制
字符串连接
可以使用& (%26)
和+ (%2b)
字符进行字符串连接。
注释
在 MS Access 中没有注释,但显然可以使用 NULL 字符来移除查询的最后一个字符:
如果这不起作用,您可以始终修复查询的语法:
堆叠查询
不支持。
限制
LIMIT
操作符 未实现。但是,可以使用 TOP
操作符将 SELECT 查询结果限制为前 N 个表行。TOP
接受一个整数作为参数,表示要返回的行数。
就像使用 TOP
一样,您可以使用 LAST
,它将从末尾获取行。
UNION查询/子查询
在SQLi中,通常您会希望以某种方式执行新查询,以从其他表中提取信息。MS Access始终要求在子查询或额外查询中指定FROM
。
因此,如果您想执行UNION SELECT
或UNION ALL SELECT
或在条件中使用括号执行SELECT
,您总是需要指定一个带有有效表名的FROM
。
因此,您需要知道一个有效的表名。
链接等号 + 子字符串
这将允许您在不需要知道表名的情况下提取当前表的值。
MS Access 允许使用奇怪的语法,例如**'1'=2='3'='asd'=false
。通常情况下,SQL注入将位于WHERE
**子句中,我们可以利用这一点。
假设您在 MS Access 数据库中有一个 SQLi,并且您知道(或猜到)一个列名为用户名,这是您想要提取的字段。您可以通过使用**Mid
函数获取子字符串,利用布尔注入**来检查 Web 应用程序在使用链接等号技术时的不同响应,并可能提取内容。
如果你知道要转储的表名和列名,可以使用Mid
、LAST
和TOP
的组合来通过布尔SQLi泄露所有信息:
Feel free to check this in the online playground.
暴力破解表名
使用链接等号技术,您还可以使用以下方式暴力破解表名:
MS Access SQL Injection
Introduction
In Microsoft Access databases, SQL injection can be performed using the UNION
keyword to retrieve data from other tables. This technique can be used to extract sensitive information from the database.
Steps to Perform SQL Injection in MS Access
Identify the vulnerable input fields.
Use a SQL injection payload with the
UNION
keyword to retrieve data from other tables.Determine the number of columns in the target table using
ORDER BY
clause.Craft a SQL injection payload to extract data from the desired columns.
Use tools like SQLMap to automate the SQL injection process.
Example
If the vulnerable query is SELECT name, email FROM users WHERE id = '<VULNERABLE_INPUT>';
, the following payload can be used:
This payload will retrieve the username from the admin
table and display it in the results of the original query.
Prevention
To prevent SQL injection in MS Access, use parameterized queries or stored procedures to validate and sanitize user input before executing SQL queries. Additionally, limit the privileges of database users to reduce the impact of a successful SQL injection attack.
Feel free to check this in the online playground.
Sqlmap common table names: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
There is another list in http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Brute-Forcing Columns names
您可以使用链接等于技巧暴力破解当前列名:
或者使用 group by:
或者您可以使用以下方法对不同表的列名进行暴力破解:
转储数据
我们已经讨论了链接等号技术 来从当前表和其他表中转储数据。但还有其他方法:
简而言之,该查询使用“if-then”语句来触发成功时的“200 OK”,否则触发“500 Internal Error”。利用TOP 10运算符,可以选择前十个结果。随后使用LAST允许仅考虑第十个元组。在该值上,使用MID运算符可以执行简单的字符比较。通过适当更改MID和TOP的索引,我们可以获取所有行的“username”字段内容。
基于时间的
其他有趣的函数
Mid('admin',1,1)
从位置1获取长度为1的子字符串(初始位置为1)LEN('1234')
获取字符串长度ASC('A')
获取字符的ASCII值CHR(65)
根据ASCII值获取字符串IIF(1=1,'a','b')
if thenCOUNT(*)
计算项目数量
枚举表
从这里可以看到一个获取表名的查询:
然而,请注意,通常会发现SQL注入攻击,其中无法访问读取表MSysObjects
。
文件系统访问
Web根目录完整路径
了解web根目录的绝对路径可能有助于进一步攻击。如果应用程序错误没有完全隐藏,可以尝试从不存在的数据库中选择数据来揭示目录路径。
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access会以包含Web目录完整路径的错误消息做出响应。
文件枚举
以下攻击向量可用于推断远程文件系统上文件的存在。如果指定的文件存在,MS Access会触发一个错误消息,通知数据库格式无效:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
另一种枚举文件的方法是指定数据库.表项。如果指定的文件存在,MS Access会显示一个数据库格式错误消息。
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
.mdb文件名猜测
可以使用以下查询来推断数据库文件名(.mdb):
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
其中name[i]是一个.mdb文件名,realTable是数据库中存在的表。尽管MS Access总是会触发一个错误消息,但可以区分无效文件名和有效的.mdb文件名。
.mdb密码破解器
Access PassView是一个免费实用程序,可用于恢复Microsoft Access 95/97/2000/XP或Jet Database Engine 3.0/4.0的主数据库密码。
参考资料
最后更新于