SQL注入漏洞

SQL注入

判断注入方式

1%' and 1=2#
1%' and 1=1#
id = 1 and 1=1
id = 1 and 1=2
id = 1 or 1=1
id = '1' or '1'='1'
id=" 1 "or "1"="1"

万能密码

admin’or’1’=’1

判断列数

1%'order by 5#

sql注释符

# 单行注释 注意与 url 中的#区分,常编码为%23
--空格 单行注释 注意为短线短线空格
/*()*/ 多行注释 至少存在俩处的注入 /**/常用来作为空

注入流程

是否存在注入并且判断注入类型
判断字段数 order by
确定回显点 union select 1,2
查询数据库信息
@@version @@datadir
查询用户名,数据库名
user() database()
文件读取 union select 1,load_file('C:\\wondows\\win.ini')#
写入 webshell
select..into outfile...
补充一点,使用 sql 注入遇到转义字符串的单引号或者双引号,可使用 HEX 编码绕过

Mysql相关介绍
在 mysql5 版本以后,mysql 默认在会把所有的数据库存放在一个叫 infomation_schema 里面,这个库里面有很多表,重点是这三个表 columns 、tables、SCHEMATA
SCHEMATA 表字段 SCHEMA_NAME 记录着库的信息
tables 表字段 TABLE_SCHEMA 、TABLE_NAME 分别记录着库名和表名
columns 存储该用户创建的所有数据库的库名、标名和字段名。

通过 infomation_schema 查询 www_dvwa_com 库里所有的表和字段

select * from information_schema.`COLUMNS` where TABLE_SCHEMA='www_dvwa_com

查询某个库某个表的字段可以这样查询

select * from information_schema.COLUMNS where TABLE_SCHEMA='www_dvwa_com' and TABLE_NAME='users'

SQL注入分类
按照SQLMap区分

UNION query SQL injection(联合查询注入)
Stacked queries SQL injection(多语句查询注入)(堆叠查询)
Boolean-based blind SQL injection(布尔型注入)
Error-based SQL injection(报错型注入)
Time-based blind SQL injection(基于时间延迟注入)

按照接受请求类型区分

GET 注入
GET 请求的参数是放在 URL 里的,GET 请求的 URL 传参有长度限制 中文需要 URL 编码
POST 注入
POST 请求参数是放在请求 body 里的,长度没有限制
COOKIE 注入
COOKIE 参数放在请求头信息,提交的时候 服务器会从请求头获取

按照注入数据类型分类

int 整型
select * from users where id=1
sting 字符型
select * from users where username='admin'
like 搜索型
select * from news where title like '%标题%'

利用方式

1.判断是否存在注入,注入数据类型是字符型还是数字型
2.猜解 SQL 查询语句中的字段数 order by N
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.查询到账户的数据

SQL注入常用测试语句

常见注入方式

union 联合查询注入

堆叠查询注入

布尔型注入

盲注

报错型注入

基于时间延迟注入

进阶注入

时间注入

堆叠注入

二次注入

宽字节注入

Cookie注入

XFF注入

Base64编码注入

防御方式

代码层最佳防御 sql 漏洞方案:采用 sql 语句预编译和绑定变量,是防御 sql 注入的最佳方法。
( 1 )所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。当前几乎所有的数据库系统都提供了参数化 SQL 语句执行接口,使用此接口可以非常有效的防止 SQL 注入攻击。
( 2 )对进入数据库的特殊字符( ' <>&* 等)进行转义处理,或编码转换。
( 3 )确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为 int 型。
( 4 )数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。
( 5 )网站每个数据层的编码统一,建议全部使用 UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。
( 6 )严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
( 7 )避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断

绕过方式

空格字符绕过

大小写绕过

浮点数绕过

NULL值绕过

引号绕过

添加库名绕过

去重复绕过

反引号绕过

脚本语言特性绕过

逗号绕过

substr截取字符串绕过

min截取字符串绕过

使用join绕过

like绕过

limit offset绕过

or and xor not绕过

ascii字符对比绕过

等号绕过

双关键字绕过

二次编码绕过

多参数拆分绕过

使用生僻字符绕过

分块传输绕过

信任白名单绕过

静态文件绕过

pipline绕过注入

利用multipart/form-data绕过

order by绕过

http相同参数绕过

application/json绕过或者 text/xml绕过

运行大量字符绕过

花括号绕过

使用ALL或者DISTINCT绕过

换行混绕绕过

URL编码绕过

Unicode编码绕过

union select 绕过

posted @   KAKSKY  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示