PostgreSQL SQL Injection Attack Mitigation

SQL注入攻击指利用应用程序数据库接口漏洞进行攻击.

典型的SQL注入攻击图 : 


 

SQL注入举例 : 

1. 利用字符串未过滤逃逸字符的漏洞.

statement = "SELECT * FROM users WHERE name = '" + userName + "';"

这个SQL, 可以在userName这里注入攻击.

userName :  ' or '1'='1

那么整条sql就变成 : 

SELECT * FROM users WHERE name = '' or '1'='1';

或者使用注释, 如果后面还有条件的话可以将后面的条件全部注释掉, 适用范围更广.

' or '1'='1' -- '

那么SQL语句变成 : 

SELECT * FROM users WHERE name = '' OR '1'='1' -- ';

使用以上方法后可以得到users表的所有数据.

如果是一个update语句, 那么可以将所有用户信息更新掉. 危险性较大.

甚至可以执行其他破坏性更大的SQL.

例如 :

a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't

那么SQL变成 : 

SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';

这样将会drop users表, 同时将userinfo表的信息全部查出.

2. 利用类型处理漏洞.

例如 :

statement := "SELECT * FROM userinfo WHERE id = " + a_variable + ";"

a_variable应该是int类型, 但是如果没有强类型机制的话, 攻击者就可以利用这个漏洞进行SQL注入.

如果a_variable等于1;DROP TABLE users

那么SQL变成 :

SELECT * FROM userinfo WHERE id=1;DROP TABLE users;

3. 使用以上方法还可以获取数据库版本, 根据版本漏洞进行攻击.

例如 : 

注入

select version();

规避举例 : 

1. 使用绑定变量

使用绑定变量后, 语句模板将提前提交给数据库, 例如

INSERT INTO PRODUCT (name, price) VALUES (?, ?)

数据库收到模板后, 解析,编译,执行sql优化器并保存结果.

对于PostgreSQL来说, 每个会话保持各自的sql优化结构. 但是并不一定每次都是有固定的执行计划, 因此不同的传入变量并不会影响执行计划的正确性. 参考.

http://blog.163.com/digoal@126/blog/static/1638770402012112452432251/

后续应用程序将变量值传递或者(bind)给数据库.

因为SQL解析已经提前处理, 因此能规避SQL注入攻击.

以下截取自wiki :

Java JDBC [edit]

This example uses Java and the JDBC API:

java.sql.PreparedStatement stmt = connection.prepareStatement(
               "SELECT * FROM users WHERE USERNAME = ? AND ROOM = ?");
stmt.setString(1, username);
stmt.setInt(2, roomNumber);
stmt.executeQuery();

Java PreparedStatement provides "setters" (setInt(int), setString(String), setDouble(double), etc.) for all major built-in data types.

PHP PDO [edit]

This example uses PHP and PHP Data Objects (PDO):

$stmt = $dbh->prepare("SELECT * FROM users WHERE USERNAME = ? AND PASSWORD = ?");
$stmt->execute(array($username, $password));

PERL DBI [edit]

This example uses Perl and DBI:

my $stmt = $dbh->prepare('SELECT * FROM users WHERE USERNAME = ? AND PASSWORD = ?');
$stmt->execute($username, $password);

C# ADO.NET [edit]

This example uses C# and ADO.NET:

using (SqlCommand command = connection.CreateCommand())
{
    command.CommandText = "SELECT * FROM users WHERE USERNAME = @username AND ROOM = @room";

    command.Parameters.AddWithValue("@username", username);
    command.Parameters.AddWithValue("@room", room);

    using (SqlDataReader dataReader = command.ExecuteReader())
    {
        // ...
    }
}

ADO.NET SqlCommand will accept any type for the value parameter of AddWithValue, and type conversion occurs automatically.

Note the use of "named parameters" (i.e. "@username") rather than "?" - this allows you to use a parameter multiple times and in any arbitrary order within the query command text.

Python DB-API [edit]

This example uses Python DB-API with SQLite and paramstyle='qmark':

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()

_users = [('A', 'red'),
          ('B', 'green'),
          ('C', 'blue')]
c.executemany('INSERT INTO users VALUES (?,?)', _users)

params = ('B', 'green')
c.execute('SELECT * FROM users WHERE username=? AND room=?', params)
c.fetchone()

2. 字符逃逸

php参考 : 

http://php.net/manual/en/function.pg-escape-string.php

使用pg_escape_string函数将字符串中的特殊字符转义, 因此不会带来前面的问题.

例如 将1个单引号转成2个单引号. 

http://blog.163.com/digoal@126/blog/static/163877040201342185210972/

3. 强制类型

对于变量本应该是int类型的, 就不允许输入字符类型.

4. 数据库权限控制

把业务程序性用户的权限收到最小, 满足业务需求即可.

[其他]

1. 平时做好归档的备份以及基础备份很重要, 即使真的被攻击了, 也可以恢复到被攻击前的时间点, 将数据挽回.

2. 对于重要的表, 最好所有的DML, DDL都要进行跟踪记录. 例如使用触发器跟踪变更.

参考 : 

http://blog.163.com/digoal@126/blog/static/163877040201252575529358/

[参考]
1. http://en.wikipedia.org/wiki/Sql_injection

