邮给我一个密码

我们意识到虽然不能添加一条新的记录在members表中,但我们可以通过修改一个存在的记录, 这也获得了我们的证明是可行的。

从先前的步骤中,我们知道bob@example.com在系统中有一个帐号,我们使用SQL注入更新了他的数据库记录为我们的邮件地址:

  1. SELECT email, passwd, login_id, full_name
  2. FROM members
  3. WHERE email = 'x'; UPDATE members SET email = 'steve@unixwiz.net' WHERE email = 'bob@example.com';

运行这个之后,我们当然会收到"we didn't know your email address"消息,但这是预期的提供了不正确的邮件地址。UPDATE操作并不会向应用程序通知, 因此他被悄然执行了。

我们可以用更新后的邮件地址,使用常规的"I lost my password"链接 - 一分钟后就会受到这样的邮件:

  1. From: system@example.com
  2. To: steve@unixwiz.net
  3. Subject: Intranet login
  4. This email is in response to your request for your Intranet log in information.
  5. Your User ID is: bob
  6. Your password is: hello

现在,就可以使用标准的登录流程进入系统,作为一个高等级的职员。这是一个高权限用户,远远高于我们INSERT创建的受限用户。

我们发现这个内网站点的信息比较全,甚至还有一个全用户列表。所以我们可以合理的推测很多内网站点会有公司Windows网络帐号,并且用的是同样的密 码。目前我们很明显可以拿到内网的用户密码,而且我们在公司防火墙找到了一个开放的PPTP模式的的VPN端口让我们很方便的做些登陆尝试。

我们手动抽查了一些帐号,没成功。而且不知道到底服务端是因为“错误的密码”还是“内网帐号和Windows帐号不同”而拒绝登陆的。反正就是个没干成。不过我嚼得自动化的工具应该能让这步简单点。

其他一些方法

在这次渗透中,我们觉得其实已经挖的足够深了,不过还可以用其他的方法。我们就先看看我们现在想到一些普适性不是很高的方法。

我们同时也注意到了不是所有的方法都是数据库无关的,有些方法得依赖特定的数据库。

调用XP_CMDSHELL

Microsoft的SQL Server 有一个存储过程 “XP_CMDSHELL” 允许执行任意的操作系统命令,如果这项功授权给Web用户调用的话,那基本上网站肯定会遭黑。我们现在干的都被限制在了Web应用和数据库这个环境下,一 旦能执行操作系统命令,防御再好的应用服务器也没辙了。调用这个存储过程的权限一般会赋给管理员帐号,但是还是存在授权给低级别用户的可能。

数据库结构深度挖掘

这个应用登陆后能干的事太多了,在我看来实在没啥必要再去挖了。不过在其他一些特殊的环境下我们的这些方法也许不够用。如果能深度挖掘数据库的结构,我们 会发现更多的方法来黑掉站点。你可以试着看看其他的提交切入点(例如“留言板”,“帮助论坛”等等)。不过这都是对应用环境的强依赖而且还得靠有一定技术 含量的瞎蒙。

减轻危害

我们相信web应用的开发者,通常不会去想那些“令人意外的输入”,但是安全人员会(包括那些“坏人”),所以这里有三个宽泛的方法,可以用来除害。

过滤输入,这是绝对重要的事情,过滤用户的输入,从而确保他们的输入没有包含具有威胁的代码,无论是对于SQL服务器,或则是HTML本身都要考虑。某人 最初的想法来剥掉“恶意代码”,例如引号,分号或者是转义符号,其实这种尝试是被误导了的。尽管找出来些具有威胁的字符很容易,但是很难把他们全部找到。 web的语言种到处都是特定的字符以及奇特的组合(包括那些用来表达同一些字符的另类模式),而努力去鉴定那些没有被授权的“恶意代码”很可能不会成功。 换而言之,与其“除去那些已知的恶数据”,倒不如“去掉所有良好数据之外所有的内容”:这其中的分别是至关重要。如前 - 我们的例子中 - 一个电子邮件地址仅能包括以下字符:

  1. abcdefghijklmnopqrstuvwxyz
  2. ABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. 0123456789
  4. @.-_+

用没有意义的文字是不益的,应该早点拒绝这么做,这可能会产生一些错误信息,这样不仅可以帮助我们抢先SQL注入,而且可以让我们及时发现拼写错误以至于不会让错误存入数据库。

  电子邮件的一些选项

我们应该要特别的注意邮件地址,它会给验证编程带来麻烦的,因为,每个人看起来对邮件地址的“有效性”都有自己的想法,不用一个好的邮箱地址是不光彩的,这样你将遇到你想不到的文字。

这方面的真正权威是RFC 2822(比大家耳熟能详RFC822内容还多),里面包含了什么是允许的比较范的定义。如果邮箱地址接受&和*(和其它普通字符比较)是不好的,但是其它的,包括这篇文章的作者,都会对“大多数”邮件地址满意。

那些采用严格方法的人应该充分的认识到不包括这些邮件地址的后果,特别是认为现在有很好的技术能够解决那些“奇怪”的字符所带来的安全问题。

