简要MYSQL注入

Posted 山兔1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简要MYSQL注入相关的知识,希望对你有一定的参考价值。

目录

介绍

SQL注入,一般不是一些低权限的,都会被认为是很严重的漏洞,不是所有的SQL注入都可以对网站后台进行getshell,它是需要条件的,这个条件我们称为权限。

有的注入点,它是没有办法进行getshell的,他只能得到一些敏感信息,然后我们在一步步的去获取权限

SQL注入的危害有两个,一个是危害到数据,一个是危害到网站的权限,满足条件的注入点就可以,没有这个条件的注入点就不行

mysql注入

前期信息收集,未后续思路做铺垫:
操作系统
数据库名
数据库用户(数据库的管理员和网站的管理员又不一样)
数据库版本
其它(网站源代码放在那个盘符下面等)

存在数据数据注入,mysql数据库,低版本暴力查询或结合读取查询;高版本使用information.schema有据查询

存在高权限注入,我们可以进行数据注入、跨库查询、文件读写
利用注入进行跨数据库查询
利用注入进行文件读取或写入(需要提前知道网站的路径)

//如果数据库是高权限用户,那么我们选择的方案就会比较多,如果权限比较低的话,那我们只能使用一种或一两种

任何的漏洞挖掘都会涉及到信息收集,只有收集的好,你才能知道那些能操作,那些不能操作,你如果选择的方案会比较多的话,你肯定会选择最优,效率最高的那一种

当我们知道某个参数存在SQL注入点,这个时候,我们可以使用文件读写这个功能,直接写入后门,俗称为getshell,但是他有一个条件,他得知道网站路径

数据库用户决定我们是不是采用高权限的注入方案,如果说我们可以getshell,我们就不需要进行数据注入 ,就直接进行文件读写,因为我们的目标是获取服务器的权限,进行数据读取只是获取权限的另一种途径

SQL注入的传递过程

接收数据>拼接数据>拼接完数据才会到数据库当中执行>最后再把结果进行展示
在处理得当的时候没有注入点,处理不得当的时候就会有注入点

SQL注入就是把语句注入到SQL当中,通过参数的一个传递,把我们构造的payload拼接到之前就定义好的SQL语句当中去,由于他能够拼接,就能够将恶意的SQL语句拼接到定义好的SQL语句当中去,执行恶意SQL语句的一个执行效果,比如说,查询其他数据库当中的数据,这个时候后台定义好的SQL语句就直接变了,具体的效果就是在SQL语句当中体现了

SQL的注入点应该能够对后台的SQL语句进行重新定义,如果不能就无法被后台所执行

目标网站能够根据参数值,接收我们的数据,通过查询,把我们的数据进行显示。我们只要知道简单的SQL语句就可以了

SQL语句在定义的时候,没有变量的话,就相当于是死的,就不能够进行操作,不进行操作的时候,就不会产生新的SQL语句

当我在测试注入点的时候,输入单引号,他的响应与原包没有任何变化,说明这个点是写死的,后台的SQL语句没有接受我的payload,或者返回404,是因为输入的值,与存储在后台的值不一样,所以返回404的报错页面。这个时候,可以用and 1=1或 and 1=2,进一步判断,如果都返回404页面,那就说明测试点不是变量的输入值,如果返回的页面不一样,很有可能能够定义后台的SQL语句。如果返回的报错页面直接是SQL语句执行的结果,比如执行错误的结果,那恭喜你,百分百是SQL注入点,只是权限的大小

可控变量,对输入的参数值进行变化
带入数据库查询
要么是没有过滤或者是过滤的不严谨,可控变量处之所以会产生注入,是因为没有过滤或者过滤的不严谨,如果这个过滤的比较严谨或者严格,那就相当于没有注入点

MYSQL数据库

数据库A=网站A
表名
列名
数据
数据库B=网站B
。。。。。
数据库c=网站c
。。。。。

必要知识点

在MYSQL5.0以上版本中,mysql存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息。如果不通过information_schema只能靠猜

数据库中符号”."代表下一级,如shan.user表示shan数据库下的user表名

information_schema.tables: 记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name: 表名
column_name:列名
table_schema:数据库名

注入步骤

判断注入 >>猜解列名数量(字段数)

输入单引号对网站有影响,说明这个地方有注入;如果没有影响那应该没有注入,我说的有影响不是指网站返回404或者跳转到首页,如果出现这两种情况,说明这个网站对你的输入有检测,你被发现了,那当然就不存在SQL注入

当我们判断这个网站存在SQL注入的时候,我们就会进行手工注入,使用union,进行联合注入,用order by进行列名数量的猜解,这是为了更好的进行数据查询;order by 1,网页正常;order by 2网页正常;直到猜解到不正常,例如4正常,5不正常,说明当前注入点所使用的表有4列

这个时候,我们用union进行联合,-1 union select 1,2,3,4。让他报错出数据,然后在报出数据的地方进行联合查询

信息收集:
数据库版本:version() 5.7.22-0ubuntuo.16.04-1
数据库名字:database() mozhe Discuz_stormGroup
数据库用户:user() root@localhont
操作系统统: @@version_compile_os Linux

-1 union select 1,user(),@@version_compile_os,4

5.0以上是高版本,5.0以下是低版本

查询指定数据库mozhe_ Discuz_stormGroup下的表名信息:
http://xxx.xxx.xx.xxx:48354/new_list.php?id=-1 union select
1,table_nams,3,4 from information_schema.tables where table_schemam=‘mozhe_ Discuz_stormGroup’

