昨天,我收到一封电子邮件,说我们的网站容易受到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
请注意,在上面的URL中,我没有公开我的实际域,而是将其替换为mysite.com。
任何一个人能解释上面的URL意味着什么,因为我的网站很容易受到那种网址的攻击,可能对你的网站也很脆弱。
如何破译那个网址,那里发生了什么?
发布于 2009-11-25 06:59:21
问题是将查询字符串上的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他让你的管理帐号登录出现在你的预览页面上。
您应该始终确保SQL转义从用户那里获得的任何输入,或者更好地使用参数化查询,服务器将处理这些问题。如果不知道SQL服务器的语言或类型,我就不能真正指出您需要做哪些代码。
发布于 2009-11-25 07:01:39
您可能有类似于(我不知道php语法)的代码:
string sql = "select * from mytable where customerid = " + Request.QueryString("id");
现在,由于向您发送邮件的人向页面的querystring添加了更多的id,您的sql语句会喜欢这样的:
select * from mytable where customerid = 6111111661 and union all the tables that you don't want.
始终在查询中使用参数并检查用户输入!如果可能的话,尽量避免动态sql。
发布于 2009-11-25 17:14:13
将您的代码更改为这样工作。
$id = $_GET['id'];
$user = mysql_real_escape_string($_GET['user']);
if( is_numeric($id) )
{
mysql_query($query);
}现在,您的代码不会接受无效的用户ID,只要您使用我描述的方法对所有字符串进行清理,就不会有SQL注入的问题。
https://stackoverflow.com/questions/1795099
复制相似问题