请注意“过滤输入”并不意味着“移除引号”,因为即使一个“正规”的字符也会很麻烦,在这个例子中,一个整型数字ID值被拿来和用户的输入做比较(叫数字型PIN):

  1. SELECT fieldlist FROM table WHERE id = 23 OR 1=1;  -- Boom! Always matches!

不过实际情况是我们很难把输入项完全过滤掉潜在危险字符。“日期项”,“邮件地址”,或者“整形” 用上面的办法过滤是可以的。但是在真实环境中我们,我们还得用到其他的方法。

输入项编码/转义

虽然现在可以过滤邮件地址或者电话号码,但是貌似“Bill O‘Reilly” 这样的合法的名字你是很难处理的,因为“ ’ ” 这个单引号是合法的输入。于是有人就想到在过滤到单引号的时候我再加一个单引号这样就没问题了,其实这么干得出大事。

  1. SELECT fieldlist FROM customers
  2. WHERE name = 'Bill O''Reilly';  -- 目前这样是OK的

但是,这个方法很容易就被绕过去了。像MySQL允许 \' 这个输入,然后如果有人造一段SQL “ \'; DROP TABLE users;” ,你又给单引号加了个单引号,那就变成

  1. SELECT fieldlist FROM customers
  2. WHERE name = '\''; DROP TABLE users; --';  -- 删表了

' \' '就被新加的单引号分成一个字符串(按照前面的过滤方法这里判断有一个单引号,所以过滤后再单引号后面加一个单引号),后面接的是常见的SQL恶意代码。 其实不仅仅有反斜线的情况,还有Unicode编码和其他编码规则或者其他的过滤漏洞都会给程序员挖坑。俺们都知道,实现输入过滤的绝对安全是超级难滴, 这就是为啥很多数据库接口都提供了相关功能。当同样的内容被系统自带的字符串过滤或字符串编码处理后会好很多。例如调用MySQL的函数 mysql_real_escape_string() 或者 perl  DBD 的$dbh->quote($value)方法. 这些方法都必用的。

SQL注入(三)的更多相关文章

  1. 避免SQL注入三慷慨法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangyy130/article/details/26154837       要说SQL注入还要从 ...

  2. WEB 安全之 SQL注入 < 三 > 提权

    SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果能清楚了解 攻击的全 ...

  3. 常见的网络攻击(XSS,SQL注入,CSRF)

    一.XSS 二.SQL注入 三.CSRF

  4. Python--day46--mysql存储过程(不常用)(包含防sql注入)

    一.存储过程: 优点:只要传很少的数据到数据库就可以了  缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...

  5. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  6. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击

    第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...

  7. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入

    一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...

  8. SQL注入过WAF(11.4 第三十三天)

    WAF是什么? Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).也叫Web防火墙,主要是对Web特有入侵方式的加强防护,如D ...

  9. DVWA(三):SQL injection 全等级SQL注入

    (本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...

随机推荐

  1. 使用Windows2003创建AD服务器 - 进阶者系列 - 学习者系列文章

    Windows 2003的AD功能不是很强,但是还是提供了不错的功能.下面简要介绍下Windows 2003的AD配置说明. 1.  从添加删除Windows组件安装AD功能项 2.  完成安装.这里 ...

  2. SQL SERVER2005 excel float导入

    接到mission:将一堆excel的东西导入到SQL SERVER2005 命令很easy SELECT * INTO XLImport3 FROM OPENDATASOURCE('Microsof ...

  3. return 使用和闭包

    1.return 使用 案例一: var a=1; for(var b=0; b<10; b++){ return b; }; sonsole.log(b)//返回为空 个人认为此处左右与为全局 ...

  4. JQUERY 插件开发——MENU(导航菜单)

    JQUERY 插件开发——MENU(导航菜单) 故事背景:由于最近太忙了,已经很久没有写jquery插件开发系列了.但是凭着自己对这方面的爱好,我还是抽了一些时间来过一下插件瘾的.今天的主题是导航菜单 ...

  5. Random随机数

    Random类的常用方法 方法 备注 Int nextInt() 返回一个int类型的随机数 Int nextInt(n) 返回一个0到n之间的数,不包括n Double nextDouble() 返 ...

  6. HAProxy+apache实现web服务动静分离

    HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支 ...

  7. 基于嵌入式OS的任务设计-----任务划分

    在<前后台系统VS嵌入式OS,何时该上OS?>一文中介绍了何时应该将OS应用于嵌入式设计中,本文将介绍基于OS的任务设计,一般来说,应用程序设计包括两个方面,一个是业务逻辑的设计,另一个是 ...

  8. uva 10054 The Necklace(欧拉回路)

    The Necklace  My little sister had a beautiful necklace made of colorful beads. Two successive beads ...

  9. hdu 1239 Calling Extraterrestrial Intelligence Again (暴力枚举)

    Calling Extraterrestrial Intelligence Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  10. linux的运行级别

    一.linux共有七种运行级别,内容如下: 级别0:停机状态,系统默认运行级别如果设为0,将不能正常启动: 级别1:单用户模式,只允许root用户对系统进行维护: 级别2:多用户模式,但没有NFS(h ...