注册忘记密码

黑客论坛,黑客工具,黑客教程,QQ技术,黑客基地,黑客网络,黑客软件,黑客联盟,免杀,远控,ddos,cc,黑客攻防,黑客编程,黑客定位,手机定位,微信定位,hack,黑客网站,查开房,定位,信息查询

查看: 11970|回复: 0

[网络安全] 多个提交处理不当不安全的数据库配置导致黑客SQL 注入

[复制链接]
   0 UID
   0帖子
   0精华
21
   0威望
500
   0金币
46336
   0贡献
5000
   0阅读权限
   200
   积分
   0
   在线时间
   619 小时
   最后登录
   2020-8-9
发表于 2020-1-9 23:00:08 | 显示全部楼层 |阅读模式
   白名单(white listing)是一种除了白名单中的字符外,禁止使用其他字符的技术。用于验证输入的白名单方法是指为特定输入创建一个允许使用的字符列表,这样列表外的其他字符均会遭到拒绝。建议使用与黑名单(black list)正好相反的白名单方法。黑名单(black listing)是一种除了黑名单中的字符外,其他字符均允许使用的技术。用于验证输入的黑名单方法是指创建能被恶意使用的所有字符及其相关编码的列表并禁止将它们作为输入。现实中存在非常多的攻击类型,它们能够以多种方式呈现,要想有效维护这样一个列表是一项非常繁重的任务。使用不可接受字符列表的潜在风险是:定义列表时很可能会忽视某个不可接受的字符或者忘记该字符一种或多种可选的表示方式。
   大型Web 开发项目会出现这样的问题:有些开发人员会遵循这些建议并对输入进行验证,而其他开发人员则不以为然。对于开发人员、团队甚至公司来说,彼此独立工作的情形并不少见,很难保证项目中的每个人都遵循相同的标准。例如,在评估应用的过程中,经常会发现几乎所有输入均进行了验证,但坚持找下去的话,就会发现某个被开发人员忘记验证的输入。应用程序开发人员还倾向于围绕用户来设计应用,他们尽可能使用预期的处理流程来引导用户,认为用户将遵循他们已经设计好的逻辑顺序。例如,当用户已到达一系列表单中的第三个表单时,他们会期望用户肯定已完成了第一个和第二个表单。但实际上,借助直接的URL乱序来请求资源,能够非常容易地避开预期的数据流程。以下面这个简单的应用为例:
