发现SQL注入漏洞

时间:2009-11-25 06:52:53

标签: sql security url xss sql-injection

昨天我收到一封电子邮件,说我们的网站容易受到SQL注入攻击。电子邮件说:

  

我尝试了一些经典的SQL注入   你的服务器。此URL包含   结果:

     

http://www.mysite.com/ppreview.php?id=611111161%20and%201=0%20UNION%20all%20SELECT%201,2,3,4,password,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,user_id,70,71%20%20from%20admin--&u=10064&t=users_cars

请注意,在上述网址中,我没有公开我的实际域名并将其替换为mysite.com。

任何人都可以解释上述网址的含义,因为我的网站容易受到这类网址的攻击,也可能是您的网站。

如何解码该网址,那里发生了什么?

3 个答案:

答案 0 :(得分:8)

问题是您将查询字符串上的SQL命令连接到SQL命令中。

大概你的代码说的是

"select * from preview where ID=" + Request.QueryString["id"]

使用该QueryString后,它变为

select * from preview where ID=611111161 and 1=0
UNION ALL
SELECT 1,2,3,4,password,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,user=id,70,71
FROM admin

EG:他让您的管理员帐户登录显示在预览页面上。

您应该始终确保SQL转义从用户获得的任何输入,或者甚至更好地使用参数化查询,服务器将负责这一点。在不知道SQL服务器的语言或类型的情况下,我无法真正指出您需要执行哪些代码的方向。

答案 1 :(得分:1)

你可能有类似的代码(我不知道php语法):

string sql = "select * from mytable where customerid = " + Request.QueryString("id");

现在,既然邮寄给你的人在页面的查询字符串中添加的内容不仅仅是id,那么你的sql语句就像是:

select * from mytable where customerid = 6111111661 and union all the tables that you don't want.

始终在查询中使用参数并检查用户输入! 尽可能避免动态sql。

答案 2 :(得分:0)

将代码更改为这样。

$id = $_GET['id'];
$user = mysql_real_escape_string($_GET['user']);

if( is_numeric($id) )
{
   mysql_query($query);
}

现在您的代码不会接受无效的用户ID,只要您使用我概述的方法清理所有字符串,就不会出现SQL注入问题。