从以往的经验来看,一些注入点可以被工具成功扫描出来[你们都明白的,我就说了],但确识别不出数据库类型或识别为错误的数据库类型
或是因为WAF拦截,或是因为过滤,我们不再去深究其原因;这个时候多半需要手工探测数据库类型并辅以小脚本来跑数据了。那么如何快速的确定数据库类型呢?一个最常用且高效的方法就是使用不同数据库所特有的内置函数。如:
id=1 ' AND SUBSTRING(' ABC ')=' A ' and ' a '=' a |
如果条件成立,页面响应符合预期,那么我们便可以确定后端数据库类型一定不是Oracle,因为Oracle是没有SUBSTRING这个内置函数的。
诸如此类,我依次尝试了一些数据库的内置函数,并确定其在对应的数据库类型中是否可用;下面的列表列举了最常用的三种数据库类型:MySQL、MSSQL、ORACLE中一些函数是否被支持的情况。
(排除因同一数据库类型不同版本的而导致的函数支持不同的情况)测试使用的数据库对应版本为:
-
MySQL: 5.5.46-0ubuntu0.14.04.2
-
MSSQL: Microsoft SQL Server 2008 (RTM) – 10.0.1600.22 (X64)
-
ORACLE: Oracle Database 11g Release 11.2.0.1.0 – 64bit Production
其中ORACLE的SELECT必须要跟上对应的FROM(SELECT xxx FROM DUAL),不再单独说明。测试的一些常用函数如下(“-”为不支持此函数):
函数名称
执行语句 | 不同数据库执行结果 | 备注 | |||
MySQL | SQL Server | Oracle | |||
SUBSTRING | SELECT SUBSTRING('ABC',1,1) | A | A | – | 字符串截取函数 |
SUBSTR | SELECT SUBSTR('ABC',1,1) | A | – | A | 字符串截取函数 |
SUBSTRC | SELECT SUBSTRC('ABC',1,1) | – | – | A | 字符串截取函数 |
MID | SELECT MID('ABC',1,1) | A | – | – | 字符串截取函数 |
ASCII | SELECT ASCII('A') | 65 | 65 | 65 | 字符转换为对应ASCII码 |
CHAR | SELECT CHAR(65) | A | A | – | ASCII码转换为对应字符 |
CHR | SELECT CHR(65) | – | – | A | ASCII码转换为对应字符 |
LOWER | SELECT LOWER('ABC') | abc | abc | abc | 将字符串转换为小写 |
UPPER | SELECT UPPER('abc') | ABC | ABC | ABC | 将字符串转换为大写 |
CHAR_LENGTH | SELECT CHAR_LENGTH('ABC') | 3 | – | – | 计算字符串长度 |
LENGTH | SELECT LENGTH(123) | 3 | – | 3 | 计算字符串长度 |
LEN | SELECT LEN(123) | – | 3 | – | 计算字符串长度 |
DATABASE | SELECT DATABASE() | test | – | – | 返回当前数据库 |
DB_NAME | SELECT DB_NAME() | – | test | – | 返回当前数据库 |
USER | SELECT USER() | root@% | – | – | 返回当前用户 |
CURRENT_USER | SELECT CURRENT_USER | root@% | dbo | – | 返回当前用户 |
USER | SELECT USER | – | dbo | SYSTEM | 返回当前用户 |
LEFT | SELECT LEFT('ABC',1) | A | A | – | 返回字符串左边指定个数字符 |
PI | SELECT PI() | 3.141593 | 3.141592653589793 | – | 返回派值 |
REPLACE | SELECT REPLACE('ABC','A','X') | XBC | XBC | XBC | 字符串替换 |
MD5 | SELECT MD5(1) | c4ca4238a0b923820dcc509a6f75849b | – | – | 返回字符串MD5值 |
HEX | SELECT HEX(10) | A | – | – | 返回数字16进制值 |
TO_CHAR | SELECT TO_CHAR(10,'XX') | – | – | A | 返回数字16进制值 |
本文始发于微信公众号(飓风网络安全):注入技巧:使用内置函数快速确定数据库类型
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论