所以我有一个项目工作,试图教我的老板开始使用准备好的SQL语句,但他可以少关心并说这不是什么大问题。我想知道如何向他证明这是一个大问题,但我无法弄清楚如何在我们设置的开发测试服务器上注入drop table命令。我为一家正处于测试阶段的公司开发了一个应用程序,我希望将其删除(备份)向他提出问题,因为我正在使用他的SQL代码。我试图让公司养成使用准备好的陈述的习惯,但我似乎是唯一一个想要改变的人而他们却没有。有人可以帮我用SQL注入“破解”这个数据库吗?谢谢!
要提交的表单上有一个注释框,当它看到撇号时会抛出错误:
无法进行查询:您的SQL语法出错;查看与MySQL服务器版本对应的手册,以便在第78行使用“s”,“100”,“100”附近的正确语法
我试过
foo'); DROP TABLE cabletypes;--
但同样的错误。当我在表单提交之前输入textarea时,如何才能成功注入? textarea提交“评论”栏和值。
SQL
$sql="INSERT INTO cabletypes
(cable_type,
sample_no,
sample_date,
section_lg,
wet_dry,
avgofppf,
sheath_type,
plastic_wt,
inner_sheath,
inner_al_wt,
inner_steel_wt,
cable_guard,
guard_al_wt,
guard_steel_wt,
guard_other_wt,
total_pairs_a,
pair_count_gauge_a,
copper_wt_a,
total_pairs_b,
pair_count_gauge_b,
copper_wt_b,
total_pairs_c,
pair_count_gauge_c,
copper_wt_c,
total_pairs_d,
pair_count_gauge_d,
copper_wt_d,
sum_pairs,
copper_wt,
copper_percent,
lead_wt,
lead_percent,
contains_lead,
waste_wt,
sampler,
supervisor,
comments,
cable_no,
section_no)
VALUES (
'$cable_type',
'$sample_no',
'$sample_date',
'$section_lg',
'$wet_dry',
'$avgofppf',
'$sheath_type',
'$plastic_wt',
'$inner_sheath',
'$inner_al_wt',
'$inner_steel_wt',
'$cable_guard',
'$guard_al_wt',
'$guard_steel_wt',
'$guard_other_wt',
'$total_pairs_a',
'$pair_count_gauge_a',
'$copper_wt_a',
'$total_pairs_b',
'$pair_count_gauge_b',
'$copper_wt_b',
'$total_pairs_c',
'$pair_count_gauge_c',
'$copper_wt_c',
'$total_pairs_d',
'$pair_count_gauge_d',
'$copper_wt_d',
'$sum_pairs',
'$copper_wt',
'$copper_percent',
'$lead_wt',
'$lead_percent',
0,
'$waste_wt',
'$sampler',
'$supervisor',
'$comments',
'$cable_no',
'$section_no')";
}
mysql_query($sql) or die ("Unable to Make Query:" . mysql_error());
print("Sample Sheet Submitted Successfully!");
答案 0 :(得分:3)
向他发送Exploits of a Mom的旧故事:
这里有许多MySQL注入攻击的好例子:http://www.rackspace.com/knowledge_center/article/sql-injection-in-mysql
(Modern?)PHP防止发出多个语句qith mysql_query,这有助于阻止某些类型的SQL注入:https://stackoverflow.com/a/10663100/74585
旧书CGI Programming with Perl, 2nd Edition值得一读,即使你不使用CGI或perl,因为它security chapter出色地证明了避免像SQL注入攻击这样的事情的本质是永远不要相信用户的输入。
答案 1 :(得分:3)
您不能在PHP的ext/mysql界面中发出多查询SQL。所以你根本不能做; DROP TABLE Students
伎俩。这是支持不推荐使用的mysql扩展的几点之一。
具有讽刺意味的是,PDO默认支持所有查询的多查询。只有当你明确地调用mysqli::multi_query()时,Mysqli才支持它。
但DROP TABLE并不是攻击者可能尝试使用SQL注入的唯一非法事件。实际上,执行DROP TABLE的攻击是恶意攻击,但攻击者没有任何价值。大多数SQL注入攻击都更有条理。
我可以想一下你的示例INSERT语句的漏洞:
http://yourapp.example.com/cable_types.php?supervisor=jflay',(SELECT GROUP_CONCAT(CONCAT(table_name,'.',column_name)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema=DATABASE()), NULL, NULL) --
瞧!我刚刚创建了一个电缆类型,其注释告诉我数据库中的所有表和列。然后,我可以在随后尝试利用您网站中的其他网页时使用此知识。
(实际上,这可能不是一个确定的例子,因为GROUP_CONCAT默认情况下长度限制为1024个字符,并且您的完整列可能比此长。您可以使用此漏洞获取相同的信息,但也许它需要几个INSERT查询。)
无论如何,你的老板真的应该为了安全起见而使用参数化查询,并且为了支持包含撇号的字符串,还要便于编码和性能。告诉他prepared statements perform 14% faster比未准备好的陈述。
答案 2 :(得分:1)
如果您将客户存储在数据库中,请尝试使用Tom O'Brian
作为客户名称,并观察插入语句失败。然后解释他因此而失去生意。