PHP数据库安全之SQL注入

所属分类: 网络安全 / 黑客入侵 阅读数: 115
收藏 0 赞 0 分享
$offset = $argv[0]; // 注意,没有输入验证!   $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";   $result = pg_query($conn, $query);   ?>   一般的用户会点击 $offset 已被斌值的“上一页”、“下一页”的链接。原本代码只会认为 $offset 是一个数值。然而,如果有人尝试把以下语句先经过 urlencode() 处理,然后加入URL中的话:   0;   insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)   select 'crack', usesysid, 't','t','crack'   from pg_shadow where usename='postgres';   --   那么他就可以创建一个超级用户了。注意那个 0; 只不过是为了提供一个正确的偏移量以便补充完整原来的查询,使它不要出错而已。   注: -- 是 SQL 的注释标记,一般可以使用来它告诉 SQL 解释器忽略后面的语句。   对显示搜索结果的页面下手是一个能得到密码的可行办法。攻击者所要做的只不过是找出哪些提交上去的变量是用于 SQL 语句并且处理不当的。而这类的变量通常都被用于 SELECT 查询中的条件语句,如 WHERE, ORDER BY, LIMIT 和 OFFSET。如果数据库支持 UNION 构造的话,攻击者还可能会把一个完整的 SQL 查询附加到原来的语句上以便从任意数据表中得到密码。因此,对密码字段加密是很重要的。 例子 27-3. 显示文章……以及一些密码(任何数据库系统)   
  $query = "SELECT id, name, inserted, size FROM products    WHERE size = '$size'    ORDER BY $order LIMIT $limit, $offset;";   $result = odbc_exec($conn, $query);   ?>   可以在原来的查询的基础上添加另一个 SELECT 查询来获得密码:   'union select '1', concat(uname  '-'  passwd) as name, '1971-01-01', '0' from usertable;   --   假如上述语句(使用 ' 和 --)被加入到 $query 中的任意一个变量的话,那么就麻烦了。   SQL 中的 UPDATE 也会受到攻击。这种查询也可能像上面的例子那样被插入或附加上另一个完整的请求。但是攻击者更愿意对 SET 子句下手,这样他们就可以更改数据表中的一些数据。这种情况下必须要知道数据库的结构才能修改查询成功进行。可以通过表单上的变量名对字段进行猜测,或者进行暴力破解。对于存放用户名和密码的字段,命名的方法并不多。 例子 27-4. 从重设密码……到获得更多权限(任何数据库系统)   
  $query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";   ?>   但是恶意的用户会把 ' or uid like'璵in%'; -- 作为变量的值提交给 $uid 来改变 admin 的密码,或者把 $pwd 的值提交为 "hehehe', admin='yes', trusted=100 "(后面有个空格)去获得更多的权限。这样做的话,查询语句实际上就变成了:     
  // $uid == ' or uid like'璵in%'; --   $query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '璵in%'; --";   // $pwd == "hehehe', admin='yes', trusted=100 "   $query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE   ...;";   ?>   下面这个可怕的例子将会演示如何在某些数据库上执行系统命令。 例子 27-5. 攻击数据库所在主机的操作系统(MSSQL Server)   
  $query = "SELECT * FROM products WHERE id LIKE '%$prod%'";   $result = mssql_query($query);   ?>   如果攻击提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作为变量 $prod的值,那么 $query 将会变成   
  $query = "SELECT * FROM products    WHERE id LIKE '%a%'    exec master..xp_cmdshell 'net user test testpass /ADD'--";   $result = mssql_query($query);   ?>   MSSQL 服务器会执行这条 SQL 语句,包括它后面那个用于向系统添加用户的命令。如果这个程序是以 sa 运行而 MSSQLSERVER 服务又有足够的权限的话,攻击者就可以获得一个系统帐号来访问主机了。   注: 虽然以上的例子是针对某一特定的数据库系统的,但是这并不代表不能对其它数据库系统实施类似的攻击。使用不同的方法,各种数据库都有可能遭殃。   预防措施   也许有人会自我安慰,说攻击者要知道数据库结构的信息才能实施上面的攻击。没错,确实如此。但没人能保证攻击者一定得不到这些信息,一但他们得到了,数据库有泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容得到到相关的代码。如果这些代码设计不良的话,风险就更大了。   这些攻击总是建立在发掘安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。   永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。   检查输入的数据是否具有所期望的数据格式。PHP 有很多可以用于检查输入的函数,从简单的变量函数和字符类型函数(比如 is_numeric(),ctype_digit())到复杂的 Perl 兼容正则表达式函数都可以完成这个工作。   如果程序等待输入一个数字,可以考虑使用 is_numeric() 来检查,或者直接使用 settype() 来转换它的类型,也可以用 sprintf() 把它格式化为数字。 例子 27-6. 一个实现分页更安全的方法   
  settype($offset, 'integer');   $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";   // 请注意格式字符串中的 %d,如果用 %s 就毫无意义了   $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",    $offset);   ?>   使用数据库特定的敏感字符转义函数(比如 mysql_escape_string() 和 sql_escape_string())把用户提交上来的非数字数据进行转义。如果数据库没有专门的敏感字符转义功能的话 addslashes() 和 str_replace() 可以代替完成这个工作。看看第一个例子,此例显示仅在查询的静态部分加上引号是不够的,查询很容易被攻破。   要不择手段避免显示出任何有关数据库的信心,尤其是数据库结构。参见错误报告和错误处理函数。   也可以选择使用数据库的存储过程和预定义指针等特性来抽象数库访问,使用户不能直接访问数据表和视图。但这个办法又有别的影响。   除此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显然,日志并不能防止任何攻击,但利用它可以跟踪到哪个程序曾经被尝试攻击过。日志本身没用,要查阅其中包含的信息才行。毕竟,更多的信息总比没有要好。   add a note User Contributed Notes   SQL 注入   17-Mar-2006 01:48   If you use the PEAR package and prepare() / execute() your queries,   you will hardly have to worry about any of this. Of course, it's still   a good idea to make sure you're putting valid data in your database...   bee at askbee dot net   17-Nov-2005 06:52   A great article of how to avoid sql injection   http://www.askbee.net/articles/php/SQL_Injection/sql_injection.html   anonymous   26-Jan-2005 04:42   Here is a useful class that deals with SQL injection:   http://www.phpinsider.com/php/code/SafeSQL/

