首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向我的老板演示SQL注入攻击

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

Stack Overflow用户
提问于 2013-05-02 11:01:32
回答 3查看 992关注 0票数 2

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

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

我试过了

代码语言:javascript
运行
复制
foo'); DROP TABLE cabletypes;--

但是给出了相同的错误。当我在提交表单前输入文本区域时,如何才能成功注入?文本区域提交到'comments‘列和值。

SQL

代码语言:javascript
运行
复制
$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!");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-02 11:44:16

您不能在PHP的ext/mysql接口中发出多查询SQL。所以你根本不能玩; DROP TABLE Students的把戏。这是支持已弃用的mysql扩展的少数几点之一。

具有讽刺意味的是,PDO默认情况下支持所有查询的多查询。只有在显式调用mysqli::multi_query()时,Mysqli才支持它。

但是DROP TABLE并不是攻击者试图使用SQL注入进行的唯一非法操作。事实上,丢弃TABLE的攻击是恶意的,但不会给攻击者带来任何有价值的东西。大多数SQL注入攻击更加有条不紊。

我可以为您的示例INSERT语句想出一个漏洞:

代码语言:javascript
运行
复制
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个字符,并且您的完整列集合可能比这个长度更长。您可以利用此漏洞来获取相同的信息,但可能需要多次插入查询。)

无论如何,为了安全起见,为了支持包含撇号的字符串,也为了便于编码和提高性能,你的老板真的应该使用参数化查询。告诉他prepared statements perform 14% faster比非预准备语句要好。

票数 3
EN

Stack Overflow用户

发布于 2013-05-02 11:04:58

Exploits of a Mom的老故事寄给他

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

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

即使您不使用CGI或perl,旧书CGI Programming with Perl, 2nd Edition也值得一读,因为它的security chapter出色地证明了避免SQL注入攻击的本质是永远不要信任来自用户的输入。

票数 3
EN

Stack Overflow用户

发布于 2013-05-02 11:04:23

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16329662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档