当前位置: 首页 > news >正文

sql注入学习

前言

之前一篇文章简单写过sql注入产生的原因,大体是因为网站传参数据时,过滤不够严格导致传参的数据和后台sql语句拼接执行。还了解了为什么要闭合,闭合的作用,以及注释的作用,那么现在就开始具体学习各种类型的注入。https://blog.csdn.net/zl0_00_0/article/details/146605934?spm=1011.2124.3001.6209

其实在学习之前个人认为还是具体去学习一下几个现在常用数据库的结构,比如说mysql或是sql server等等,但是这两个内容太多了,短时间学不精,而且大多的数据库的差异都是储存数据的格式差别,其构成还是:库、表、列、字段之类存在级别区分的个体组成的,这边就直接进入操作过程

注入前

1、判断是否有sql注入漏洞,若有则判断注入点和传参方式

其中传参方式有get传参和post传参,get传参可以通过在url地址栏输入测试的语句测试,post则一般是一个具体的输入框,比如一个登录界面;判断是否存在注入点最经典的是id=1'判断,如果传参之后网页报错了则代表具有sql漏洞,当然如果网页没有报错也不代表不存在,可能是对'进行了过滤或其他手段,可以利用其他验证方式进行验证

2、判断注入类型:数字型或字符型

数字型和字符型是在创建数据库的表时确定的,类型总是以数字或字符来区分

数字型大多可以这样判断:id=x and 1=1可以加注释符,如果传参这个网站运行没有出错,继续传参id=x and 1=2可以加注释符时报错了,则说明是数字型注入。通过之前的文章我们也能知道传参的第一句没有语法错误且后面定义恒为真,第二句恒为假,所以第一句正常回显,第二句会报错。但如果是字符型还是传参上面两个语句,字符型会把and当作字符,而不会像执行语句一样去解析and所以语句不会执行。

联合查询注入(也叫union注入)

当页面随我们传参的值会发生变化时,我们通常使用联合查询注入

union注入常用的环境变量

这边运用sqli-labs第一关来尝试

判断是否存在注入

回显存在错误,可以看到是闭合错了删去‘

存在注入,接着判断类型

输入测试语句,回显正常,这边要有一个区分,我们在上面的1后面加上’

可以看到还是回显成功了,我是这样理解的:我们看一下两个的执行语句,首先sql语句中的单引号总是要成对存在的,不然会报错,第一句后面虽然加了注释符号,但是如果后面的单引号被注释了,那么前面只有一个单引号显然会报错,这边没报错说明两个单引号闭合了,后面的注释符没注释掉单引号,而第二句在1后面加了单引号,直接和前面的单引号闭合了,后面的单引号被注释掉了同样不会报错,但是如果我们用第一句每加单引号的去进行测试可以看看,当我们后面恒假时

sql语句还是成功执行,可以去具体看看这句sql中id是等于1 and1=2--,那么是不是可以认为像字符类型一样的,and被当成字符解析了失去了他原本的功能,导致后面恒假的条件不成立,再加上语句没有错误所以成功执行,那么如果我们在1后面加上单引号使后面恒假呢

可以发现没有回显,那就说明是字符型注入,现在我们使用笨办法去一一查看看有几行:就是令id=x依次递增

在id=15时没有回显说明有14个行,现在我们对行1进行操作,id是一列的名称,类似这样的结构

介绍一个函数:order by。

默认语法:SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];       

例如select * from users order by 2      从名为 “users” 的表中选择所有列的数据,并按照表中的第二列进行排序。其中*是通配符,表示所有列

当然也可以和id=x联用,反正order by后面要接上列名,操作看看

可以看到对于行1进行操作,当列数到达4时就报错了,说明这个表中只有3列

接下来介绍union select:

union主要是用于合并两条查询结构

例如:这边有两个查询语句SELECT id,name FROM user1和SELECT id,username FROM user2,查询结果分别是--和++那么如果执行

SELECT id,name FROM user1 UNION SELECT id,username FROM user2

查询结果就是---+++,union使用的规则是查询的两个语句指定的列数必须相同,两个查询中对应列的数据类型必须兼容,不然会报错,使用union查询后默认对两组查询的结果进行去重操作,如果想保留全部查询数据,可以使用union all

select

如果直接执行select 1,2,3的话由于没有from指引,select不会定位任何表,会直接返回我们指定的数据,并将它们当作列名,类似这样

那么如果我们执行

SELECT id,name FROM user1 union SELECT 1,2

会将users表中id和name列中的数据和1,2合并类似

最后我们理解这个代码

SELECT * FROM user1 where id=-1 UNION SELECT 1,2,3

将user1表中id=-1列的内容和1,2,3合并,id=-1这一列显然是不存在的,所以就只会显示1,2,3

http://www.dtcms.com/a/102109.html

相关文章:

  • 可信数据空间:构筑安全可控数据流通
  • 强制用户裸奔,微软封锁唯一后门操作
  • 使用docker容器搭建本地yum源并及时更新
  • 循环控制的内容
  • [Vue]生命周期
  • JavaScript事件监听
  • Vue2和3的vue-router:生命周期、懒加载
  • Nmap全脚本使用指南!NSE脚本全详细教程!Kali Linux教程!(三)
  • 通过Anaconda Prompt激活某个虚拟环境并安装第三方库
  • Linux多线程编程的艺术:封装线程、锁、条件变量和信号量的工程实践
  • 今日行情明日机会——20250331
  • Ansible(2)——部署 Ansible
  • 爬虫:基本流程和robots协议
  • 从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.1.1模型量化(INT8/FP16)与剪枝策略
  • 【软考备考】管道一过滤器(Pipe-Filter)的架构风格
  • USB有驱IC卡读卡器
  • Spring中都用到了哪些设计模式
  • 美团小程序 mtgsig1.2 拼好饭案例 分析 mtgsig
  • 六级词汇量积累day13
  • dayjs dayjs时间格式化工具(时间计算、时间格式化)
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例14,TableView16_14 拖拽自动保存示例
  • python leetcode简单练习(1)
  • 【FreeRTOS】任务(TASK)——任务的创建(源码解读)
  • Qt中绘制不规则控件
  • ​Linux 中 nmap 命令详解:从基础到实战的全面指南
  • dfs记忆化搜索刷题 + 总结
  • 如何判断列表a中元素是否在列表b中
  • [leetcode]2685. 统计完全连通分量的数量
  • C++ 结构体、结构体指针与结构体指针数组详解
  • RabbitMQ 的三种集群模式