MySQL php查询漏洞

时间:2018-03-18 17:30:01

标签: php mysql sql-injection

我要做一个关于SQL注入的演示文稿,有什么比做自己的php查询并将它们显示给类更好的方法。 问题是我的DB和PHP代码运行完美,但似乎无法在我创建的编辑表单中找到我的UPDATE查询的漏洞。 如果有人可以看看它并告诉我如何插入说'DROP TABLE'命令或类似的东西,它将是非常有帮助的!

rating:: [Film] -> [(Film, Int)]
rating films = [ (film, rating) 
   | film <- films , let rating = websiteRating film, rating >=75 ]

2 个答案:

答案 0 :(得分:3)

在大多数情况下,mysqli会阻止多个查询,MySQL本身也有一些内置的安全措施,以防止意外删除表和数据库。因此,DROP TABLE无效。

但您可以使用MySQL注入来演示成功的登录尝试。

创建登录表单并将数据传递到验证页面。将您的查询写为,

query =  "SELECT * FROM `user`
     WHERE `username` = '." username ".' AND `password` = '." password ".'";

现在,在登录表单中输入用户名' OR '1'='1,密码输入为' OR '1'='1。所以最后整个查询看起来像这样,

SELECT * FROM `user` WHERE `username`='' OR '1'='1' AND `password`='' OR '1'='1';

这将返回user表中的所有用户记录,只需应用程序将使用第一条记录登录。

答案 1 :(得分:0)

我不确定我是否完全理解你,但我会尽力告诉你为什么这似乎是一个坏主意......

如果我发布到用户ID

$userid="';DROP TABLE XY;SELECT * FROM USER_DETAILS WHERE fname = '"

你的代码会......

$query = "UPDATE user_details SET fname = '$fname', lname = '$lname', gender 
= '$gender', email = '$email' WHERE userid = '$userid' ";

导致查询:

$query = "UPDATE user_details SET fname = '$fname', lname = '$lname', gender   
= '$gender', email = '$email' WHERE userid = '';DROP TABLE XY;SELECT * FROM 
USER_DETAILS WHERE fname = '' ";

查询将是

UPDATE user_details SET fname = '$fname', lname = '$lname', gender   
= '$gender', email = '$email' WHERE userid = ''

DROP TABLE XY

SELECT * FROM USER_DETAILS WHERE fname = ''

它们中的每一个都是有效的...现在创建一个表格XY并使用此张贴的注入运行您的示例的原始查询...

我遗失了什么?

编辑:正如@RaymondNijland指出的那样,示例中使用的mysql函数似乎阻止了这种攻击。我仍然认为它是一种危险的代码风格,只有驱动程序才能创建安全性。也许有未来的更新允许批量sql,我会睡得更好知道我的代码没有打开这种门......