NJUPTCTF2018 Easy_Audit

本文详细解析了在特定PHP环境中,如何通过巧妙利用输入方法、URL编码、MD5特性、正则表达式及协议绕过等手段,绕过常见的安全检查。通过实例展示了如何规避变量过滤,实现对特定字符串的传递。

点击进入index.php
在这里插入图片描述
首先是一个if判断语句,将我们以post,get和cookie方法传入的数据变成了键值对,其中的值中不能出现字母。
在这里插入图片描述
然后又是一个if判断语句$_SERVER会截取url?后的内容,也就是我们以get方式传入的内容中不可以出现yulige,flag,nctf
对于上述的两个if判断语句,第一个语句中的$_REQUESTS接受以post方法,get方法和cookie方法传入的数据,但是如果post方法和get方法传入了名称相同的数据时,post方法传入的数据会覆盖get方法传入的数据。也就是说只要我们以post方法传入yulige=123&flag=123&nctf=123的话,我们就可以以get方式传入带有字母的变量了。第二个判断语句则可以利用url编码进行绕过
在这里插入图片描述
对于$yulige这个变量,对其要求是变量的前32位要和其md5加密后的值相同,我们可以通过传入数组返回null进行绕过。
在这里插入图片描述
对于$nctf这个变量的内容不可以等于nctfisfun但是需要利用preg_match匹配到nctfisfun,考虑到正则匹配仅限制了结尾,并没有限制开头因此可以通过双写n进行绕过。
在这里插入图片描述
最后是变量flag我们本来可以利用php://input协议postccc_liubi的,但是我们却使用了post的内容对变量内容的字母输入进行了绕过,因此我们可以利用data协议进行绕过。
最后的payload为:
在这里插入图片描述

