|
| 1 | +# 嵌套加密参数测试注意事项 |
| 2 | + |
| 3 | +## ⚠️ 重要警告 |
| 4 | + |
| 5 | +### 1. 严禁修改第三方库 |
| 6 | + |
| 7 | +**绝对不要**向以下目录写入任何文件: |
| 8 | +- `src/backEnd/third_lib/sqlmap/` |
| 9 | +- `src/backEnd/third_lib/sqlmap/tamper/` |
| 10 | +- `src/backEnd/third_lib/sqlmap/preprocess/` |
| 11 | + |
| 12 | +这是 SQLMap 开源项目的 git 子模块,修改会导致: |
| 13 | +- 子模块状态异常 |
| 14 | +- 无法更新 SQLMap 版本 |
| 15 | +- 代码提交冲突 |
| 16 | +- 违反开源协议 |
| 17 | + |
| 18 | +### 2. Tamper 脚本的正确位置 |
| 19 | + |
| 20 | +#### 方案一:SQLMap 安装目录(推荐临时使用) |
| 21 | +``` |
| 22 | +/path/to/sqlmap/tamper/your_script.py |
| 23 | +``` |
| 24 | + |
| 25 | +#### 方案二:项目目录(推荐长期维护) |
| 26 | +``` |
| 27 | +sqlmapWebUI/ |
| 28 | +├── src/ |
| 29 | +│ ├── backEnd/ |
| 30 | +│ │ └── tampers/ # 自建目录 |
| 31 | +│ │ └── base64_nested.py |
| 32 | +``` |
| 33 | + |
| 34 | +使用时通过 `--tamper` 指定完整路径: |
| 35 | +```bash |
| 36 | +python sqlmap.py -u URL --tamper=/path/to/project/src/backEnd/tampers/base64_nested.py |
| 37 | +``` |
| 38 | + |
| 39 | +#### 方案三:当前工作目录 |
| 40 | +```bash |
| 41 | +# 将 tamper 脚本放在执行 sqlmap 的目录 |
| 42 | +cd /path/to/workspace |
| 43 | +python sqlmap.py -u URL --tamper=./base64_nested.py |
| 44 | +``` |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## 安全注意事项 |
| 49 | + |
| 50 | +### 1. 授权测试 |
| 51 | + |
| 52 | +**仅在获得明确授权的情况下进行测试!** |
| 53 | + |
| 54 | +未经授权的测试可能违反: |
| 55 | +- 《网络安全法》 |
| 56 | +- 《刑法》第 285、286 条 |
| 57 | +- 公司安全政策 |
| 58 | +- 国际法律法规 |
| 59 | + |
| 60 | +### 2. 测试环境隔离 |
| 61 | + |
| 62 | +- 使用本地靶场(如 VulnShop) |
| 63 | +- 避免在生产环境测试 |
| 64 | +- 使用虚拟机或容器隔离 |
| 65 | +- 测试后清理数据 |
| 66 | + |
| 67 | +### 3. 数据保护 |
| 68 | + |
| 69 | +- 不要泄露真实用户数据 |
| 70 | +- 敏感信息及时清理 |
| 71 | +- 测试报告加密存储 |
| 72 | +- 限制访问权限 |
| 73 | + |
| 74 | +--- |
| 75 | + |
| 76 | +## 技术注意事项 |
| 77 | + |
| 78 | +### 1. 编码问题 |
| 79 | + |
| 80 | +```python |
| 81 | +# 确保使用正确的编码 |
| 82 | +def tamper(payload, **kwargs): |
| 83 | + # 错误:可能导致编码错误 |
| 84 | + data = json.dumps(inner) |
| 85 | + |
| 86 | + # 正确:指定编码 |
| 87 | + data = json.dumps(inner, ensure_ascii=False) |
| 88 | + encoded = base64.b64encode(data.encode('utf-8')).decode('utf-8') |
| 89 | +``` |
| 90 | + |
| 91 | +### 2. 特殊字符处理 |
| 92 | + |
| 93 | +```python |
| 94 | +# SQLMap payload 可能包含特殊字符 |
| 95 | +def tamper(payload, **kwargs): |
| 96 | + # 需要正确处理引号、换行等字符 |
| 97 | + inner = {"name": payload.replace("'", "''")} |
| 98 | + # 或根据具体情况转义 |
| 99 | +``` |
| 100 | + |
| 101 | +### 3. 长度限制 |
| 102 | + |
| 103 | +Base64 编码会增加约 33% 的长度: |
| 104 | +- 原始长度:100 字节 |
| 105 | +- Base64 后:约 133 字节 |
| 106 | + |
| 107 | +如果服务器有长度限制,可能需要: |
| 108 | +- 使用更短的注入技术 |
| 109 | +- 分块传输 |
| 110 | +- 调整服务器配置(测试环境) |
| 111 | + |
| 112 | +### 4. 时间同步 |
| 113 | + |
| 114 | +动态密钥场景下: |
| 115 | +```python |
| 116 | +import time |
| 117 | + |
| 118 | +def tamper(payload, **kwargs): |
| 119 | + # 确保与服务器时间同步 |
| 120 | + # 可能需要从响应中提取时间戳 |
| 121 | + timestamp = int(time.time()) |
| 122 | + # 或 |
| 123 | + timestamp = kwargs.get('headers', {}).get('X-Server-Time') |
| 124 | +``` |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +## 调试技巧 |
| 129 | + |
| 130 | +### 1. 使用代理查看请求 |
| 131 | + |
| 132 | +```bash |
| 133 | +python sqlmap.py -u URL --data='...' --tamper=script -p param --proxy=http://127.0.0.1:8080 |
| 134 | +``` |
| 135 | + |
| 136 | +在 Burp 中查看实际发送的请求内容。 |
| 137 | + |
| 138 | +### 2. 添加调试输出 |
| 139 | + |
| 140 | +```python |
| 141 | +def tamper(payload, **kwargs): |
| 142 | + import sys |
| 143 | + sys.stderr.write(f"[DEBUG] Original: {payload}\n") |
| 144 | + |
| 145 | + # 处理逻辑 |
| 146 | + result = process(payload) |
| 147 | + |
| 148 | + sys.stderr.write(f"[DEBUG] Result: {result}\n") |
| 149 | + return result |
| 150 | +``` |
| 151 | + |
| 152 | +### 3. 本地测试 Tamper 脚本 |
| 153 | + |
| 154 | +```python |
| 155 | +# test_tamper.py |
| 156 | +import sys |
| 157 | +sys.path.insert(0, '/path/to/sqlmap') |
| 158 | + |
| 159 | +from tamper.base64_nested import tamper |
| 160 | + |
| 161 | +# 测试 |
| 162 | +test_payload = "test' AND 1=1--" |
| 163 | +result = tamper(test_payload) |
| 164 | +print(f"Input: {test_payload}") |
| 165 | +print(f"Output: {result}") |
| 166 | + |
| 167 | +# 验证输出 |
| 168 | +decoded = base64.b64decode(result) |
| 169 | +print(f"Decoded: {decoded}") |
| 170 | +``` |
| 171 | + |
| 172 | +### 4. Verbose 模式 |
| 173 | + |
| 174 | +```bash |
| 175 | +# 增加输出详细程度 |
| 176 | +python sqlmap.py -u URL ... -v 3 # 或 -v 4, -v 5, -v 6 |
| 177 | +``` |
| 178 | + |
| 179 | +--- |
| 180 | + |
| 181 | +## 常见问题排查 |
| 182 | + |
| 183 | +### Q: SQLMap 报错 "tamper module not found" |
| 184 | + |
| 185 | +**原因**: |
| 186 | +- 脚本路径错误 |
| 187 | +- 脚本语法错误 |
| 188 | +- 缺少依赖 |
| 189 | + |
| 190 | +**解决**: |
| 191 | +```bash |
| 192 | +# 检查路径 |
| 193 | +ls -la /path/to/tamper_script.py |
| 194 | + |
| 195 | +# 检查语法 |
| 196 | +python -m py_compile tamper_script.py |
| 197 | + |
| 198 | +# 使用绝对路径 |
| 199 | +python sqlmap.py ... --tamper=/absolute/path/to/script.py |
| 200 | +``` |
| 201 | + |
| 202 | +### Q: Tamper 脚本执行但没有效果 |
| 203 | + |
| 204 | +**原因**: |
| 205 | +- 脚本逻辑错误 |
| 206 | +- SQLMap 缓存了旧结果 |
| 207 | +- 参数名不匹配 |
| 208 | + |
| 209 | +**解决**: |
| 210 | +```bash |
| 211 | +# 清除会话缓存 |
| 212 | +python sqlmap.py ... --flush-session |
| 213 | + |
| 214 | +# 检查参数名是否正确 |
| 215 | +python sqlmap.py ... -p content # 确保是实际的参数名 |
| 216 | +``` |
| 217 | + |
| 218 | +### Q: Base64 解码失败 |
| 219 | + |
| 220 | +**原因**: |
| 221 | +- 编码错误(URL 安全 Base64 vs 标准 Base64) |
| 222 | +- 填充问题 |
| 223 | +- 字符集问题 |
| 224 | + |
| 225 | +**解决**: |
| 226 | +```python |
| 227 | +import base64 |
| 228 | + |
| 229 | +# 标准 Base64 |
| 230 | +base64.b64encode(data) |
| 231 | + |
| 232 | +# URL 安全 Base64 |
| 233 | +base64.urlsafe_b64encode(data) |
| 234 | + |
| 235 | +# 处理填充 |
| 236 | +data += '=' * (4 - len(data) % 4) |
| 237 | +``` |
| 238 | + |
| 239 | +### Q: SQLMap 检测到注入但无法提取数据 |
| 240 | + |
| 241 | +**原因**: |
| 242 | +- 响应也是加密的 |
| 243 | +- 响应格式解析失败 |
| 244 | +- 盲注技术限制 |
| 245 | + |
| 246 | +**解决**: |
| 247 | +- 手动验证注入 |
| 248 | +- 检查响应处理 |
| 249 | +- 使用 `--technique` 指定注入技术 |
| 250 | +- 调整 `--time-sec` 时间参数 |
| 251 | + |
| 252 | +--- |
| 253 | + |
| 254 | +## 最佳实践 |
| 255 | + |
| 256 | +### 1. 版本控制 |
| 257 | + |
| 258 | +将自定义 tamper 脚本纳入项目版本控制: |
| 259 | +```bash |
| 260 | +git add src/backEnd/tampers/ |
| 261 | +git commit -m "Add base64 nested param tamper script" |
| 262 | +``` |
| 263 | + |
| 264 | +### 2. 文档注释 |
| 265 | + |
| 266 | +```python |
| 267 | +#!/usr/bin/env python3 |
| 268 | +""" |
| 269 | +Tamper script for XXX encryption |
| 270 | +
|
| 271 | +Author: Your Name |
| 272 | +Date: 2024-01-01 |
| 273 | +Version: 1.0 |
| 274 | +
|
| 275 | +Description: |
| 276 | + Brief description of what this script does |
| 277 | +
|
| 278 | +Usage: |
| 279 | + python sqlmap.py -u URL --tamper=this_script.py -p param |
| 280 | +
|
| 281 | +Dependencies: |
| 282 | + - pycryptodome (for AES encryption) |
| 283 | + - other dependencies |
| 284 | +""" |
| 285 | +``` |
| 286 | + |
| 287 | +### 3. 模块化设计 |
| 288 | + |
| 289 | +```python |
| 290 | +# 加密函数独立出来 |
| 291 | +def encrypt_data(data, key): |
| 292 | + """加密数据""" |
| 293 | + pass |
| 294 | + |
| 295 | +def decrypt_data(data, key): |
| 296 | + """解密数据""" |
| 297 | + pass |
| 298 | + |
| 299 | +def tamper(payload, **kwargs): |
| 300 | + """主入口""" |
| 301 | + inner = {"param": payload} |
| 302 | + encrypted = encrypt_data(json.dumps(inner), KEY) |
| 303 | + return encrypted |
| 304 | +``` |
| 305 | + |
| 306 | +### 4. 错误处理 |
| 307 | + |
| 308 | +```python |
| 309 | +def tamper(payload, **kwargs): |
| 310 | + try: |
| 311 | + # 处理逻辑 |
| 312 | + return result |
| 313 | + except Exception as e: |
| 314 | + import sys |
| 315 | + sys.stderr.write(f"[Tamper Error] {str(e)}\n") |
| 316 | + # 返回原始 payload,避免中断扫描 |
| 317 | + return payload |
| 318 | +``` |
| 319 | + |
| 320 | +--- |
| 321 | + |
| 322 | +## 参考资源 |
| 323 | + |
| 324 | +- [SQLMap 官方文档](https://github.com/sqlmapproject/sqlmap/wiki) |
| 325 | +- [SQLMap Tamper 脚本集合](https://github.com/sqlmapproject/sqlmap/tree/master/tamper) |
| 326 | +- [Base64 编码规范](https://tools.ietf.org/html/rfc4648) |
| 327 | +- [OWASP SQL 注入](https://owasp.org/www-community/attacks/SQL_Injection) |
0 commit comments