PHP登录页面SQL注入绕过方法咨询(校园项目需求)
让我先拆解下你的代码情况,再说说为什么你之前的注入尝试没成功,以及有没有可行的思路:
为什么OR 1=1 --无法绕过你的登录?
你的登录处理代码里,对username、email、password三个参数都用了mysqli_real_escape_string()做了转义处理——这个函数会把输入里的单引号(')转义成\',所以你输入的OR 1=1 --会被转义成\'OR 1=1 --,没办法闭合SQL语句里的单引号,自然没法改变原有的查询逻辑。
另外你的查询语句是三个条件用AND连接的:
SELECT * FROM users WHERE username='$username' AND email='$email' AND password='$password'
就算其中一个字段的注入能生效,AND的优先级比OR高,剩下的两个条件还是会要求匹配,所以单纯的OR 1=1也没法让整个条件恒真。
当前代码下,有没有SQL注入绕过的可能?
在你现在的实现里,常规的SQL注入绕过几乎是不可能的,原因有两个:
- 所有用户输入都经过了
mysqli_real_escape_string()转义,只要你的PHP数据库连接字符集和数据库本身的字符集一致(比如都是UTF-8),这个转义就能有效阻断基于单引号闭合的注入。 - 查询要求用户名、邮箱、密码三个条件同时匹配,就算你能绕过其中一个,另外两个字段的验证还是会卡住你——尤其是密码还做了MD5哈希后再拼接进SQL,你没法通过注入伪造一个有效的MD5匹配。
不过如果是为了完成你的校园项目测试(模拟未防护的场景),你可以先临时去掉mysqli_real_escape_string(),这时候就能用经典的注入语句绕过了:
- 用户名输入:
' OR 1=1 -- - 邮箱输入:
' OR 1=1 -- - 密码随便输入
这时候SQL语句会被拼接成:
SELECT * FROM users WHERE username='' OR 1=1 --' AND email='' OR 1=1 --' AND password='xxx'
--会注释掉后面的所有条件,最终查询条件变成username='' OR 1=1,也就是恒真,就能直接绕过登录了。
内容的提问来源于stack exchange,提问作者Coolkeed
相关产品推荐
相关产品推荐

