【软件安全】cwe-89 SQL Injection(四)

来源:互联网 发布:淘宝网址导航 编辑:程序博客网 时间:2024/06/05 22:38

以下为CWE网站中对SQL Injection的一些示范,原网址:http://cwe.mitre.org/data/definitions/89.html#Detection%20Methods

有一小部分是机翻,感觉这种还是重在实践,望,共同进步~


黑客在SQL查询中添加语句,可能改变查询逻辑而绕过安全检查,或者修改后端数据库,以实现SQL注入攻击。


1


2008年,大量的web服务器被相同的SQL语句实施注入攻击,这条语句可以用于很多不同的程序,SQL注入可用于修改web站点服务。

 

2


下面的代码动态地构建和执行相应项目的SQL查询,该查询限制了owneritemname

C#(bad code)

string userName = ctx.getAuthenticatedUserName();

string query = "SELECT * FROM items WHERE owner = '" + userName + "' AND itemname = '" + ItemName.Text + "'";

sda = new SqlDataAdapter(query, conn);

DataTable dt = new DataTable();

sda.Fill(dt);


该语句尝试查询:

SELECT * FROM items WHERE owner = <userName> AND itemname = <itemName>;


但是,如果攻击者威胁利用用户在语句后添加OR语句,如:

SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name' OR 'a'='a';


则该查询语句相当于:

SELECT * FROM items;

这种简化的查询绕过用户查询owner= AND itemname= ,返回items表中的所有内容。

 

例3


如果攻击者威胁利用用户将输入语句改为:

SQL

SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name';

DELETE FROM items;

--

最后的一对连字符(--)表示该语句的其余部分被视为注释,不执行。


或者攻击者可以输入语句:

SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name';

DELETE FROM items;

SELECT * FROM items WHERE 'a'='a';

 

防止SQL注入攻击的一种传统方法是把他们看成一个输入验证问题,只接受白名单中的安全值或识别和逃避黑名单的恶意值。白名单是一个非常有效的执行严格的输入验证规则,参数化的SQL语句需要较少的维护,可以提供更多的保障与安全,设置黑名单可能会有更多的漏洞,遗漏一些可能会发生的注入攻击,例如:

1未引用的目标字段;

2绕过某些元字符;

3使用存储过程隐藏注入的元字符。

 

可以SQL输入查询中手动转义字符,但它不会使免受SQL注入攻击。

处理SQL注入攻击通常提出的另一种解决方案是使用存储过程。虽然存储过程防止某些类型的SQL注入攻击,但仍能遭受许多其他类型的攻击。例如,下面的SQL过程易受第一个示例中所示的SQL注入攻击的攻击。  

procedure get_item ( itm_cv IN OUT ItmCurTyp, usr in varchar2, itm in varchar2)

is open itm_cv for

' SELECT * FROM items WHERE ' || 'owner = '|| usr || ' AND itemname = ' || itm || ';

end get_item;


例4


我们来看一下下列语句:

SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='$user_input' ORDER BY PRICE


这里的$user_input存在威胁,如果输入:

'; exec master..xp_cmdshell 'dir' -- 


则原sql语句将会变为:

SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=''; exec master..xp_cmdshell 'dir' --' ORDER BY PRICE


该语句可以被分割为:

1.SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='';

2.which executes the dir command in the shell: exec master..xp_cmdshell 'dir'

3.--' ORDER BY PRICE   

1.查询语句;2.shell命令执行;3.注释

 

例5


PHP (bad code)

$id = $_COOKIE["mid"];

mysql_query("SELECT MessageID, Subject FROM messages WHERE MessageID = '$id'");


在攻击者无法修改cookie的前提下,程序员可能跳过了id上的任何输入验证。然而,$id是在单引号中的,攻击者可以简单地改变输入中Cookie,如:    

SELECT MessageID, Subject FROM messages WHERE MessageID = '1432' or '1' = '1'        


这种漏洞的预防:

PHP (good code)

$id = intval($_COOKIE["mid"]);

mysql_query("SELECT MessageID, Subject FROM messages WHERE MessageID = '$id'");

(PHP中的intval()函数是将变量转化为整数类型)

                        

例6


此示例试图获取用户提供的最后一个属性,并将其输入数据库中。  

Perl (bad code)

$userKey = getUserID();

$name = getUserInput();

# ensure only letters, hyphens and apostrophe are allowed

$name = whiteList($name, "^a-zA-z'-$");

$query = "INSERT INTO last_names VALUES('$userKey', '$name')";   

 

最后,欢迎大家到我的个人主页点击打开链接一起交流、学习~

原创粉丝点击