查询指定数据库mozhe_ Discuz_stormGroup下所有的表名信息:
http://xxx.xxx.xx.xxx:48354/new_list.php?id=-1 union select
1,group_concat(table_name),3,4 from information_schema.tables where table_schemam=‘mozhe_ Discuz_stormGroup’

查询指定表名stormGroup_member下的列名信息:
http://219.153.49.228:48354/new list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_ name=‘stoxmGroup_member’

查询指定数据
http://219,153.49.228:48354/new list.php?id=-1 union select 1,name,password,4 from StormGroup_member

猜解多个数据可以采用limit x,1 变动猜解
http://219,153.49.228:48354/new list.php?id=-1 union select 1,name,password,4 from StormGroup_member limit 0,1

总结

现在后台都有过滤,人会累死的,而且这个案例的前提是,他是回显注入
在实战当中,我们要确定用户账号在那个表,然后再去那个表里面查询

这篇文章讲的是mysql注入,其它的数据库注入不是这么回事。在进行数据库注入之前,要先确认数据库的类型,注入是根据数据库类型来的,跟使用什么脚本是没有什么关系的,例如access注入、oracel注入

不同的数据库注入,方法是不一样的,这就是数据库注入非常复杂、非常难的原因,它的分类特别多,你只要那方面不理解,就不能学透

如果不是高权限注入。那我们只能进行数据注入,获取一些数据,如果数据库是低版本,那我们只能进行暴力查询,有时候会出现查询不到的情况

SQL 注入在概念上是如何工作的? (简要)[重复]

【中文标题】SQL 注入在概念上是如何工作的? (简要)[重复]【英文标题】:How do SQL injections conceptually work? (brief) [duplicate] 【发布时间】:2011-07-26 18:52:25 【问题描述】:

可能的重复:What is SQL injection?XKCD SQL injection - please explain

我拥有一家公司,并希望了解 PHP 的流行情况,同时我正在招聘人员来维护和扩展其网站的代码,我一直在关注 SQL 注入的安全性,但不太了解这些代码会如何影响SQL 数据库,因为它们包含在查询的字符串中。

如何显示安全漏洞,以便我亲眼看到正在发生的事情?

【问题讨论】:

阅读此secure.wikimedia.org/wikipedia/en/wiki/SQL_injection 并返回任何具体问题 What is SQL injection? 也可能重复,请在询问之前使用search。 【参考方案1】:

虽然大部分可以在网上解释,但我感觉要解释得更详细一点。

如果你能想象字符串会变成什么,你就会明白你正在编写的脚本的潜在风险,因为它会在实际运行之前变成其他东西。

一个简单的恶意示例:

$fromtheuser = "foo'; DROP TABLE affiliates; --";
$q = "SELECT id FROM affiliates WHERE website = '$fromtheuser'";

你能解释一下这会变成什么吗?开发商做不到。

"SELECT id FROM affiliates WHERE website = 'foo'; DROP TABLE affiliates; --'"

这个向量的关键部分是 '; 用于结束 SQL 字符串原语,--' 用于注释掉推送的引号。

您将在编写的代码中寻找的是,在将数据放入查询之前对其进行适当的清理和过滤。帮助保护这方面安全的一个重要工具是某种形式的准备好的查询,在这种情况下,您可以将参数绑定到查询,这样就没有什么可操作的了。

我们可以通过 MySQLi(改进的)或我个人最喜欢的 PDO 中的预处理语句来实现这一点。快速了解它们的外观。

mysql_real_escape_string(可以处理编码和引号)

<?php
$clean = mysql_real_escape_string($q)

MySQLi:

<?php
$clean = $mysqli->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bind_param('s', $website); //'s' for 'string'

PDO:

<?php
$clean = $pdo->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bindParam(1, $website); //you can use :site rather than ? and 1

【讨论】:

IMO 将参数数组传递给 PDO 的 execute() 方法比使用单独的函数调用绑定参数更简洁。 (通过,chriso的例子更好)【参考方案2】:
mysql_query("SELECT * FROM users WHERE username = '$username'");

看看当我们将 $username 变量设置为讨厌的东西时会发生什么:

$username = "' OR 1";

查询变为:

SELECT * FROM users WHERE username = '' OR 1

攻击者可以使用不正确转义的变量将 SQL 注入到您的查询中,从而有效地绕过您现有的任何(较差的)安全措施。

更多信息here

【讨论】:

【参考方案3】:

还值得注意的是,您可以通过一些工具测试您的网站是否容易受到注入攻击。

看看

http://sqlmap.sourceforge.net/

【讨论】:

我会看看这个,可能是一个很好的学习体验。【参考方案4】:

危险来自事实,即 SQL 查询是程序。 因此,可以注入恶意代码来代替某些操作员。

    字符串由引号分隔。如果字符串中的分隔符没有被转义,它实际上会关闭字符串语句,其余的将是恶意代码。

    不仅字符串是动态的。如果 $amount 包含恶意代码以及ORDER BY $order,则没有分隔符将保护LIMIT $amount

【讨论】:

谢谢,这很有趣!

以上是关于简要MYSQL注入的主要内容,如果未能解决你的问题,请参考以下文章

SQL注入入门

MySQL SQL 注入

MySQL 及 SQL 注入

SQL注入之MySQL常用的查询语句

sql注入mysql篇

sql注入--mysql