【网络安全】SQL注入详细分析

SQL注入详细分析

一、sql注入

1.什么是sql注入

官方定义:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
个人理解:我觉得,sql注入就是利用,数据库和后端交互的时候,没有严谨的思路产生的漏洞,可以利用这个漏洞找到数据库里面的数据(这是非常可怕的一件事情)

2.sql注入的原理

通过利用开发者没有过滤干净的交互过程,以sql语句来针对数据进行注入。(这是一个非常繁琐的过程,尤其是需要手工注入的时候,还有就是如果遇到盲注那么就更繁琐了,后期会讲到盲注)

3.sql注入的危害

1、攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。

2、通过操作数据库对某些网页进行篡改;

3、修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;攻击者进而可以对网页进行篡改,发布一些违法信息等。

4、服务器被远程控制,被安装后门。可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。

5、数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。

6、破坏硬盘数据,导致全系统瘫痪;

二、类型检测

1.sql注入类型检测

sql注入检测方式有两种,一种是手工检测,另一种是自动检测。
手工检测很好理解,需要在url中写一些语句,形成新的命令,按照渗透者的命令找到想要的数据,这个过程是一个非常麻烦的过程,有时候还需要burp抓包进行配合,而且还需要猜测数据库名称是什么,依赖经验,而且耗时耗力,于是很多渗透者就像能不能写一款工具进行自动注入,可以节省时间和精力呢?
于是就出现了自动注入,自动注入也就是利用工具进行注入,sqlmap算是一个非常好用,并且用的人数最多的软件。

这里给大家个网址学习sql语句
网址链接

2.常见的类型有哪些

类型 介绍方式
字符型 手动注入(自动注入后期介绍)
数字型 手动注入(自动注入后期介绍)
搜索型 手动注入(自动注入后期介绍)
xx型 手动注入(自动注入后期介绍)

2.1字符型检测

判断是否存在字符型注入

  1. 单引号判断
    输入:http://url/?id=1'
    如果页面回显错误进行注释符判断
  2. 注释符判断
    输入:http://url/?id=1'#
    这时如果页面回显正常进行
  3. and 1=1判断
    输入:http://url/?id=1' and 1=1#
    这时如果回显正常那么尝试更改数值
  4. and 1=2判断
    输入:http://url/?id=1' and1=2#
    如果页面回显错误进行,说明是存在字符型注入
2.1.1实战演示
  1. '检测,点击查询
    在这里插入图片描述
    回显:
    在这里插入图片描述说明报错了,而且是因为有几个分号报错。

  2. 注释#
    在这里插入图片描述
    回显正确:
    在这里插入图片描述
    说明 大概率有一个字符型注入

2.2数字型检测

在这里插入图片描述
这里下拉框意思为id=

2.2.1实战演示
  1. 下拉框为1

在这里插入图片描述
2. 下拉框为2
在这里插入图片描述
回显不一样,说明大概率有一个数字型注入

2.3搜索型检测

在这里插入图片描述

2.3.1实战演示
  1. '检测
    在这里插入图片描述回显错误:
    在这里插入图片描述

  2. 输入#
    在这里插入图片描述
    回显数据说明是输入框的注入

2.4.xx型检测

在这里插入图片描述

2.4.1实战演示
  1. 基础判断'
    在这里插入图片描述这里显示闭合方式需要一个)

  2. 输入')#
    在这里插入图片描述

回显正确
在这里插入图片描述

回显错误

  1. ')or 1=1#
    在这里插入图片描述
    检测到数据,说明这是一个xx注入

三、sql注入的重要参数

1.重要函数

函数 含义
version() 数据库版本
database() 当前数据库名
user() 用户名
sysem_user() 系统用户名
current_user() 当前用户名
@@datadir 数据库路径
@@version_compile_os 操作系统版本
length() 返回字符串长度
substr() 截取字符串
mid()left() 从左侧开始取字符
cancat() 没有分隔符链接字符串
concat_ws() 含有分隔符连接字符串
group_concat() 连接一个组的字符串
ord() 返回ASCII编码样式
ascil() 转换为ASCII样式
md5() 返回MD5(不可逆的加密方式)
floor(x) 返回不大于x的最大整数
round(x) 返回参数接近x的整数
rand() 返回0-1之间的随机浮点数
sleep() 睡眠时间为指定的秒数
if(true,t,f) if判断语句

2.重要的数据库

最常用的库是
information_schema 包含sql中所有数据库的信息

3.重要的表

代码 含义
schemata mysql中所有数据库信息
schema_name 所有数据库名
tables 记录数据库表中所有信息
table_name 记录数据表名
table_schema 记录数据库名
columns 列信息
column_name 字段名

四、 union注入

1.什么是union注入

union注入为联合查询语句合并两个或者多个sql语句结合起来,得到联合查询的结果
union注入是需要order by来判断,order by是在sql语句后面进行排序的通常我们用order by来判断字段有几位。

2.union注入的方法

举例:

select*from users where id=2 order by 3;

意思为查询id等于2的3字段,这里有个前提就是,需要表里字段和order by 后面的数字需要一致,才可以回显成功,所以说一般我们都用order by来判断表中有多少个字段,再进行判断字段名称。

实战心得

  1. 在url后加上单引号' 判断是否存在注入
  2. 在url后加上'# 判断是否实现正常
  3. 在url后加上' and 1=1# 判断是否实现正常
  4. 在url后加上' and 1=2# 判断注入类型
  5. 在url后加上' and 1=1 order by 4# 判断字段有几个,如果报错说明小于4,依次递减判断,找到数据库字段数
  6. 在url后加上 ' union select 1,2,3# 判断联合查询语句是否正确
  7. 在url后加上 id=888888'union select1,2,3# 判断是否回显出显示位,如果可以显示,说明可以通过位数查找数据库数据
  8. 构造函数 id=888888'union select1,database(),user()# 查找数据库中当前数据库名和用户名

五、总结

sql注入学的过程是很难得很痛苦的,学会之后就会很简单,所以希望各位技术友加油,咱们高处见。

猜你喜欢

转载自blog.csdn.net/weixin_50481708/article/details/123939259