向我的老板演示SQL注入攻击

时间:2013-05-02 03:01:32

标签: sql code-injection

所以我有一个项目工作,试图教我的老板开始使用准备好的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!");

3 个答案:

答案 0 :(得分:3)

向他发送Exploits of a Mom的旧故事:

enter image description here

这里有许多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作为客户名称,并观察插入语句失败。然后解释他因此而失去生意。