我正试图注入到我制作的一个虚拟网站中,这是一个简单的表单,它使用文本输入将数据发送到我的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' #
其他人显然可能错过了你的要求。。。
你有意尝试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子句,这看起来不错,但如果用户表有3列,而UNION只有2列,那么这应该会失败,因为联合的列数应该与原始查询中的列数相同。这将导致执行失败,但没有足够的具体信息来确认。
最有可能的是,您启用了魔术引号,这可以保存易受攻击的代码。
不要依赖它。
从任何一个问题和答案中都可以清楚地看到,大多数人都不明白注射是什么。出于某种奇怪的原因,每个人都把注射的后果视为注射本身。而注入只是查询创建。不多不少。
因此,注入的结果不是返回的任何数据,而是SQL查询字符串。因此,OP必须检查的是生成的SQL查询。这是一项极其简单的任务,就像回显查询字符串一样简单这将立即揭示注入的可能性,而无需繁琐的猜测和复杂的查询构建。
像这样的简单输出
SELECT * from users WHERE username = 'Bill''
会告诉你魔法名言是,整个问题是一千次重复,而不是一次真正的。
更新
出于某种奇怪的原因,问题中的代码神秘地被更改为基于PDO的无懈可击的代码这让我相信整个表演只是一场恶作剧。
您注入的SQL字符串应该看起来像这个
-1'/**/UNION/**/SELECT/**/1,@@VERSION/**/FROM/**/users/**/WHERE/**/1='1
因为您需要关闭最终sql查询中的最后一个'
更新:
像Your Common Sense
指出的
出于某种奇怪的原因,问题中的代码神秘地被更改为基于PDO的无懈可击的代码。这让我相信整个表演只是一场恶作剧。