// 处理表单1
if ($_GET["form"] = "form1"{
//参数是否是一个字符串?
if (is_string($_GET["param"])) {
//获取字符串的长度并检查是否在指定的范围内?
if (strlen($_GET["param"]) < $max){
//将字符串传递给一个外部校验函数
$bool = validate(input_string , $_GET["param"]);
if ($bool = true) {
//继续处理
}
}
}
}
//处理表单2
if ($_GET["form"] = "form2"){
//由于第一个表单已经验证过参数,因为这里无须再验证参数
$SQL = "SELECT * FROM TABLE WHERE ID = $_GET["param"]";
//执行SQL 语句
$result = mysql_query($SQL);
//检查从数据库返回了多少条记录
$rowcount = mysql_num_rows($result);
$row = 1;
//迭代返回的记录集
while ($db_field = mysql_fetch_assoc($result)) {
if ($row <= $rowcount) {
print $db_field[$row] . "<BR>";
$row++;
}
}
}
    由于第一个表单已经进行过输入验证,因此该应用程序的开发人员没有想到第二个表单也需要验证输入。网络黑客攻击者将直接调用第二个表单而不使用第一个表单,或是简单地向第一个表单提交有效数据,然后操纵要向第二个表单提交的数据。下面的第一个URL 会失败,因为需要验证输入。第二个URL 则会引发成功的SQL 注入攻击,因为输入未作验证:
[1] http://www.victim.com/form.php?form=form1&param=' SQL Failed --
[2] http://www.victim.com/form.php?form=form2&param=' SQL Success --
可以使用很多方法来减少可修改的访问、可被窃取或操纵的数据量、互联系统的访问级别以及SQL 注入攻击导致的破坏。保证应用代码的安全是首要任务,但也不能忽视数据库本身的安全。数据库带有很多默认的用户预安装内容。SQL Server 使用声名狼藉的“sa”作为数据库系统管理员账户,MySQL 使用“root”和“anonymous”用户账户,Oracle 则在创建数据库时通常默认会创建SYS、SYSTEM、DBSNMP 和OUTLN 账户。这些并非全部的账户,只是比较出名的账户中的一部分,还有很多其他账户。其他账户同样按默认方式进行预设置,口令
众所周知。
    有些系统和数据库管理员在安装数据库服务器时允许以root、SYSTEM 或Administrator特权系统用户账户身份执行操作。应该始终以普通用户身份(尽可能位于更改根目录的环境中)
运行服务器(尤其是数据库服务器)上的服务,以便在数据库遭到成功攻击后可以减少对操作系统和其他进程的潜在破坏。不过,这对于Windows 下的Oracle 却是不可行的,因为它必须以
SYSTEM 权限运行。每一种类型的数据库服务器都施加了自己的访问控制模型,它们为用户账户分配多种权限来禁止、拒绝、授权、支持数据访问和(或)执行内置存储过程、功能或特性。不同类型的数据库服务器默认还支持通常超出需求但能够被攻击者修改的功能(xp_cmdshell、OPENROWSET、LOAD_FILE、ActiveX 以及Java 支持等)。第4 章到第7 章将详细介绍利用这些功能和特性的攻击。
    应用开发人员在编写程序代码时,通常使用某个内置的权限账户来连接数据库,而不是根据程序需要来创建特定的用户账户。这些功能强大的内置账户可以在数据库上执行很多与程序
需求无关的操作。当攻击者利用应用中的SQL 注入漏洞并使用授权账户连接数据库时,他可以在数据库上使用该账户的权限执行代码。Web 应用开发人员应与数据库管理员协同工作,以
保证程序的数据库访问在最低权限模型下运行,同时应针对程序的功能性需求适当地分离授权角色。
     理想情况下,应用还应使用不同的数据库用户来执行SELECT、UPDATE、INSERT 及类似的命令。这样一来,即使攻击者成功将代码注入易受攻击的语句,为其分配的权限也是最低的。由于多数应用并未进行权限分离,因此攻击者通常能访问数据库中的所有数据,并且拥有SELECT、INSERT、UPDATE、DELETE、EXECUTE 及类似的权限。这些过高的权限通常允许黑客攻击者在数据库间跳转,访问超出程序数据存储区的数据。
     不过,要实现上述目标,攻击者需要了解可以获取哪些附加内容、目标机器安装了哪些其他数据库、存在哪些其他的表以及哪些有吸引力的字段!攻击者在利用SQL 注入漏洞时,通常会尝试访问数据库的元数据。元数据是指数据库内部包含的数据,比如数据库或表的名称、列的数据类型或访问权限。有时也使用数据字典和系统目录等其他项来表示这些信息。MySQL服务器(5.0 及之后的版本)的元数据位于INFORMATION_SCHEMA虚拟数据库中,可通过SHOWDATABASES 和SHOW TABLES 命令访问。所有MySQL 用户均有权访问该数据库中的表,但
只能查看表中那些与该用户访问权限相对应的对象的行。SQL Server 的原理与MySQL 类似,可通过INFORMATION_SCHEMA 或系统表(sysobjects、sysindexkeys、sysindexes、syscolumns、systypes 等)及(或)系统存储过程来访问元数据。SQL Server 2005 引入了一些名为“sys.*”的目录视图,并限制用户只能访问拥有相应访问权限的对象。所有的SQL Server 用户均有权访问数据库中的表并可以查看表中的所有行,而不管用户是否对表或所查阅的数据拥有相应的访问权限。
    Oracle 提供了很多全局内置视图来访问Oracle 的元数据(ALL_TABLES、ALL_TAB_COLUMNS等)。这些视图列出了当前用户可访问的属性和对象。此外,以USER_开头的视图只显示当前
用户拥有的对象(例如,更加受限的元数据视图);以DBA_开头的视图显示数据库中的所有对象(例如,用于数据库示例且不受约束的全局元数据视图)。DBA_元数据函数需要有数据库管
理员(DBA)权限。下面是这些语句的示例:
--Oracle 语句,列举当前用户可访问的所有表
SELECT OWNER, TABLE_NAME FROM ALL_TABLES ORDER BY TABLE_NAME;
--MySQL 语句,列举当前用户可访问的所有表和数据库
SELECT table_schema, table_name FROM information_schema.tables;
--MSSQL 语句,使用系统表列举所有可访问的表
SELECT name FROM sysobjects WHERE xtype = 'U';
-- MSSQL 语句,使用目录视图列举所有可访问的表
SELECT name FROM sys.tables;
要隐藏或取消对MySQL 数据库中INFORMATION_SCHEMA 虚拟数据库的访问是不可能的,也不可能隐藏或取消对Oracle 数据库中数据字典的访问(因为它是一个视图)。可以通过修改视图来对访问加以约束,但Oracle 不提倡这么做。在Microsoft SQL Server 数据库之中,可以取消对INFORMATION_SCHEMA、system 和sys.*表的访问,但这样会破坏某些功能并导致
部分与数据库交互的应用出现问题。更好的解决办法是为应用的数据库访问运行一个最低权限模型,并针对程序的功能性需求适当地分离授权角色。

发表回复

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则


快速回复 返回顶部 返回列表