<think>我们遇到了在清理审计跟踪时出现ORA-46258错误的问题。根据引用[1]和[3],我们知道Oracle提供了DBMS_AUDIT_MGMT包来管理审计记录,包括清理。ORA-46258错误通常与清理操作的条件不满足有关。 根据Oracle文档,ORA-46258错误表示:在尝试清理审计跟踪时,没有找到符合指定条件的审计记录。这可能是由于清理操作的时间范围设置不正确,或者审计记录已经被清理过。 解决步骤: 1. **检查当前审计记录的时间范围** 首先,我们需要确认审计记录中最早和最晚的时间戳,以确定清理的时间范围是否合理。 ```sql SELECT MIN(EXTENDED_TIMESTAMP), MAX(EXTENDED_TIMESTAMP) FROM AUD$; ``` 2. **初始化清理设置(如果尚未初始化)** 使用`DBMS_AUDIT_MGMT.INIT_CLEANUP`过程初始化审计清理设置。需要指定清理间隔(以小时为单位)和默认清理时间窗口(例如,24小时前)。 ```sql BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, DEFAULT_CLEANUP_INTERVAL => 24 /* 小时 */); END; / ``` 3. **设置归档时间戳** 使用`DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP`设置一个时间戳,表示清理操作将删除该时间戳之前的所有审计记录。注意:这个时间戳必须早于当前最早的审计记录时间戳,否则会出现ORA-46258。 ```sql DECLARE l_last_archive_time TIMESTAMP := SYSTIMESTAMP - INTERVAL '30' DAY; -- 清理30天前的记录 BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, LAST_ARCHIVE_TIME => l_last_archive_time); END; / ``` 4. **执行清理操作** 使用`DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL`过程清理审计记录。注意:如果之前没有设置归档时间戳,或者设置的时间戳没有早于任何审计记录的时间戳,则可能引发ORA-46258。 ```sql BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, USE_LAST_ARCH_TIMESTAMP => TRUE); EXCEPTION WHEN OTHERS THEN IF SQLCODE = -46258 THEN DBMS_OUTPUT.PUT_LINE('没有找到符合清理条件的审计记录。'); ELSE RAISE; END IF; END; / ``` 5. **检查清理配置** 如果仍然遇到问题,检查是否已经正确初始化清理配置: ```sql SELECT * FROM DBA_AUDIT_MGMT_CONFIG_PARAMS; ``` 确保`PARAMETER_NAME`为`DEFAULT CLEAN UP INTERVAL`和`LAST ARCHIVE TIMESTAMP`的值正确。 6. **手动删除(谨慎使用)** 如果上述方法无效,可以考虑手动删除(但需谨慎,因为可能影响数据库完整性): ```sql DELETE FROM AUD$ WHERE EXTENDED_TIMESTAMP < SYSTIMESTAMP - INTERVAL '30' DAY; COMMIT; ``` 注意:手动删除后需要重建索引: ```sql ALTER INDEX I_AUD1 REBUILD; ALTER INDEX I_AUD2 REBUILD; ``` **预防措施**: - 定期执行清理任务,避免审计记录堆积(引用[3]提到审计记录可能撑爆表空间) - 将审计表(AUD$)从SYSTEM表空间迁移到其他表空间(引用[2]和[3]提到SYSAUX表空间满的问题) - 关闭不必要的审计(引用[2]提到关闭审计功能) 迁移AUD$表到其他表空间: ```sql -- 创建新的表空间(如果需要) CREATE TABLESPACE audit_ts DATAFILE '/path/to/audit01.dbf' SIZE 1G AUTOEXTEND ON; -- 迁移AUD$表 BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_TS'); END; / ``` **相关问题**: 1. 如何配置Oracle自动清理审计记录? 2. 迁移AUD$表到其他表空间的步骤是什么? 3. 关闭Oracle数据库审计功能的方法有哪些? 4. 如何监控Oracle审计记录的增长? 5. 除了DBMS_AUDIT_MGMT,还有哪些方法可以清理审计记录? 通过以上步骤,应该可以解决ORA-46258错误。如果问题仍然存在,请检查Oracle版本(引用[1]提到11.2增强的清理功能)并确认操作是否符合版本要求。 [^1]: Oracle11gr2 AUDIT清除功能增强(二) [^2]: SYSAUX表空间因审计而满的解决方法 [^3]: 清理Oracle审计记录的方法</think>### 解决 ORA-46258 错误的完整指南 当使用 `DBMS_AUDIT_MGMT` 清理审计跟踪时出现 **ORA-46258: 未找到符合指定条件的审计记录** 错误,通常是由于清理条件配置不当导致的。以下是系统化的解决方案: --- ### 错误原因分析 1. **清理时间范围设置错误** - 指定的清理时间范围(`LAST_ARCHIVE_TIME`)没有覆盖任何审计记录 - 审计记录的时间戳早于数据库初始化时间 2. **初始化步骤未完成** - 未正确执行 `INIT_CLEANUP` 过程初始化清理环境 3. **审计类型不匹配** - 清理操作指定的审计类型与实际存储类型不一致 --- ### 解决方案步骤 #### 步骤 1:验证审计记录时间范围 ```sql SELECT MIN(EXTENDED_TIMESTAMP) AS oldest_record, MAX(EXTENDED_TIMESTAMP) AS newest_record FROM AUD$; ``` #### 步骤 2:正确初始化清理环境 ```sql BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, -- 标准审计 DEFAULT_CLEANUP_INTERVAL => 24 * 60 -- 清理间隔(分钟) ); END; / ``` #### 步骤 3:设置有效的归档时间戳 ```sql DECLARE l_last_archive_time TIMESTAMP := SYSTIMESTAMP - INTERVAL '30' DAY; -- 清理30天前记录 BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, LAST_ARCHIVE_TIME => l_last_archive_time ); END; / ``` #### 步骤 4:执行清理操作(关键修复) ```sql BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, USE_LAST_ARCH_TIMESTAMP => TRUE, -- 必须设置为TRUE CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT -- 多租户环境需指定 ); END; / ``` #### 步骤 5:验证清理结果 ```sql SELECT COUNT(*) FROM AUD$ WHERE EXTENDED_TIMESTAMP < SYSTIMESTAMP - INTERVAL '30' DAY; ``` --- ### 高级配置建议 1. **创建定期清理任务** ```sql BEGIN DBMS_AUDIT_MGMT.CREATE_PURGE_JOB( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_PURGE_INTERVAL => 24, -- 每24小时执行 AUDIT_TRAIL_PURGE_NAME => 'AUDIT_CLEAN_JOB', USE_LAST_ARCH_TIMESTAMP => TRUE ); END; / ``` 2. **迁移审计表到专用表空间** ```sql -- 创建专用表空间 CREATE TABLESPACE audit_ts DATAFILE '/u01/app/oracle/oradata/audit01.dbf' SIZE 1G AUTOEXTEND ON; -- 迁移审计表 BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_TS' ); END; / ``` 3. **关闭不必要的审计(可选)** ```sql -- 查看当前审计配置 SELECT * FROM DBA_PRIV_AUDIT_OPTS; -- 关闭特定审计 NOAUDIT SELECT TABLE BY SCOTT; ``` --- ### 常见错误排查表 | 错误现象 | 原因 | 解决方案 | |----------|------|----------| | ORA-46258 | 时间范围不匹配 | 使用`MIN(EXTENDED_TIMESTAMP)`设置正确时间戳 | | ORA-00904: "EXTENDED_TIMESTAMP" | Oracle版本<11g | 使用`NTIMESTAMP#`替代`EXTENDED_TIMESTAMP` | | ORA-06550: 程序包不存在 | 未安装DBMS_AUDIT_MGMT | 执行`@?/rdbms/admin/cataudit.sql` | | ORA-01555: 快照过旧 | 清理期间有长事务 | 在低峰期执行清理 | --- ### 预防措施 1. **定期监控审计表空间** ```sql SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024) AS size_mb, ROUND(SUM(bytes - NVL(free_space,0))/1024/1024) AS used_mb FROM dba_data_files JOIN (SELECT tablespace_name, SUM(bytes) free_space FROM dba_free_space GROUP BY tablespace_name) USING (tablespace_name) WHERE tablespace_name IN ('SYSTEM','SYSAUX','AUDIT_TS') GROUP BY tablespace_name; ``` 2. **设置审计表空间警报** ```sql BEGIN DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id => DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL, warning_operator => DBMS_SERVER_ALERT.OPERATOR_GE, warning_value => '85', critical_operator => DBMS_SERVER_ALERT.OPERATOR_GE, critical_value => '97', observation_period => 1, consecutive_occurrences=> 1, instance_name => NULL, object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE, object_name => 'AUDIT_TS' ); END; / ``` --- ### 相关问题 1. 如何将Oracle审计记录迁移到专用表空间? 2. Oracle 19c中审计清理有哪些新特性? 3. 如何配置自动清理不同审计类型(标准审计/FGA审计/操作系统审计)? 4. 审计记录清理后如何恢复? 5. 多租户环境下如何集中管理PDB的审计记录? > 通过合理配置自动清理策略[^1],可有效预防审计表空间膨胀导致的系统故障。定期检查审计设置是DBA关键维护任务之一[^3]。 [^1]: Oracle11gr2 AUDIT清除功能增强(二) [^2]: SYSAUX表空间因审计而满的解决方法 [^3]: 清理Oracle审计记录的方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值