首先,我不是想破解或做任何违法行为。以为我让你们知道。我有一个客户希望我对他的系统进行一些修改,当我看着它时,我注意到NOTHING被转义了。我不是在开玩笑,没有任何东西被逃脱。我向他解释说拥有这样一个系统是不安全的。然后他继续告诉我他已经有这样的系统这样几年没有发生任何事情。我需要告诉他他的系统不安全,但我真的不知道要执行sql注入。这里有一些使用$ _GET且未被转义的查询。
SELECT *,DATE_FORMAT(joined,'%M %d, %Y') as \"Joined\" FROM `members` WHERE `name` LIKE '".$ltr."%' ORDER BY points DESC LIMIT $page,50
这是另一个:
SELECT * FROM groups WHERE id=$thisladder[grid]
我唯一看到“可能”清理$ _GET的是这个函数:
if (!ini_get('register_globals')) {
$superglobals = array($_SERVER, $_ENV,
$_FILES, $_COOKIE, $_POST, $_GET);
if (isset($_SESSION)) {
array_unshift($superglobals, $_SESSION);
}
foreach ($superglobals as $superglobal) {
extract($superglobal, EXTR_SKIP);
}
}
上述函数可能正在清理变量。是的,系统也使用寄存器全局变量,这也很糟糕。
我也做了备份,以防万一。
答案 0 :(得分:6)
答案 1 :(得分:5)
向你的'朋友'展示他的代码是多么愚蠢的一些有趣的事情:
http://example.com/badscript.php?_GET[]=ha+ha+I+pwned+your+GET+superglobal
http://example.com/badscript.php?_SESSION[issuperuser]=1
这种事情确实为什么register_globals是一个彻头彻尾的愚蠢想法,并且(在FAR太长时间之后)最终被默认为OFF。
忘记SQL注入 - 这段愚蠢的代码允许远程PHP变量注入。
答案 2 :(得分:1)
如果登录代码看起来像这样:
$query = 'SELECT id FROM users WHERE username=\''.$_POST['username'].'\' AND password=\''.$_POST[password].'\'';
$result = mysql_query($query);
etc, etc...
尝试在登录字段中输入此内容
username = "whatever"
password = "' OR 1"
有意义吗?