SQL注入(三)
邮给我一个密码
我们意识到虽然不能添加一条新的记录在members表中,但我们可以通过修改一个存在的记录, 这也获得了我们的证明是可行的。
从先前的步骤中,我们知道bob@example.com在系统中有一个帐号,我们使用SQL注入更新了他的数据库记录为我们的邮件地址:
- SELECT email, passwd, login_id, full_name
- FROM members
- 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"链接 - 一分钟后就会受到这样的邮件:
- From: system@example.com
- To: steve@unixwiz.net
- Subject: Intranet login
- This email is in response to your request for your Intranet log in information.
- Your User ID is: bob
- Your password is: hello
现在,就可以使用标准的登录流程进入系统,作为一个高等级的职员。这是一个高权限用户,远远高于我们INSERT创建的受限用户。
我们发现这个内网站点的信息比较全,甚至还有一个全用户列表。所以我们可以合理的推测很多内网站点会有公司Windows网络帐号,并且用的是同样的密 码。目前我们很明显可以拿到内网的用户密码,而且我们在公司防火墙找到了一个开放的PPTP模式的的VPN端口让我们很方便的做些登陆尝试。
我们手动抽查了一些帐号,没成功。而且不知道到底服务端是因为“错误的密码”还是“内网帐号和Windows帐号不同”而拒绝登陆的。反正就是个没干成。不过我嚼得自动化的工具应该能让这步简单点。
其他一些方法
在这次渗透中,我们觉得其实已经挖的足够深了,不过还可以用其他的方法。我们就先看看我们现在想到一些普适性不是很高的方法。
我们同时也注意到了不是所有的方法都是数据库无关的,有些方法得依赖特定的数据库。
调用XP_CMDSHELL
Microsoft的SQL Server 有一个存储过程 “XP_CMDSHELL” 允许执行任意的操作系统命令,如果这项功授权给Web用户调用的话,那基本上网站肯定会遭黑。我们现在干的都被限制在了Web应用和数据库这个环境下,一 旦能执行操作系统命令,防御再好的应用服务器也没辙了。调用这个存储过程的权限一般会赋给管理员帐号,但是还是存在授权给低级别用户的可能。
数据库结构深度挖掘
这个应用登陆后能干的事太多了,在我看来实在没啥必要再去挖了。不过在其他一些特殊的环境下我们的这些方法也许不够用。如果能深度挖掘数据库的结构,我们 会发现更多的方法来黑掉站点。你可以试着看看其他的提交切入点(例如“留言板”,“帮助论坛”等等)。不过这都是对应用环境的强依赖而且还得靠有一定技术 含量的瞎蒙。
减轻危害
我们相信web应用的开发者,通常不会去想那些“令人意外的输入”,但是安全人员会(包括那些“坏人”),所以这里有三个宽泛的方法,可以用来除害。
过滤输入,这是绝对重要的事情,过滤用户的输入,从而确保他们的输入没有包含具有威胁的代码,无论是对于SQL服务器,或则是HTML本身都要考虑。某人 最初的想法来剥掉“恶意代码”,例如引号,分号或者是转义符号,其实这种尝试是被误导了的。尽管找出来些具有威胁的字符很容易,但是很难把他们全部找到。 web的语言种到处都是特定的字符以及奇特的组合(包括那些用来表达同一些字符的另类模式),而努力去鉴定那些没有被授权的“恶意代码”很可能不会成功。 换而言之,与其“除去那些已知的恶数据”,倒不如“去掉所有良好数据之外所有的内容”:这其中的分别是至关重要。如前 - 我们的例子中 - 一个电子邮件地址仅能包括以下字符:
- abcdefghijklmnopqrstuvwxyz
- ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 0123456789
- @.-_+
用没有意义的文字是不益的,应该早点拒绝这么做,这可能会产生一些错误信息,这样不仅可以帮助我们抢先SQL注入,而且可以让我们及时发现拼写错误以至于不会让错误存入数据库。
| 电子邮件的一些选项 |
我们应该要特别的注意邮件地址,它会给验证编程带来麻烦的,因为,每个人看起来对邮件地址的“有效性”都有自己的想法,不用一个好的邮箱地址是不光彩的,这样你将遇到你想不到的文字。
这方面的真正权威是RFC 2822(比大家耳熟能详RFC822内容还多),里面包含了什么是允许的比较范的定义。如果邮箱地址接受&和*(和其它普通字符比较)是不好的,但是其它的,包括这篇文章的作者,都会对“大多数”邮件地址满意。
那些采用严格方法的人应该充分的认识到不包括这些邮件地址的后果,特别是认为现在有很好的技术能够解决那些“奇怪”的字符所带来的安全问题。
请注意“过滤输入”并不意味着“移除引号”,因为即使一个“正规”的字符也会很麻烦,在这个例子中,一个整型数字ID值被拿来和用户的输入做比较(叫数字型PIN):
- SELECT fieldlist FROM table WHERE id = 23 OR 1=1; -- Boom! Always matches!
不过实际情况是我们很难把输入项完全过滤掉潜在危险字符。“日期项”,“邮件地址”,或者“整形” 用上面的办法过滤是可以的。但是在真实环境中我们,我们还得用到其他的方法。
输入项编码/转义
虽然现在可以过滤邮件地址或者电话号码,但是貌似“Bill O‘Reilly” 这样的合法的名字你是很难处理的,因为“ ’ ” 这个单引号是合法的输入。于是有人就想到在过滤到单引号的时候我再加一个单引号这样就没问题了,其实这么干得出大事。
- SELECT fieldlist FROM customers
- WHERE name = 'Bill O''Reilly'; -- 目前这样是OK的
但是,这个方法很容易就被绕过去了。像MySQL允许 \' 这个输入,然后如果有人造一段SQL “ \'; DROP TABLE users;” ,你又给单引号加了个单引号,那就变成
- SELECT fieldlist FROM customers
- WHERE name = '\''; DROP TABLE users; --'; -- 删表了
' \' '就被新加的单引号分成一个字符串(按照前面的过滤方法这里判断有一个单引号,所以过滤后再单引号后面加一个单引号),后面接的是常见的SQL恶意代码。 其实不仅仅有反斜线的情况,还有Unicode编码和其他编码规则或者其他的过滤漏洞都会给程序员挖坑。俺们都知道,实现输入过滤的绝对安全是超级难滴, 这就是为啥很多数据库接口都提供了相关功能。当同样的内容被系统自带的字符串过滤或字符串编码处理后会好很多。例如调用MySQL的函数 mysql_real_escape_string() 或者 perl DBD 的$dbh->quote($value)方法. 这些方法都必用的。
SQL注入(三)的更多相关文章
- 避免SQL注入三慷慨法
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangyy130/article/details/26154837 要说SQL注入还要从 ...
- WEB 安全之 SQL注入 < 三 > 提权
SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果能清楚了解 攻击的全 ...
- 常见的网络攻击(XSS,SQL注入,CSRF)
一.XSS 二.SQL注入 三.CSRF
- Python--day46--mysql存储过程(不常用)(包含防sql注入)
一.存储过程: 优点:只要传很少的数据到数据库就可以了 缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击
第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...
- 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入
一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...
- SQL注入过WAF(11.4 第三十三天)
WAF是什么? Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).也叫Web防火墙,主要是对Web特有入侵方式的加强防护,如D ...
- DVWA(三):SQL injection 全等级SQL注入
(本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...
随机推荐
- ser2net使用
在ubuntu下或者openwrt下安装了ser2net程序之后,可以将串口中的数据转发为以太网数据. 设置在/etc/ser2net.conf中最后: 3002:0:/dv/ttyUSB0:1152 ...
- oracle实现自加力id
--oracle实现自加力id --创建一个T_StudentInfo表 create table T_StudentInfo ( "id" integer not null pr ...
- 并行编程之PLINQ
并行编程之PLINQ 并行 LINQ (PLINQ) 是 LINQ 模式的并行实现.PLINQ 的主要用途是通过在多核计算机上以并行方式执行查询委托来加快 LINQ to Objects 查询的执行速 ...
- 求解轨道力学二体意义下的Lambert方程(兰伯特方程)的Fortran程序
轨道力学中二体问题下求解兰伯特方程. 老外写的Matlab程序,我把它转成了Fortran程序. !************************************************** ...
- [翻译]HBase 的 MVCC 和内建的原子操作
翻译一篇:HBase MVCC and built-in Atomic Operations 作者:Lars Hofhansl HBase 有一些特殊的原子操作: checkAndPut, check ...
- .NET编程规范
.NET开发编程规范 第1章 程序的版式 版式虽然不会影响程序的功能,但会影响可读性.程序的版式追求清晰.美观,是程序风格的重要构成因素. 可以把程序的版式比喻为"书法".好的&q ...
- 线程池python
原创博文,转载请注明出处 今天在学习python进程与线程时,无意间发现了线程池threadpool模块,见官方文档. 模块使用非常简单,前提是得需要熟悉线程池的工作原理. 我们知道系统处理任务时,需 ...
- C# list distinct操作
使用代理实现对C# list distinct操作 范型在c#编程中经常使用,而经常用list 去存放实体集,因此会设计到对list的各种操作,比较常见的有对list进行排序,查找,比较,去重复. ...
- [wp8游戏] cocos2d-x v2.2 + VS2013 环境搭建
[wp8游戏] cocos2d-x v2.2 + VS2013 环境搭建 by:唐小崇 http://www.cnblogs.com/tangchong 从cocos2d-x v2.1.4 以来,co ...
- SSH使用技巧
SSH使用技巧 SSH免输入密码 原理是依赖证书去认证,从而免除密码输入. 通过ssh-keygen生成一对公私钥,是否使用passphrase可以根据个人喜好.(其实使用证书就是为了方便而已,我是不 ...