2

所以我有一个工作项目,试图教我的老板开始使用准备好的 SQL 语句,但他不太在意,说这没什么大不了的。我想知道如何向他证明这很重要,但我就是不知道如何在我们设置的开发测试服务器上注入 drop table 命令。我为一家处于测试阶段的公司开发了一个应用程序,我想将其删除(备份)以向他展示问题,因为我正在使用他的 SQL 代码。我试图让公司养成使用准备好的陈述的习惯,但我似乎是唯一一个想要改变的人,而他们没有。有人可以帮我用 SQL 注入“破解”这个数据库吗?谢谢!!

要提交的表单上有一个评论框,当它看到撇号时会抛出错误:

无法进行查询:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 78 行的 's";', '100', '100')' 附近使用正确的语法

我试过了

foo'); DROP TABLE cabletypes;--

但给出同样的错误。在提交表单之前在文本区域中输入时,如何使其成功注入?文本区域提交到“评论”列和值。

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!");
4

3 回答 3

3

给他发一个妈妈的老故事:

在此处输入图像描述

这里有许多 MySQL 注入攻击的一个很好的例子:http ://www.rackspace.com/knowledge_center/article/sql-injection-in-mysql

(现代?)PHP 防止发出多条语句 qith mysql_query,这有助于阻止某些类型的 SQL 注入:https ://stackoverflow.com/a/10663100/74585

老书CGI Programming with Perl, 2nd Edition值得一读,即使你不使用 CGI 或 perl,因为它的安全章节出色地展示了避免 SQL 注入攻击之类的事情的本质是永远不要相信来自用户的输入.

于 2013-05-02T03:04:58.093 回答
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 查询。)

无论如何,为了安全起见,您的老板确实应该使用参数化查询,也为了支持包含撇号的字符串,同时也便于编码和提高性能。告诉他准备好的语句比未准备的语句快 14%

于 2013-05-02T03:44:16.457 回答
1

如果您将客户存储在数据库中,请尝试将Tom O'Brian其用作客户名称,并观察插入语句是否失败。然后解释说他因此失去了生意。

于 2013-05-02T03:04:23.270 回答