我要做一个关于SQL注入的演示文稿,有什么比做自己的php查询并将它们显示给类更好的方法。 问题是我的DB和PHP代码运行完美,但似乎无法在我创建的编辑表单中找到我的UPDATE查询的漏洞。 如果有人可以看看它并告诉我如何插入说'DROP TABLE'命令或类似的东西,它将是非常有帮助的!
rating:: [Film] -> [(Film, Int)]
rating films = [ (film, rating)
| film <- films , let rating = websiteRating film, rating >=75 ]
答案 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,我会睡得更好知道我的代码没有打开这种门......