我试图注入到一个我做的虚拟网站,这是一个简单的形式,它使用文本输入发送数据到我的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' #发布于 2013-12-09 23:48:35
其他人显然可能错过了你问的问题...
您有意尝试使用sql注入您自己的站点,例如用于个人学习如何使用sql注入,但同时也要了解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的列数应该与原始查询中的列数相同。这将导致执行失败,但没有足够的具体信息来确认。
发布于 2013-12-09 23:33:05
最有可能的是,您启用了魔术引号,这将保存您的易受攻击的代码。
不要依赖它。
发布于 2013-12-09 23:50:24
注入的SQL字符串应如下所示
-1'/**/UNION/**/SELECT/**/1,@@VERSION/**/FROM/**/users/**/WHERE/**/1='1因为您需要关闭最终sql查询中的最后一个'。
更新:
就像Your Common Sense指出的那样
出于某种奇怪的原因,问题中的代码神秘地被更改为基于
的不可破解的代码。这让我相信,整个表演只是一场拖钓。
https://stackoverflow.com/questions/20474312
复制相似问题