首页 > 数据库 >初识SQL注入

初识SQL注入

时间:2023-12-21 23:44:20浏览次数:25  
标签:语句 users 数据库 初识 SQL id 注入

初识SQL注入↗

1、SQL注入原理

SQL注入漏洞是指攻击者通过浏览器或者其他客户端将恶意SQL语句插入到网站参数中,而网站应用程序未对其进行过滤,将恶意SQL语句带入数据库使恶意SQL语句得以执行,从而使攻击者通过数据库获取敏感信息或者执行其他恶意操作。

2、SQL注入危害

➢ 绕过登录验证:使用万能密码登录网站后台等。 如:'or 1=1#

➢ 获取敏感数据:获取网站管理员帐号、密码等。

➢ 文件系统操作:列目录,读取、写入文件等。

➢ 执行系统命令:远程执行命令。

3、可进行SQL注入参数

sql注入漏洞要发生的前提是要有数据与数据库进行查询,所以在对网站测试的不仅仅在id参数等进行测试,比如User-Agent字段,如果每一个客户端在请求网站时服务器都记录了此字段并保存到数据库中,这个过程与数据库有着交互,那么也有可能存在sql注入,数据包请求头任何参数都有可能成为sql注入的点,列举几个参数。

User-Agent:

使得服务器能够识别客户使用的操作系统,游览器版本等。(很多数据量大的网站中会记录客户使用的操作系统或+浏览器版本等存入数据库中)

Cookie:

网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据

X-Forwarded-For:

简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP])。

Rerferer:

浏览器向 WEB 服务器表明自己是从哪个页面链接过来的。

Host:

客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。在拿到一个网站的时候判断其功能点,比如一个网站你发现判定你的ip来让你可不可以登入,说明在数据库存储了ip进行比对,与数据库有着交互,这个时候可以尝试进行xff注入。其他点也可以像这样去判断。

4、SQL注入分类

四大注入

联合注入

1 and union select 1,2,3,4

延时注入

if(left(database(),1)='a',sleep(3),1)

布尔注入

1 and if(left(database(),1)='a',0,1)

报错注入

updatexml(1,concat(0x7e,(查询语法),0x7e),1)

其余注入

⼆次注⼊

堆叠注⼊

排序注⼊

宽字节注入

1、基于注入点位置分类
• GET注入
• POST注入
• Cookie注入
• …… 
2、基于变量数据类型分类
• 字符型注入
• 数字型注入
3、基于获取数据的方法分类
• 基于回显
• 基于错误
• 盲注
	• 布尔型盲注
	• 基于时间盲注 
4、其他类型
• ⼆次注⼊
• 堆叠注⼊
• 排序注⼊

5、SQL注入判断

数字型与字符型

SQL注入按照数据类型分为数字型注入和字符型注入。注入点的数据类型为数字型时为数字型注入,注入点的数据类型为字符型时为字符型注入。

数字型

$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);

-->前端分析
http://127.0.0.1/sqli-labs-master/Less-2/?id=2		正常
http://127.0.0.1/sqli-labs-master/Less-2/?id=2'		报错
http://127.0.0.1/sqli-labs-master/Less-2/?id=2 and 1=1		正常
http://127.0.0.1/sqli-labs-master/Less-2/?id=2 and 1=2		不正常

-->数据库语句
SELECT * FROM users WHERE id=1 LIMIT 0,1
SELECT * FROM users WHERE id=1' LIMIT 0,1		# 输入'
SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1		# 输入 and 1=1
SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1		# 输入 and 1=2
在 WHERE id=$id 这个SQL语句的子句中,$id 变量没有用单引号或者双引号引起来,而是直接拼接到了后面,这样的注入就是典型的数字型注入。

判断数字型注入的方法如下:
(1)输入单引号,不正常返回。
如果用户提交 index.php?id=1' ,那么后面的SQL语句就变为SELECT * FROM users WHERE id=1' LIMIT 0,1 ,SQL语句本身存在语法错误,会有不正常的结果返回。
(2)输入 and 1=1,正常返回。
如果用户提交 index.php?id=1 and 1=1 ,那么后面的SQL语句就变为 SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 ,会有正常的结果返回。
(3)输入and 1=2,不正常返回。
如果用户提交 index.php?id=1 and 1=2 ,那么后面的SQL语句就变为 SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 ,会有不正常的结果返回。

数字型注入的注入点主要通过上面3个语句来判断,如果输入的返回结果与上面相符,说明测试语句中的恶意SQL语句被带入数据库中并且成功执行,那么就可能存在数字型注入。具体有没有数字型注入,是否可以通过数字型注入获取有效信息,还需要大量的测试来验证。

