注入技巧:使用内置函数快速确定数据库类型

作者: RedFree 分类: MSSQL, MySQL, Oracle 发布时间: 2016-07-15 23:42 ė136 次访问 6没有评论

从以往的经验来看,一些注入点可以被sqlmap成功扫描出来,但确识别不出数据库类型或识别为错误的数据库类型;如下图:

1.png

或是因为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),不再单独说明。测试的一些常用函数如下(“-”为不支持此函数):

2.png

函数名称 执行语句 不同数据库执行结果 备注
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进制值

使用内置函数快速确定数据库类型.xlsx

本文出自 RedFree's Blog,转载时请注明出处及相应链接。

本文永久链接: http://py4.me/blog/?p=98

发表评论

电子邮件地址不会被公开。

Ɣ回顶部