2023-06-26 01:34:46
SQL注入中的布尔盲注是指攻击者通过构造逻辑判断的SQL查询,并根据应用程序返回的页面内容(如报错与否、页面显示内容变化等“真/假”状态)来推断数据库信息的一种攻击方式。
防御布尔盲注需通过逻辑判断切断攻击路径,核心策略包括参数化查询与输入验证:
参数化查询(Prepared Statements):
原理:定义SQL查询结构时使用占位符(如?),将用户输入视为纯粹的值而非SQL代码。数据库提前编译查询结构,用户输入仅作为数据绑定,无法改变查询逻辑。
示例(Java):String sql = "SELECT * FROM users WHERE username = ? AND password = ?";PreparedStatement pstmt = connection.prepareStatement(sql);pstmt.setString(1, userInputUsername);pstmt.setString(2, userInputPassword);ResultSet rs = pstmt.executeQuery();即使输入包含恶意SQL代码(如' OR '1'='1),也会被当作字符串处理,不会执行。
严格的输入验证(Input Validation):
白名单验证:仅允许特定字符或格式通过(如数字字段仅接受数字)。
类型检查:验证输入是否符合预期类型(如邮箱地址需包含@)。
长度限制:限制输入长度,防止注入长恶意代码。
字符集限制:过滤特殊字符(如单引号、分号)。
效果:若参数仅接受数字,攻击者无法注入字符串形式的SQL语句,大幅增加攻击难度。
布尔盲注与时间盲注的本质区别在于判断方式:
识别布尔盲注漏洞的步骤:
构造永远为真的条件(如AND 1=1)和永远为假的条件(如AND 1=2)。
观察页面响应差异(如内容、布局、HTTP状态码)。若“真”条件返回正常页面,“假”条件返回错误或空页面,则可能存在漏洞。
示例:URL中尝试?id=1 AND 1=1(正常页面)和?id=1 AND 1=2(错误页面)。
综合防御策略: