SqL注入攻击实践

研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究

缓冲区溢出原理

缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。

原理

  • 针对mysql数据库

    check_connection (sql_parse.cc):

    /

    Old clients send null-terminated string as password; new clients send

    the size (1 byte) + string (not null-terminated). Hence in case of

    empty

    password both send ‘\0‘.

    /

    uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ?

    passwd++ : strlen(passwd);

    在‘client capabilities‘标记中提供0x8000,用户可以指定passwd_len字段的值。要利用漏洞攻击选择0x14(20)作为值,因为它等于SHA HASH长度,可以通过认识过程中的检查。

    在通过几个用于确保用户来自许可主机的检查后,认证过程就会进入如下代码:

    / check password: it should be empty or valid /

    if (passwd_len == acl_user_tmp->salt_len)

    {

    if (acl_user_tmp->salt_len == 0 ||

    acl_user_tmp->salt_len == SCRAMBLE_LENGTH &&

    check_scramble(passwd, thd->scramble, acl_user_tmp->salt) == 0 ||

    check_scramble_323(passwd, thd->scramble,

    (ulong ) acl_user_tmp->salt) == 0)

    {

    acl_user= acl_user_tmp;

    res= 0;

    }

    }

    check_scramble函数会返回认证失败,但查看check_scramble_323函数我们可以看到:

    my_bool

    check_scramble_323(const char scrambled, const char message,

    ulong hash_pass)

    {

    struct rand_struct rand_st;

    ulong hash_message[2];

    char buff[16],to,extra; /* Big enough for check /

    const char pos;

    hash_password(hash_message, message, SCRAMBLE_LENGTH_323);

    randominit(&rand_st,hash_pass[0] ^ hash_message[0],

    hash_pass[1] ^ hash_message[1]);

    to=buff;

    for (pos=scrambled ; pos ; pos++)

    to++=(char) (floor(my_rnd(&rand_st)31)+64);

    extra=(char) (floor(my_rnd(&rand_st)31));

    to=buff;

    while (scrambled)

    {

    if (scrambled++ != (char) (to++ ^ extra))

    return 1; / Wrong password */

    }

    return 0;

    }

    在这里,使用零长度的scrambled串可绕过验证,在函数最后的比较中如果scrambled串没有字符,使函数返回‘0‘,允许用户以零长度字符串绕过验证。

    另外基于堆栈的缓冲区buff可以被超长的scrambled串溢出,缓冲区被从my_rnd()函数输出的字符溢出,字符范围是0x40..0x5f,在部分平台下可能可以导致任意代码执行。

  • Oracle数据库服务器登录长用户名缓冲区溢出漏洞

    ORACLE数据库服务程序在拷贝用户名外部数据到本地内存缓冲区时没有进行充分边界检查,远程攻击者可以利用这个漏洞对数据库进行缓冲区溢出攻击,可能以Oracle进程权限在系统上执行任意指令。

    Oracle数据库服务程序中处理验证请求部分的代码存在远程可利用缓冲区溢出,通过传递超长用户名给服务程序,远程攻击者可以触发基于栈的溢出,精心构建用户名数据可能以Oralce进程权限在系统上执行任意指令,在Linux/Unix系统上为"Oracle"权限,而在Windows系统下Local System权限。

    多数Oracle的客户端应用程序会截断超长的用户名再提供给数据库,因此攻击者需要写自己的验证客户端来利用这个漏洞。不过NGSSoftware发现有一个客户端工具LOADPSP可以允许超长用户名输入,用户可以用来进行测试,工具在Oracle安装目录下的"bin"目录下。

    针对不同数据类型,研究SQL注入点的发现与注入技术

  1. 数字型注入点

    形如“http://****?ID=55”,这类注入的参数是“数字”,因此称为“数字型注入点”。

    此类注入点提交的SQL语句,其原形大致为:Select * from 表名 where 字段=55

    当我们提交注入参数为“http://****?ID=55 And[查询条件]”时,向数据库提交的完整 SQL 语句为:

    Select * from 表名 where 字段=55 And [查询条件]

  2. 字符型注入点

    形如“http://****?Class=日期”这类注入的参数是“字符”,因此称为“字符型”注入点。

    此类注入点提交的 SQL 语句,其原形大致为:

    select * from 表名 where 字段=‘日期‘

    当我们提交注入参数为“http://****Class=日期 And[查询条件]时,向数据库提交的完整 SQL 语句为”:

    select * from 表名 where 字段=‘日期‘ and [查询条件]

  3. 搜索型注入点

    这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示的链接地址,而是直接通过搜索框表单提交。

    此类注入点提交的 SQL 语句,其原形大致为:

    select * from 表名 where 字段 like ‘%关键字%‘

    当我们提交注入参数为“keyword=‘and[查询条件] and ‘%‘=‘,则向数据库提交的完事SQL语句为:

    select * from 表名 where 字段 like ‘%‘ and [查询条件] and ‘%‘=‘%‘

    研究缓冲区溢出的防范方法,至少针对两种编程语言进行差异化研究

    根据缓冲区溢出攻击的步骤,可将常用的缓冲区溢出攻击检测技术分为以下3 种类型:基于输入字符串的检测方法,基于保护堆栈中的返回地址的检测方法和基于监视系统调用的检测方法

  • 基于输入字符串的检测方法

    对输入的字符串进行检测,确定其为溢出攻击字符串时采取阻拦措施,使攻击者无法注入攻击代码。一般有以下3 种方法构建溢出攻击字符串

    第1 种溢出攻击字符串适用于缓冲区大于ShellCode 长度的情况;第2 种溢出攻击字符串一般用于缓冲区小于ShellCode 长度的情况;第3 种方法是将ShellCode 放在环境变量里,是目前较为常用的方法。

  • 基于保护堆栈中返回地址的检测方法

    缓冲区溢出攻击最关键的步骤是要通过修改函数返回地址来改变程序的流程,因此,在函数调用返回前,通过检查返回地址是否被修改可以判断是否有缓冲区溢出攻击发生。

    缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。 目前有三种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响: 1、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码; 2、强制写正确的代码的方法; 3、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。

    数据库注入工具

  • sqlmap
  1. sqlmap.py -u "http://www.XXX.com/index.asp?id=1"

      判断id参数是否存在注入:结果中包含 “id” is Vulnerable 字段表示存在注入

      存在注入,下面的步骤才可以执行成功~

  2. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --dbs

      列举能列出的所有数据库名

  3. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --current-db

      列出当前使用的数据库名,假设列出“sqltest”数据库  

  4. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" --is-dba

      判断该注入点是否有管理员权限:返回true 表示是管理员

  5. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" --tables

      获取sqltest中的所有表,假设有"admin"表

  6. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" -T "admin" --columns

      列举表admin的字段(列名),假设存在"username","password"字段

  7. sqlmap.py -u "http://www.XXX.com/index.asp?id=1" -D "sqltest" -T "admin" -C "username,password" --dump

      下载字段username,password的值,若询问是否破解md5加密,选择no即可

      至此,对一个简单的注入点(GET方式),现在就已经得到了我们想要的数据

    【*】注入demo之后会补上截图

  • 超级sql注入

    超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入。

    超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具。

    超级SQL注入工具支持自动识别SQL注入,并自动配置,如程序无法自动识别,还可人工干预识别注入,并标记注入位置。

    超级SQL注入工具支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入。

    超级SQL注入工具支持Bool型盲注、错误显示注入、Union注入等方式获取数据。

    超级SQL注入工具支持Access、MySQL5以上版本、SQLServer、Oracle等数据库。

    超级SQL注入工具支持手动灵活的进行SQL注入绕过,可自定义进行字符替换等绕过注入防护。

    超级SQL注入工具支持批量扫描SQL注入漏洞,可导入域名爬行一次链接后扫描,采用相似度算法,漏洞、误报率低于1%。

原文地址:https://www.cnblogs.com/blankicefire/p/9063073.html

时间: 2024-11-05 16:29:44

SqL注入攻击实践的相关文章

2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践

第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统定义好了.向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理. 参见这篇博客缓冲区溢出攻击 1.2 oracle数据库 针对Oracle数据库缓冲区溢出攻击的研究 1.3 mysql数据库

SQL 注入攻击

一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试.这是安全评估的一个部分,所以尽管我们之前没有使用过SQL注入来渗透网络,但对其概念也相当熟悉了.最后我们在这项任务中大获成功,现在来回顾一下这个过程的每一步,将它记录为一个案例. "SQL注入"是一种利用未过滤/未审核用户输入的攻击方法("缓存溢出"和这个不同),意思就是让应用运行本不应该运行的SQL代码.如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果. 我们记录下

实例讲解 SQL 注入攻击

一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试.这是安全评估的一个部分,所以尽管我们之前没有使用过SQL注入来渗透网络,但对其概念也相当熟悉了.最后我们在这项任务中大获成功,现在来回顾一下这个过程的每一步,将它记录为一个案例. “SQL注入”是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码.如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果. 我们记录下了在多次错误的转折后经历的曲折

SQL注入攻击实例

一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试.这是安全评估的一个部分,所以尽管我们之前没有使用过SQL注入来渗透网络,但对其概念也相当熟悉了.最后我们在这项任务中大获成功,现在来回顾一下这个过程的每一步,将它记录为一个案例. 我们记录下了在多次错误的转折后经历的曲折过程,而一个更有经验的人会有这不同的 - 甚至更好的 - 方法.但事实上我们成功以后才明白,我们并没有完全被误导. 其他的SQL文章包含了更多的细节,但是这篇文章不仅展示了漏洞利用的过程,还讲述了发现漏洞的原理

web前端安全之SQL注入攻击

一.SQL注入攻击的原理攻击者在HTTP请求中注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 select * from user where name = 'camille' and password = '' or '1'='1' 不管用户名和密码是什么,查询出来的用户列表都不为空,这样可以随意看其他用户的信息. 二.SQL注入攻击的防御1.客户端 限制字符串输入的长度: 有效性检验. //过

【渗透攻防Web篇】SQL注入攻击高级

前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 5.1.大小写变种 5.2.URL编码 5.3.SQL注释 5.4.空字节 5.5.二阶SQL注入 第六节 探讨SQL注入防御技巧 6.1.输入验证 6.2.编码输出 正文 第五节 避开过滤方法总结 Web应用为了防御包括SQL注入在内的攻击,常常使用输入过滤器,这些过滤器可以在应用的代码中,也可以

使用SQLMAP对网站和数据库进行SQL注入攻击

from:http://www.blackmoreops.com/2014/05/07/use-sqlmap-sql-injection-hack-website-database/ 0x00 背景介绍 1. 什么是SQL注入? SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,比如将恶意的SQL代码注入到特定字段用于实施拖库攻击等.SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL

网络攻防之SQL注入攻击

SQL注入攻击的根源是因为SQL规范的漏洞,但是,因为规范的长期存在以及使用,几乎已经不太可能去修改规范了,只能够从开发者本身去避免攻击,虽然SQL注入之前很严重,但现在相对控制的很好,这里仅仅作为一种学习的内容. 测试过程如下: 1:搭建PHP,mysql开发环境,可以详见我的另一篇博客自定义开发PHP环境 2:添加数据库,表,以及表内容. 3:分别测试 万能密码,万能用户名 数字注入 测试如下: 万能密码:password ' or 1='1 (password可以任意的填写,注:这里如果粘

Web安全篇之SQL注入攻击

在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问题~ 大家早上好!今天由我给大家带来<web安全之SQL注入篇>系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:       第一讲:"纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理.":       第二讲:"实战演练:我们要在互联网上