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