我使用SQL Inject Me Firefox插件
扫描了我的登录脚本根据测试结果,我的脚本容易受到SQL注入攻击。结果示例
Results:
Server Status Code: 302 Found
Tested value: 1' OR '1'='1
Server Status Code: 302 Found
Tested value: 1' OR '1'='1
Server Status Code: 302 Found
Tested value: 1 UNI/**/ON SELECT ALL FROM WHERE
Server Status Code: 302 Found
Tested value: %31%27%20%4F%52%20%27%31%27%3D%27%31
我的剧本
check-login.php - 检查登录详细信息,这是代码。
$ email = clean($ _ POST ['username']); $ pass = clean($ _ POST ['password']); $ user =“select * from tbl_admin where admin ='$ email'and pass ='$ pass'”;
//一些代码
$ _ SESSION ['login_mes'] =“您已成功登录!”; 标题( “位置:admin.php的”); 出口();
}其他{
$ _ SESSION ['login_mes'] =“无效的电子邮件地址或密码,请重试。”; 标题( “位置:login.php中”); 出口(); }
登录失败时出现问题。如果我删除
} else {
$_SESSION['login_mes'] = "Invalid email address or password, please try again.";
header("Location:login.php");
exit();
}
SQL Inject Me没有检测到故障以及如何修复此部分?
答案 0 :(得分:9)
302是服务器说“我希望你去[其他地方]”(在这种情况下是login.php)的方式。 这不是错误,而是完全正常的反应。特别是在你的情况下,在SQL注入尝试后将用户发送到登录页面比让他进入更有意义(如果你问我)。
答案 1 :(得分:2)
四年后,我只是在调查这个问题,并认为我会分享给下一个人。
经过一些分析,我们得出结论,302本身并不是一个问题。关注的问题是在302之前的页面可能已被发送但在被显示之前被302扫除。如果浏览器收到的上一页(并且可能由Fiddler记录)包含数据库错误(或黑客可能认为有用的其他信息),那么这很糟糕。如果302是初始响应并且它有一个空体,只有一个标题,那么我认为你没问题。
你必须显示错误页面(302的目的),所以我不知道如何将其视为“太多信息”。
答案 2 :(得分:1)
“//某些代码”没有多大帮助,但问题可能与此clean()
有关。请改为mysql_real_escape_string()
。
编辑:如上所述,302代码表示“您正在转发”。它并不意味着SQL注入成功,因为它并不意味着它也不是。在这种情况下,您只会知道如果您可以确定302转发给您的位置,请“admin.php”或“login.php”。
答案 3 :(得分:0)
某些渗透测试工具更喜欢服务器不返回错误消息或至少非常通用的消息。例如,在SQL Inject Me页面上显示
该工具通过表单发送数据库转义字符串 领域。然后它查找输出的数据库错误消息 呈现页面的HTML。
因此,当它看到302响应代码时,它会假设您的应用程序返回的信息过多。您可以通过为响应设置不同的状态代码并查看SQL Inject Me是否仍然出现错误来测试此理论,如下所示:
header('HTTP/1.1 404 Not Found');
当然,向他们发送404不会帮助您的用户返回登录页面,因此您可能需要尝试其他3XX消息,可能是303或307。