一次edu的渗透测试记录
字数 1203 2025-08-20 18:18:23
教育系统渗透测试实战教学文档
信息收集阶段
默认凭证获取
- 官网操作手册分析:通过查阅目标教育系统的官方操作手册,发现系统存在默认密码设置
- 谷歌语法利用:使用Google搜索语法查找包含姓名和学号的公开信息
- 技巧:使用较为稀有的姓名进行搜索,减少结果干扰
- 凭证组合:将获取的身份证信息与默认密码组合尝试登录系统
漏洞挖掘
XSS漏洞测试
- 测试方法:对所有输入点进行测试,插入XSS payload
- 发现结果:多个输入点存在跨站脚本漏洞
SQL注入漏洞深入分析
初步探测
- 测试点:statusCode字段
- 报错测试:
- 单引号
'触发报错 - 两个单引号
''恢复正常
- 单引号
- 函数测试:
exp(709)正常返回exp(710)触发异常- 初步判断为Oracle数据库
防御机制分析
- 拦截规则观察:
decode函数显示特殊字符被拦截case when结构触发异常但未被直接拦截- 推测WAF规则:在检测到逗号、等号等特殊字符后添加干扰字符
绕过技术
- 字符串连接绕过:
- 使用
||连接符替代逗号 - 测试payload:
'||case 1 when 1 then 1 else 1 end||'成功执行
- 使用
- 条件盲注构造:
- 修改payload为:
'||case user when 1 then 1 else exp(710) end||' - 原理:只有当user条件满足时才返回正常结果
- 修改payload为:
数据库类型识别
- 函数兼容性测试:
user函数可用,返回长度为8substring函数异常- 重新判断可能为PostgreSQL数据库
- PostgreSQL特性利用:
position函数可用且不受限制- 语法:
position('substr' in 'string') - 示例:
position('sql' in 'postgresql')→ 8position('p' in 'postgresql')→ 1
数据提取技术
- 逐字符爆破:
- 构造条件判断特定字符位置
- 示例payload:判断第一位字符
'||case position('a' in user) when 1 then 1 else exp(710) end||' - 结果分析:
- 返回异常表示字符不在第一位
- 返回正常表示字符匹配
- 自动化爆破流程:
- 依次测试a-z字符
- 发现第一位为'c'
- 重复流程获取完整字段值
关键知识点总结
-
信息收集技巧:
- 官方文档是重要信息来源
- Google语法精确定位敏感信息
-
SQL注入高级技巧:
- WAF规则分析与绕过
- 无逗号注入技术
- 数据库指纹识别方法
-
PostgreSQL特定注入:
position函数的优势利用- 布尔盲注与条件响应结合
-
自动化测试思路:
- 系统化字符爆破流程
- 响应差异分析技术
防御建议
-
输入验证:
- 实施严格的输入过滤
- 使用参数化查询
-
错误处理:
- 统一错误页面
- 避免详细错误信息泄露
-
认证安全:
- 禁用默认凭证
- 实施强密码策略
-
WAF优化:
- 更新规则库
- 防御无逗号注入技术