一、题目简介
题目名称:simple_login
题目分值:150分
题目环境:PHP+MySQL网页登录界面
题目描述:普通用户无法登录后台,后台管理员账号存在漏洞,请尝试绕过登录验证,获取页面隐藏Flag。
适配水平:掌握PHP SQL注入原理、万能密码绕过逻辑,区别于入门纯签到题,需要理解语句执行逻辑
二、核心考点
- MySQL基础语法与查询语句执行逻辑
- 无过滤字符型SQL注入漏洞
- 万能密码绕过登录验证原理
- PHP后端简单漏洞成因(未做输入过滤、参数拼接查询)
三、漏洞原理分析
本题后端采用原生PHP拼接SQL查询语句,未对用户输入的账号、密码参数做任何过滤、转义处理。
后端核心查询逻辑如下:
$user = $_POST['username']; $pwd = $_POST['password']; $sql = "select * from admin where username='$user' and password='$pwd'"; $result = mysql_query($sql); if($result){ // 登录成功,输出Flag }由于参数直接拼接SQL语句,用户可控输入会改变原有查询逻辑。MySQL中or 1=1为恒真语句,且单引号可以闭合原有SQL语句的字符串,实现逻辑绕过,无需正确账号密码即可登录后台。
四、详细解题步骤
1. 环境探测
打开题目链接,页面呈现简洁的管理员登录界面,包含用户名、密码两个输入框和登录按钮,无多余提示。尝试输入任意普通账号密码,均提示"登录失败",确认无弱口令漏洞,优先考虑SQL注入绕过。
2. 构造注入Payload
根据字符型注入特性,用户名输入框输入万能注入语句,密码框随意输入内容:
- 用户名:' or 1=1 #
- 密码:123456(任意字符即可)
3. 语句逻辑解析
输入后拼接的完整SQL语句为:
select * from admin where username='' or 1=1 #' and password='123456'其中:
- 单引号
'闭合了原用户名字符串 or 1=1构造恒真条件#注释掉后续所有SQL语句,彻底绕过密码验证逻辑
4. 获取Flag
点击登录后,页面跳转成功,直接展示题目Flag:
CTF{5ql_1nj3ct_bas1c_2026}
五、题目总结与防御方案
本题是CTF进阶训练中最经典的基础注入题,核心考察对SQL语句执行逻辑的理解,而非复杂工具利用。很多同学入门仅会套用Payload,忽略原理,本题重点强化"字符串闭合+逻辑恒真+注释截断"的注入核心思路。
安全防御方案:
- 预处理语句:使用PDO预处理或mysqli预处理
- 输入过滤:对用户输入进行转义过滤
- 禁用特殊字符:限制输入中的SQL关键字
- 关闭错误回显:生产环境关闭MySQL错误信息显示
- 杜绝SQL拼接:避免直接拼接用户输入到SQL语句
六、扩展思考
除了' or 1=1 #这种经典Payload,还可以尝试以下变种:
' or '1'='1 ' or 1=1 -- admin' -- ' or 'a'='a这些Payload的原理都是通过构造恒真条件,使WHERE子句始终返回true,从而绕过身份验证。