如何对此代码执行SQL注入攻击?

时间:2016-08-18 11:27:34

标签: php security sql-injection database-security

在我为开发设置的本地xampp服务器中,我有一个这样的表:

CREATE TABLE `entries`
(

`id` int(10) UNSIGNED NOT NULL,

`title` varchar(100) NOT NULL,

`entry` text NOT NULL,

`date_entered` datetime NOT NULL

)

为了学习如何保护我的查询免受SQL注入,我想引出一个(我故意不使用预准备语句)。我有一个查询在这个表中插入一个条目,如下所示:

$sql = 'insert into entries ( title , entry , date_entered ) '
    . 'values("'
    . $postTitle
    . '","'
    . $postEntry
    . '","'
    . $dateEntered
    . '")';

它工作(它确实在表中插入条目),但我没有引发针对它的SQL注入攻击。以下是我尝试在$postEntry字段中插入的内容:

;drop table entries;
;drop table entries;'
';drop table entries;'
`;drop table entries;'
q';drop table entries;
q","e");drop table entries; --'
q","e");drop table entries;--

对于SQL查询的最后一个值:

insert into entries ( title , entry , date_entered ) values("r","q","e");drop table entries;--","2016-08-18 10:35:36")

条目表仍然完整!

我将SQL字符串修改为使用单引号,如下所示:

$sql = 'insert into entries ( title , entry , date_entered ) '
    . ' values(\''
    . $postTitle
    . '\',\''
    . $postEntry
    . '\',\''
    . $dateEntered
    . '\')';

然后尝试了:

q','2016-5-5');drop table entries; --'

但仍然没有运气!那我该如何产生SQL注入攻击呢? 注意:建议的副本不重复,甚至不是答案。这个问题的重点是演示博览会,以确保安全措施有效。

3 个答案:

答案 0 :(得分:1)

Mysql不允许在一个Query中使用多个语句。这就是Drop语句被忽略的原因。

使用mysqli_multi_query()进行多次查询。

你仍然可以在这里使用其他注射剂。

尝试使用

  

http://sqlmap.org/

检查代码的漏洞。

答案 1 :(得分:1)

您可以插入多个值并向表发送垃圾邮件,但有人说,您不能在单个查询中运行多个语句。

例如,您可以通过在单个帖子中附加大量其他提交内容来跨越表格。您将需要处理此问题,但您可以尝试将$ postEntry设置为:

poo'),'2016-5-6'),('poo','poooo','2016-5-5'),('poo','poooo

$ postEntry字符串的开头首先正确结束原始查询,然后附加其他值,然后在原始查询将围绕$ postEntry值附加单引号的位置结束。您需要将$ postEntry设置为我输入的内容。我认为.. :))

答案 2 :(得分:1)

我不会再添加我的回答,因为我不想让你认为我是黑客:|但我想帮助您了解黑客如何滥用您的代码我可以用另一种方式向您展示。

例如,假设我想更多地了解系统以及我如何(可能)揭示密码,卡片数据等,我们假设我已经发现了一个像您创建的那样的弱点。 / p>

基本前提是我在博客帖子屏幕上发现了一个弱点,我发布的任何内容都是我拥有的帖子或者在发布后可以在网站上看到的帖子。

因此,我几乎可以使用postEntry字段作为输出,通过操作postTitle的值来显示任何SQL查询的结果。

注意:我可能错过了单引号或其他地方,因为我只是根据我所知的工作情况即时输入,所以你需要稍微搞乱这个理论。我很确定我的代码示例可以复制和粘贴。

步骤1)。显示可供查询的表列表。 设置$ postTitle(不是条目)如下:

poo',SELECT GROUP_CONCAT(TABLE_NAME) FROM INFORMATION_SCHEME.TABLES),'2016-5-5'),'poo

提交后(并假设您带我到显示我帖子的页面)主帖子区域应包含数据库中逗号分隔的表格列表

第2步)。清理 复制列表并立即删除我的帖子,以减少观看者的警报状态。

第3步)。获取表列名称 使用完全相同的方法创建一个SELECT语句,该语句从特定表中获取我现在知道的名称的所有COLUMN名称。我得到一个帖子,其中包含该表的逗号单独列列表。

第4步)。再次清理

第5步)。您现在可以看到它的目标位置 所以现在我可以通过运行select语句并在我的帖子上查看输出,从任何表中选择我想要的任何数据。