字符型

$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

-->前端分析
http://127.0.0.1/sqli-labs-master/Less-1/?id=1		正常
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'		报错
http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and '1'='1		正常
http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and '1'='2		不正常

-->数据库语句
SELECT * FROM users WHERE id='1' LIMIT 0,1
SELECT * FROM users WHERE id='1'' LIMIT 0,1		# 输入'
SELECT * FROM users WHERE id='1' and '1' = '1' LIMIT 0,1		# 输入 ' and '1'='1
SELECT * FROM users WHERE id='1' and '1' = '2' LIMIT 0,1		# 输入 ' and '1'='2
这个示例代码与数字型注人的示例代码基本一致,只是在后面的SQL语句拼接中,$id多了一对单引号,$id是字符型数据,这就是典型的字符型注入。

判断字符型注入的方法如下:
(1)输入单引号,不正常返回。
如果用户提交 index.php?id=1' ,那么后面的SQL语句就变为 SELECT * FROM users WHERE id=1' LIMIT 0,1 ,SQL语句本身存在语法错误,会有不正常的结果返回。
(2)输入 ' and '1'= '1,正常返回。
如果用户提交 index.php?id=l' and '1'='1 ,那么后面的SQL语句就变为 SELECT * FROM users WHERE id='1' and '1' = '1' LIMIT 0,1 ,会有正常的结果返回。
(3)输入'and '1'='2,不正常返回。
如果用户提交 index.php?id=l' and' 1'='2 ,那么后面的SQL语句就变为 SELECT * FROM users WHERE id ='1' and '1' =2' LIMIT 0,1 ,会有不正常的结果返回。

字符型注入的注入点主要通过上面3个语句来判断,如果输入的返回结果与上面相符,说明测试语句中的恶意SQL语句被带入数据库中并且成功执行,那么就可能存在字符型注入。具体有没有字符型注入,是否可以通过字符型注入获取有效信息,还需要大量的测试来验证。

报错与盲注

SQL注入按照服务器返回信息是否显示分为报错注入和盲注。如果在注入的过程中,程序将获取的信息或者报错信息直接显示在页面中,这样的注入为报错注入;如果在注入的过程中,程序不显示任何SQL报错信息,只能通过精心构造SQL语句,根据页面是否正常返回或者返回的时间判断注入的结果,这样的注入为盲注。

报错

image-20230724103822637

盲注

image-20230724103853939

6、MYSQL注入常用表

从MySQL5开始,MySQL自带information_schema数据库,它提供了访问数据库元数据的方式。

在information_schema数据库下,有几个比较重要的表:

schemata表

schemata表存放当前所有数据库信息。常用字段:schema_name(数据库名)

具体而言,"schemata"表中包含了以下字段:

  • CATALOG_NAME: 数据库所属的目录(通常为NULL)
  • SCHEMA_NAME: 数据库的名称
  • DEFAULT_CHARACTER_SET_NAME: 数据库的默认字符集
  • DEFAULT_COLLATION_NAME: 数据库的默认排序规则
  • SQL_PATH: 数据库的SQL路径(通常为NULL)

因此,"schemata表"存储了数据库的元数据信息,可以帮助用户了解当前MySQL实例中有哪些数据库,以及它们的基本信息。

tables表

tables表存放(所有数据库中的) 所有表信息。tables表的字段:table_schema(表所属数据库)、table_name(表名)

columns表

columns表存放(所有数据库中的所有表中的)所有字段。columns表的字段:table_schema(所属数据库名)、table_name(所属表名)、column_name(字段名)

information_schema
	|__ schemata		所有数据库的名字
		|__ schema_name		数据库名
	|__ tab1es		所有表的名字
		|__ table_schema		表所属数据库的名字(!)
		|__ table_name		表的名字(!)
	|__ colurmns		所有字段的名字
		|__ table_schema		字段所属数据库的名字
		|__ table_name		字段所属表的名字
		|__ colun_name		字段的名字

7、SQL注入流程

➢ 判断是什么类型的注入
➢ 根据注入类型构造语句
➢ 获取数据库名
➢ 获取表名
➢ 获取字段名 
➢ 通过数据库名、表名和字段名构造查询语句获取数据

基本的获取数据payload(函数)
• 查询数据库版本 ----> select version();
• 查询数据库名称 ----> select database();
• 查询当前数据库用户名 ----> select user();

8、万能密码

➢ 同一条SQL语句中同时出现 and 和 or ,and 执行的优先级比 or 高

例句:select * from users where username = 'admin' and password = 'admin';

