你好,我在一个项目上工作,我需要使这个php登录页面易受攻击的sqli ..我已尽我所能删除可转义特殊字符的功能 但是当我尝试注入
' or '1' = '1'
什么都没有发生... login.php:
include ("config.php");
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT id FROM users WHERE username = '$username' and password = '$password'";
$result = mysqli_query($db,$sql);
$count = mysqli_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if($count == 1) {
session_register("username");
$_SESSION['login_user'] = $username;
header("location: welcome.php"); //set a http header
}else {
header("location: failed.php");
}
答案 0 :(得分:2)
但是当我尝试注入
' or '1' = '1'
尝试一下
$_POST['username'] = "' OR 1 LIMIT 1 --";
您甚至可以使用/添加OFFSET
(按行)选择所需的用户。
SELECT id FROM users WHERE username = '' OR 1 LIMIT 1 --' and password = '$password'
然后(由于LIMIT 1)
if($count == 1) {
是真的。 --
是SQL中内联注释的开始,因此其余查询将被忽略。由于我们可以缩短或简化查询,因此具有明显的好处。条件越少越好,我们希望访问查询末尾的“限制和偏移”。
这也说明了搜索密码的愚蠢行为。如果已在代码中将其选中,则不会登录。但是由于未进行登录,因此可能会定时攻击以及其他问题。
答案 1 :(得分:1)
此可能不起作用,因为如果您有许多用户记录,$count
会多于1
,但是您只在检查一条记录。退出:
if ($count == 1) {
可以尝试将条件更改为以下内容:
if ($count != 0) {
那么上述条件只会过滤掉不存在的用户,而不会检查仅返回一个用户。
答案 2 :(得分:1)
如果要在密码字段中插入此类SQL,则查询将失败。
使用' or '1' = '1'
您的查询将变为:
SELECT id FROM users WHERE username = '$username' and password = '' or '1' = '1''
-- Syntax error a single quote is in excess --------------------------------^
您可以删除注射的最后一个单引号:' or '1' = '1