尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

布尔盲注学习笔记

布尔盲注学习笔记 一、什么是布尔盲注布尔盲注是SQL注入中一种重要的数据获取手段。它的核心逻辑是页面不会返回任何数据库中的具体数据也不会返回数据库报错信息只会根据SQL语句执行结果的“真”或“假”返回两种不同的页面状态。 攻击者通过构造逻辑判断语句根据页面返回的差异逐位猜解出数据库中的数据。布尔盲注的适用场景页面只返回“查询成功”或“查询失败”两种状态页面根据条件真假显示不同的内容如“欢迎回来”和“用户名不存在”页面完全没有数据回显也没有报错回显联合查询注入和报错注入都无法使用的场景布尔盲注的核心要素页面存在SQL注入漏洞且注入语句能够被执行页面能够根据SQL语句的真假返回不同的响应攻击者能够通过某种方式如页面内容、响应时间、HTTP状态码等区分真和假两种状态目标数据库为MySQL本文讨论范围且版本在5.0以上二、布尔盲注的核心函数布尔盲注的核心思想是构造一个条件判断语句让数据库执行并返回真或假然后根据页面的不同表现来判断条件的真假。以下是几个核心函数1 length() 函数length() 函数用于获取字符串的长度。示例length(database())8如果当前数据库名的长度等于8则条件为真否则为假。实际用法ANDlength(database())5如果数据库名长度大于5页面正常否则页面异常。substr() 或 substring() 函数substr() 和 substring() 函数用于截取字符串的一部分。语法substr(字符串,起始位置,截取长度)substring(字符串,起始位置,截取长度)示例substr(database(),1,1)m如果数据库名的第一个字符是 m则条件为真。实际用法ANDsubstr(database(),1,1)mascii() 函数ascii() 函数用于获取字符的ASCII码值。示例ascii(substr(database(),1,1))109109是字符 m 的ASCII码值。如果数据库名的第一个字符是 m则条件为真。使用ASCII码的好处是方便进行数值比较可以用大于号、小于号来缩小范围ascii(substr(database(),1,1))100如果第一个字符的ASCII码大于100条件为真。这大大加快了猜解速度。4 .mid() 函数mid() 函数与 substr() 功能类似也是用于截取字符串。语法mid(字符串,起始位置,截取长度)ord() 函数ord() 函数与 ascii() 功能类似也是返回字符串第一个字符的ASCII码值。三、布尔盲注的利用步骤下面以获取当前数据库名为例详细展示布尔盲注的完整流程。第一步判断注入点是否存在首先确认页面是否存在布尔盲注漏洞AND11如果页面正常说明条件为真时页面返回正常状态。AND12如果页面异常或与真状态表现不同说明条件为假时页面返回异常状态。如果以上两个测试都能得到不同的页面响应说明该注入点存在布尔盲注漏洞。第二步猜解数据库名长度使用 length() 函数和二分法快速确定数据库名的长度ANDlength(database())10如果页面正常说明数据库名长度大于10如果页面异常说明长度小于等于10。ANDlength(database())5继续缩小范围。ANDlength(database())8最终确定数据库名的精确长度。第三步猜解数据库名确定长度后逐字符猜解数据库名。第一个字符ANDascii(substr(database(),1,1))100如果页面正常说明第一个字符的ASCII码大于100如果页面异常说明小于等于100。ANDascii(substr(database(),1,1))110继续缩小范围。ANDascii(substr(database(),1,1))109最终确定第一个字符为 m。第二个字符ANDascii(substr(database(),2,1))100第三个字符ANDascii(substr(database(),3,1))100以此类推直到完整获取所有字符。第四步猜解表名数据库名获取后接着猜解该库下的表名。猜解表名长度ANDlength((SELECTtable_nameFROMinformation_schema.tablesWHEREtable_schemadatabase()LIMIT1))5猜解表名的第一个字符ANDascii(substr((SELECTtable_nameFROMinformation_schema.tablesWHEREtable_schemadatabase()LIMIT1),1,1))100猜解第二个表名ANDlength((SELECTtable_nameFROMinformation_schema.tablesWHEREtable_schemadatabase()LIMIT1OFFSET1))5第五步猜解列名表名获取后接着猜解该表中的列名。猜解列名长度ANDlength((SELECTcolumn_nameFROMinformation_schema.columnsWHEREtable_name目标表名LIMIT1))5猜解列名的第一个字符ANDascii(substr((SELECTcolumn_nameFROMinformation_schema.columnsWHEREtable_name目标表名LIMIT1),1,1))100第六步猜解具体数据列名获取后最后猜解具体数据。猜解第一条数据的第一个字符ANDascii(substr((SELECT列名FROM表名LIMIT1),1,1))100四、常见报错与解决布尔盲注最常见的困扰有两个一是速度太慢。猜解一个字符平均需要7-8次请求二分法一个完整的数据库名通常需要几十次请求整库脱出可能需要成百上千次请求手动操作几乎不可能完成。解决方法是使用自动化工具如sqlmap或编写Python脚本批量发送请求。二是页面响应不稳定。网络延迟、页面加载时间波动、服务器负载变化等因素都可能导致误判。解决方法是每个payload请求多次取平均值或者使用更稳定的判断依据如页面特定关键词是否存在。三是盲注语句编写错误。子查询返回多行数据时会导致整个语句报错需要用 LIMIT 1 限制返回行数或者使用 GROUP_CONCAT() 合并结果。五、布尔盲注的防御措施针对布尔盲注开发层面的防御措施与针对其他注入类型的措施本质上相同但需要特别注意以下几点关闭数据库错误回显是基础但不彻底布尔盲注不依赖错误回显所以仅靠关闭错误回显无法防御布尔盲注必须使用参数化查询PreparedStatement将SQL语句结构和数据分开这是最根本的防御手段对用户输入进行严格过滤和白名单校验限制数据库用户权限避免使用高权限账号连接应用
返回列表