用户名已知

账户名:admin
密码:1' or '1' = '1 
--->
select * from users where username = 'admin' and password = '1' or '1' = '1 ';

用户名未知

# 第一种:
用户名: 1' or '1' or '1
密码:随便输
--->
select * from users where username = '1' or '1' or '1' and password = 'xxx';


# 第二种(使用注释符):
账户名:' or 1 = 1 #
密码:随便输
--->
select * from users where username = '' or 1 = 1 #' and password = 'xxx';

标签:语句,users,数据库,初识,SQL,id,注入
From: https://www.cnblogs.com/carmi/p/17920364.html

相关文章

  • MySQL运维14-管理及监控工具Mycat-web的安装配置
    一、Mycat-web介绍Mycat-web(现改名为Mycat-eye)是对Mycat-server提供监控服务,通过JDBC连接对Mycat,MySQL监控,监控远程服务器的cpu,内存,网络,磁盘等情况的使用。Mycat-web运行过程中需要依赖zookeeper,因此需要先安装zookeeper,下载地址如下:zookeeper:链接: https://pa......
  • 【SpringBootWeb入门-17】Mybatis-基础操作-动态SQL
    1、章节回顾上一篇文章我们讲解完了Mybatis基础操作,本篇继续学习Mybatis中非常重要的功能:动态SQL。什么是动态SQL:随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。简单说SQL语句不是固定的,是动态变化的。就拿我们上一篇所提到的根据条件来查询员工的SQL语句来......
  • Mac安装Mysql5.7
    官网https://downloads.mysql.com/archives/community/下载Mysql5.7.31,再高5.7版本没有macOS选项安装安装完毕会弹出帐号密码这里要把密码记住,待会用mysqladmin重置密码时要用。启动mysql服务系统设置拉到最下面,启动mysql服务启动成功设置mysql服务端mysql命令别名......
  • MySQL8.0 OCP 70题
    Choosetwo.WhichtwoMySQLServeraccountsarelockedbydefault?默认情况哪两个MySQLServer帐户被锁定?A)anynewROLEaccounts任何新的角色帐户B)anyinternalsystemaccounts任何内部系统帐户C)anyusercreatedwithausername,butmissingthehostnameD......
  • 如何判断一个sql走不走索引?
    在你的工作中,可能写过很多个sql,我相信最让你头疼的,一定还是那风骚的查询sql。我猜你很可能有这样的体验,好不容易写了一个牛逼哄哄的查询sql,兴奋的上线投产。结果,在第二天阳光明媚的日子里,dba把你的sql揪了出来,揪出来还不算,dba还要发到群里@你,说:“嗨,兄弟,瞅瞅你写的个啥?”接着,dba......
  • 同样的SQL,怎么突然就慢了?
    本篇文章素材来源于某银行系统的一次性能问题分析。许久没写这种troubleshooting类型的技术文章了,因为曾在服务公司呆过多年,工作原因,这方面之前做的多,听的更多,导致已经达到在自己认知维度下的一个小瓶颈,纯技术型的问题,稍微常见的基本都遇到过,非常少见的也基本是bug类(软件缺陷只能......
  • 在 MySQL 中,你可以使用 `AVG()` 函数来计算一组值或表达式的平均值。`AVG()` 函数的基
    在MySQL中,AVG()函数在计算平均值时会自动忽略NULL值¹⁴。也就是说,它只会计算所有非空值的平均值³。例如,假设你有一个包含以下值的列:90,80,70,85,95,NULL,NULL。在这种情况下,AVG()函数将只计算非空值的平均值,即:而不是将NULL值视为0并计算所有值的平均值。如果你需......
  • PostgreSQL从入门到精通教程 - 第39讲:数据库完全恢复
       PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第39讲:数据库完全恢复 PostgreSQL第39讲:12月23日(......
  • centos7上源码安装postgresql 13.6
    1环境描述操作系统:Centos7.6postgresql:13.6安装方式:源码安装2创建用户#groupadd-g2000pgsql#useradd-u2000-gpgsqlpgsql3目录规划#mkdir-p/postgresql/{pgdata,archive,scripts,backup,pg13,soft,pg_log}#chown-Rpgsql:pgsql/postgresql#......
  • postgresql常用创建用户和授权
    需求(1)给用户a创建一个数据库,并且给a用户对这个库有所有权限(2)给read_a用户对这个数据库有只读权限步骤1.创建用户a2.创建数据库db_a,并设置owner为a3.回收默认的publicschemacreate权限4.设置db_a的publicschema默认的owner为a5.创建只读用户read_a6.用a用户给read_a......