2. http://blog.163.com/digoal@126/blog/static/1638770402012910234402/

3. http://www.postgresql.org/docs/devel/static/functions-string.html

4. http://php.net/manual/en/function.pg-escape-string.php

5. http://www.postgresql.org/docs/9.3/static/runtime-config-compatible.html

6. http://blog.163.com/digoal@126/blog/static/163877040201342185210972/

7. http://en.wikipedia.org/wiki/Prepared_statement

8. http://en.wikipedia.org/wiki/Object-relational_mapping

9. http://en.wikipedia.org/wiki/Query_optimization

10. http://blog.163.com/digoal@126/blog/static/1638770402012112452432251/

时间: 2024-09-18 09:39:27

PostgreSQL SQL Injection Attack Mitigation的相关文章

SQL INJECTION的SQL SERVER安全设置

server|安全   日前SQL INJECTION的攻击测试愈演愈烈,很多大型的网站和论坛都相继被注入.这些网站一般使用的多为SQL SERVER数据库,正因为如此,很多人开始怀疑SQL SERVER的安全性.其实SQL SERVER 2000已经通过了美国政府的C2级安全认证-这是该行业所能拥有的最高认证级别,所以使用SQL SERVER还是相当的安全的.当然和ORCALE.DB2等还是有差距,但是SQL SERVER的易用性和广泛性还是能成为我们继续使用下去的理由.那怎么样才能使SQL

再谈ASP防止SQL Injection漏洞的问题

问题 再谈ASP防止SQL Injection漏洞的问题 /**作者:慈勤强Email: cqq1978@Gmail.com*/ 关于Asp的SQL Injection预防问题,似乎已经没什么可说的了.在我做的Asp的项目里面, 都是用自己写的函数来处理客户端提交进来的数据,我的Blog里面也贴过这个函数. 具体可以参考http://blog.csdn.net/cqq/archive/2004/09/23/113786.aspx 不过,从朋友的留言和网上其他的一些讲如何防范SQL Injecti

用PHP函数解决SQL injection

函数|解决 SQL injection问题在ASP上可是闹得沸沸扬扬当然还有不少国内外著名的PHP程序"遇难".至于SQL injection的详情,网上的文章太多了,在此就不作介绍.如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞.在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前

有孔就入 SQL Injection的深入探讨

SQL Injection这个话题越来越热了,很多的论坛和hack站点都或多或少地在谈论这个问题,当然也有很多革命前辈写了N多的关于这方面的文章,所利用的也是许多知名的程序,比如动网,尘缘雅境,而我们也可以拿到免费的程序来看其中的漏洞和数据库的结构,从中来达到注入的目的,不过如果是别人自己写的程序,那么我们就不知道他的源代码,更不知道他的数据库结构(数据表名和其中的字段名),就算有个变量未过滤提交到数据库去,我们也是无从对其下手的,只能利用通过猜解他的数据库结构来构造相应的SQL语句,那么是不是

PHP+MYSQL网站SQL Injection攻防

程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报错,然后一点一点的修正参数内容,当程序再次运行成功之时,注入也就随之成功了. 进攻: 假设你的程序里有类似下面内容的脚本: $sql = "SELECT id, title, content FROM articles WHERE id = {$_GET['id']}"; 正常访问时其UR

针对SQL INJECTION的SQL SERVER安全设置初级篇

server|安全 日前SQL INJECTION的攻击测试愈演愈烈,很多大型的网站和论坛都相继被注入.这些网站一般使用的多为SQL SERVER数据库,正因为如此,很多人开始怀疑SQL SERVER的安全性.其实SQL SERVER 2000已经通过了美国政府的C2级安全认证-这是该行业所能拥有的最高认证级别,所以使用SQL SERVER还是相当的安全的.当然和ORCAL.DB2等还是有差距,但是SQL SERVER的易用性和广泛性还是能成为我们继续使用下去的理由.那怎么样才能使SQL SER

SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具

1.关于SQL Injection 迄今为止,我基本没有看到谁写出一篇很完整的文章,或者说很成熟的 解决方案(能做到 的人肯定很多,问题是没有流传开来,很遗憾) 我简单的说几点,希望启发大家思考,起到抛砖引玉的作用 一.SQL Injection的原理 SQL Injection的实现方法和破坏作 用有很多,但万变不离其宗,其原理可以概括为一句话 :SQL Injection就是向服务器端提交事先准备好的数据,拼凑出攻击者想要的SQL语句,以改变数据库操作执行计划. 我想,这么说也许不算精炼,但

php SQL Injection with MySQL_php技巧

前言 2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击也相当熟悉了,国内各大站点都有些堪称经典的作品,不过作为一篇完整的文章,我觉得还是有必要再说说其定义和原理.如果哪位高手已经达到炉火纯青的地步,不妨给本文挑点刺.权当指点小弟. 关于php+Mysql的注入 国

面包含点-PostGresql SQL性能优化求助

问题描述 PostGresql SQL性能优化求助 点表:create table point_p(flong float8flat float8userid int4);insert into point_p(flongflatuserid) values (113.12655922.6553671);insert into point_p(flongflatuserid) values (113.02934522.6219592);insert into point_p(flongflatu