测试SQL注入攻击

时间:2013-12-09 15:29:29

标签: php mysql sql sql-injection

我正在尝试注入我制作的虚拟网站,它是一个简单的表单,它使用文本输入将数据发送到我的php文件,然后输出收集的数据。以下是我的SQL代码。

$id = $_GET['id'];
$id = $_GET['id'];

        $data = $conn->query('SELECT * FROM users WHERE username = ' . $conn->quote($id));

        foreach($data as $row) {
         echo $row['id'].' '.$row['username'];
         }

当我尝试使用诸如工会之类的东西时,我没有得到任何数据,如果我在URL的末尾添加了撇号,我就不会收到MySQL错误。有人可以解释为什么该站点不受SQL注入的影响吗?

由于对我的要求存在一些困惑,我的最终目标是能够进入信息模式,因此我一直在尝试使用语句来进入模式,但没有成功:

' and 1=1 union select table_name,table_schema from information_schema.tables where table_schema='users' #

4 个答案:

答案 0 :(得分:2)

其他人显然可能错过了你的要求......

你是故意尝试sql-inject你自己的网站,例如个人学习如何不,但也看看sql注入可以做什么。如果是这样,请查看您的陈述并查看“我需要添加什么来伪造它”。

"SELECT * from users WHERE username = '$id'"

如果用户为$ id设置了诸如“Bill”的值,则它将变为

"SELECT * from users WHERE username = 'Bill'"

并没有问题。现在,您想要注入并查看所有用户,一种常见的方法是关闭引号,然后添加其他始终返回true的内容...例如用户放置值

' OR 1=1 ;--

以上将导致

"SELECT * from users WHERE username = '' OR 1=1;-- '"

分号和破折号对于“完成”原始查询非常重要,然后指示破折号后面的任何内容都是注释,因此在原始查询构建构造的其他悬空关闭引用之后它不会尝试执行任何操作

希望这有助于解答为什么在尝试注入您自己的网站时可能会失败的原因。

评论反馈

我不知道为什么我的版本不起作用,我不是想要联合任何东西,只是强制返回所有记录。

关于你的UNION子句,看起来没问题,但是如果你的users表有3列且你的UNION只有2列,那么它应该失败,因为union应该与原始查询中的列数相同。这会导致执行失败,但没有足够的具体信息来确认。

答案 1 :(得分:0)

最有可能的是,你启用了魔法引号,这样就可以保存易受攻击的代码。

不要依赖它。

答案 2 :(得分:0)

您注入的SQL字符串应该如下所示

-1'/**/UNION/**/SELECT/**/1,@@VERSION/**/FROM/**/users/**/WHERE/**/1='1

因为你需要关闭最后的sql查询中的最后一个'

<强>更新

Your Common Sense指出

  

由于一些奇怪的原因,问题中的代码神秘地被更改为无法使用的基于PDO的代码。这让我相信整个表演只是一种拖钓。

答案 3 :(得分:0)

从问题和答案中可以清楚地看出,大多数人都不明白注射剂是什么。出于某种奇怪的原因,每个人都注射后果进行注射。虽然注入只是查询创建。不多也不少。

因此,注入的结果不是返回的数据,而只是SQL查询字符串。因此,OP必须检查的是生成的SQL查询。这是一个非常简单的任务,就像回显查询字符串一样原始。这将立即显示注入可能性,而不需要进行麻烦的猜测和复杂的查询构建。

像这样的简单输出

SELECT * from users WHERE username = 'Bill\''

会告诉你魔术引语并且整个问题是一次性复制而不是真实的。

<强>更新

由于一些奇怪的原因,这个问题中的代码神秘地被改为无法使用的基于PDO的代码。这让我相信整个表现只是一种拖钓。