许多开发者认为,只要开启PHP站点的GPC魔术引号(magic_quotes_gpc),所有特殊字符都会被自动转义,从而彻底杜绝PHP注入攻击。然而,持这种观点的人往往缺乏深入实践,更未曾亲自尝试过利用万能密码突破PHP后台登录验证。
事实上,GPC魔术引号是否开启,与万能密码能否成功登录后台并无直接关联。或许你尝试过经典的'or'='or'注入语句?在GPC开启时,单引号被转义,该语句确实失效。但在实际渗透测试中,我常用的万能密码是'or 1=1/*。
接下来分析这种万能密码为何能绕过验证。假设后台的SQL查询语句如下:
SELECT * FROM admin WHERE name='{$_POST['name']}' AND password='{$_POST['password']}'
在用户名输入框中填入'or 1=1/*,密码任意,则SQL语句变为:
SELECT * FROM admin WHERE name=''or 1=1/*' AND password='任意字符'
注意,/*是MySQL中的注释标记,其后所有内容均被忽略——这正是密码随意填写仍能通过验证的原因。
先考察GPC未开启的情形:SQL条件变为WHERE name=''or 1=1(注释符后的内容被截断)。name=''逻辑值为假,而1=1恒为真,因此整个条件为“假 OR 真”,结果为真,从而成功登录后台。
若GPC开启,单引号被转义,则SQL变为WHERE name='\''or 1=1。多了一个反斜杠,name='\'的逻辑值与name=''相同,均为假,而1=1仍为真,因此最终逻辑值依然为真——后台登录自然畅通无阻。
综上所述,对于PHP网站,使用'or 1=1/*作为万能密码即可有效绕过登录验证,GPC魔术引号是否开启对此并无影响。因此,切勿认为字符型注入的PHP站点能够被GPC防护所阻挡——万能密码依然能够轻松突破。