更多精彩内容其他人还在看

黑客技术讲解 网吧入侵方法大搜罗

首先,我们了解被破坏网吧的客观环境,要了解网吧人员的实地监测等。尤其要注意看有没有闭路电视监控。如果网吧人员对你的个人资料相当熟悉,就住手免的惹麻烦了。部分网吧要出示身份证也不要破坏了,免的惹麻烦。以下破坏方法不分先后,请量力灵活运用若干破坏组合。具体
收藏 0 赞 0 分享

通过Asp入侵Webserver

通过asp入侵web server,窃取文件毁坏系统,这决非耸人听闻... iis的安全性问题 1.iis3/pws的漏洞 我实验过,win98 pws上运行ASP程序,只须在浏览器地址栏内多加一个小数点ASP程序就会被下载下来。IIS3听说也有同样的问题,
收藏 0 赞 0 分享

详尽的IPC$入侵

一 唠叨一下: 网上关于ipc$入侵的文章可谓多如牛毛,而且也不乏优秀之作,攻击步骤甚至可以说已经成为经典的模式,因此也没人愿意再把这已经成为定式的东西拿出来摆弄. 不过话虽这样说,但我个人认为这些文章讲解的并不详细,对于第一次接触ipc$的菜鸟来说,简单的罗列步
收藏 0 赞 0 分享

如何入侵ADSL

这是一位所谓的"黑客"的口述,你不妨看一下,也许你看完后对他的技术性做法不是完全明白,但是你肯定会感到一身冷汗,因为我们现在使用ADSL已经日益广泛,但我们的安全意识还不是很强.听完他的口述希望大家在日后能加强安全防范! 口述: 也许看烂了网上已有的
收藏 0 赞 0 分享

看我来入侵复旦大学(图)

一、师出有名 某日十分无聊,就和X论坛的超级版主wyzhack瞎吹牛,东年西扯的。后来不知道怎么的扯到复旦去了,他提议说不如我们黑掉复旦吧。正好当时也比较清闲,就答应一起看看了,嘿嘿。这次跑去黑复旦纯粹是为了练习技术。 二、战略部署 这次要拿的
收藏 0 赞 0 分享

领土之争——入侵某视讯服务器回忆录

老早就打算写这样一篇文章:能够细致地反映出入侵中攻防的具体内容,我想这比单纯的技术文章有趣的多。有鉴于此,我将尽力完整描述入侵过程中的思考方式。 1.石榴裙下的kk 说实话,就第一次拿到权限而言,没有多少技术含量。我花了N久时间收集KK网络的各种信息,最终
收藏 0 赞 0 分享

黑客攻防实战之对有防火墙网站入侵过程

前几天群里的兄弟给了一个网站,问我可不可以入侵。   一、踩点   ping www.111.com 发现超时,可以是有防火墙或做了策略。再用superscan扫一下,发现开放的端口有很多个,初步估计是软件防火墙。   二、注入   从源文件里搜索关键字asp
收藏 0 赞 0 分享

看看黑客都在偷窥什么!入侵个人电脑揭密(图)

前几天看《南国早报》说一位女孩个人电脑被黑客入侵控制,把裸照发到网上威胁女孩的事。联想到最近网上这样的事挺多的,就想给大家说说怎么防范。 其实现在的网络真的不安全~只要你的电脑连接上网络就存在一定的风险。黑客并不是万能的,他们入侵的电脑都是存在比较严重
收藏 0 赞 0 分享

XSS Phishing - 新式跨站脚本攻击方式(图)

最近跨站脚本漏洞好像比较火,国内的一些比较出名的WEB程序都陆续暴出了跨站脚本漏洞,但是一提到跨站脚本漏洞的攻击方式大家都哑火了,因为在常规的概念中这种漏洞最多是挂网页木马,获取COOKIE之类,属于典型的鸡肋漏洞! 跨站脚本攻击最大的魅力是通过HTML注
收藏 0 赞 0 分享

PHP数据库安全之SQL注入

$offset = $argv[0]; // 注意,没有输入验证!   $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";   $resu
收藏 0 赞 0 分享
查看更多