我有以下代码:
$r = $db->query(sanitizeSQL("SELECT a.* FROM asistentes a WHERE a.id = $id"));
f ($row = $r->fetchArray()) {
$scope['asistente'] = $row;
if (is_numeric($id) && $id != $_SESSION['auth']) {
$error = 'You don't have permission to see this user';
}
}else {
$error = 'Wrong assistant';
}
据我所知,该代码对sql注入攻击很弱,因为尽管您使用filter sanitizesql(我认为这是他们编写的私有方法,而不是本机php筛选器)清理db->query语句,但当您决定客户机是否有权访问用户信息时,您使用的是 $id
值,因此可能的攻击者可以在那里引入任何sql命令。
成功登录时获得的url为:
10.14.79.2/?action=details&id=1
我尝试了一些方法来访问您想要的用户,一种有效的方法是:
10.14.79.2/?action=details&id=3;
只需添加要访问的用户id和分号,就可以访问,而如果只输入用户id(不输入分号),则会显示“您无权查看此用户”消息。
我想知道为什么代码会这样。我是说:
是吗 is_numeric
方法忽略分号并返回true,因为 $id
从一个数字开始?
之后 is_numeric($id) &&
怎么没有呢 $id
如果代码返回的分号正好在 !=
声明?我不明白代码那部分的分号的作用
分号如何跳过 !=
比较,以便我们得到用户的详细信息,我们要求数据库?
在这个阶段有没有更好的方法来执行sql注入?
2条答案
按热度按时间qij5mzcb1#
最好先检查变量的有效性,然后再将其传递给查询。这将修复sql注入的风险,并提供更清晰的逻辑,在这里您可以区分无效id和权限不足的用户。
azpvetkf2#
is\u numeric方法是否因为$id以数字开头而忽略分号并返回true?
否。当您传递一个数字时,会检查该数字是否正确。如果不是数字,则第二次检查从未执行过。因此,操作是:
如果它是一个数字,但不是正确的数字,您会看到“您没有权限查看此用户”消息。
如果它是一个数字并且是正确的数字,则不会显示“您没有权限查看此用户”消息
如果不是数字,则不会看到“您没有查看此用户的权限”消息
3;
不是数字。这意味着最后一种情况适用,从不检查输入是否允许在“is\u numeric($id)&&”之后,$id调用如果返回的分号正好在a!=声明?我不明白代码那部分的分号的作用
如果$id是
3;
这意味着它是一个字符串。如果把它和$_SESSION['auth']
可以把它比作一根弦。它不会破坏密码。但这一点并不重要,因为我们已经确定传递的不是数字的东西意味着永远不会检查它是否正确分号如何跳过!=比较一下,这样我们就可以得到我们向数据库询问的用户详细信息了吗?
那个!=如果is\u numeric()返回false,则从不执行比较。
3;
不是数字。那么,是不是\u numeric()返回false在这个阶段有没有更好的方法来执行sql注入?
如果要注入sql,请在分号后面加上一些sql