CISP-PTE SQL注入5(万能密码)

目录

一、渗透实战

1、打开靶场

2、万能密码

(1)密码admin' or 1=1#

[(2)密码admin' or 1=1--空格](#(2)密码admin' or 1=1--空格)

(3)密码admin '='

二、万能密码分析

1、admin '='

(1)SQL语句分析

(2)SQL语句执行流程

2、admin' or 1=1#

(1)SQL语句分析

[① 正常的登录SQL语句](#① 正常的登录SQL语句)

[② 攻击者输入恶意Payload](#② 攻击者输入恶意Payload)

[③ 数据库实际执行的语句](#③ 数据库实际执行的语句)

(2)SQL语句执行

[3、admin' or 1=1 --空格](#3、admin' or 1=1 --空格)

[(1)正常登录的 SQL 逻辑](#(1)正常登录的 SQL 逻辑)

[(2)注入后的 SQL 逻辑篡改](#(2)注入后的 SQL 逻辑篡改)

(3)最终结果


本文详细记录了CISP-PTE靶场SQL注入万能密码关卡的渗透全流程。通过三种万能密码测试发现admin'='能成功登录,并深入分析了其原理:该语句使密码验证转换为0=0的永真条件。同时解析了admin'or1=1#和admin'or1=1--两种注入方式,说明其通过闭合引号、构造永真条件和注释密码验证来绕过认证。文章揭示了SQL注入的核心原理是利用特殊字符篡改SQL语句逻辑,并强调参数化查询是根本防御措施。这些分析为理解SQL注入提供了实操案例和理论依据。

一、渗透实战

1、打开靶场

打开靶场,页面提示"通过SQL注入读取/tmp/360/key文件,答案就在文件中",如下所示。

点击进入答题,进入到SQL登录页面,URL地址如下所示。

复制代码
http://5924a826.clsadp.com/start/

猜测是需要万能密码来登录,如下所示。

2、万能密码

(1)密码admin' or 1=1#

用户名admin 密码admin 'or 1=1#

admin' or 1=1# 输出Password:admin' 1=1,说明#和or被过滤了,此万能密码无法使用。

(2)密码admin' or 1=1--空格

如下所示,admin' or 1=1-- 输出Password:admin' 1=1。

如下所示,输入admin' or 1=1--+ 输出Password:admin' 1=1,说明-- 被过滤,无法使用此万能密码进行注入。

(3)密码admin '='

如下所示,使用用户名admin,密码admin '='登录,登录成功输出flag值。

二、万能密码分析

1、admin '='

(1)SQL语句分析

|---------------------------------------------------------------------|
| 原语句 SELECT * FROM users WHERE username = '用户名' AND password = '密码' |

将用户名: admin密码: admin '='进行替换,替换后如下所示,注意标黄部分。

|---------------------------------------------------------------------------|
| SELECT * FROM users WHERE username = 'admin' AND password = 'admin '=' ' |

关键内容为password = 'admin '=' ,这个语句'admin ' = ' ' 的执行结果是 False (0),-- 比较两个字符串是否相等,整个条件变成password = False -- 或者更准确地说password = 0,这是因为在MySQL中,当字符串与数字比较时,字符串会被转换为数字:password 字段的值会被尝试转换为数字,如果密码不是以数字开头,会被转换为 0。

  • -- 假设密码字段值为 "password123",CAST('password123' AS SIGNED) = 0 -- 结果是 0 = 0 → True
  • -- 假设密码字段值为 "admin",CAST('admin' AS SIGNED) = 0 -- 结果是 0 = 0 → True
  • -- 几乎任何非数字开头的密码都会转换为 0,因为只要密码字段的值不是以数字开头,这个条件就永远为真

(2)SQL语句执行流程

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| SELECT * FROM users WHERE username = 'admin' AND password = 'admin '=' ' -- 分解执行: -- 1. 先计算右边的表达式:'admin '=' ' → False (0) -- 2. 条件变成:password = 0 -- 3. 密码字段转换为数字:如果不是数字开头 → 0 -- 4. 最终:0 = 0 → True -- 5. 整个WHERE条件:username正确 AND True → 查询成功 |

2、admin' or 1=1#

Payload(admin' or 1=1#)同时尝试两种攻击路径:

  • 路径一 :通过 admin' 尝试精确匹配管理员账户。

  • 路径二 :通过 or 1=1 引入一个永真条件,作为攻击失败的"保险"。

  • 路径三 :通过 # 注释掉后续所有SQL代码,尤其是密码验证部分。

(1)SQL语句分析

正常的登录SQL语句
复制代码
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
攻击者输入恶意Payload
  • 用户名admin' or 1=1#

  • 密码任意值 (例如:xxx,此密码完全无关紧要)

此时后端拼接后的SQL语句如下所示,注意标绿的部分为注释要被忽略掉。

复制代码
SELECT * FROM users WHERE username = 'admin' or 1=1#' AND password = 'xxx';
数据库实际执行的语句

由于 # 将后面的内容全部注释,数据库真正执行的语句如下所示。

SELECT * FROM users WHERE username = 'admin' or 1=1

而WHERE username = 'admin' or 1=1等价于SELECT * FROM users WHERE True;当SQL语句返回了结果集(在这里是所有用户 )时,程序就认为认证通过。这是因为这个条件由两部分组成,使用 OR 连接:

  • 第一部分:username = 'admin'

    • 目的 :精确查找用户名为 admin 的记录。

    • 结果 :如果数据库中存在 admin 用户,这部分结果为 真(True)

  • 第二部分:1=1

    • 目的 :这是一个永恒的真理,一个永真条件

    • 结果 :这部分永远真(True)

  • 逻辑运算符:OR

    • 规则 :在逻辑运算中,OR 只需要两边的条件有任意一个为 True,整个结果就为 True。

    • 应用(username = 'admin') OR (True)

    • 结果 :因为 1=1 永远为 True,所以整个 WHERE 条件永远为 True

(2)SQL语句执行

上一步我们分析等同于执行语句SELECT * FROM users WHERE True;由于条件为true,这意味着其等价于如下语句,这意味着:数据库会返回 users 表中的所有用户记录!

复制代码
SELECT * FROM users;

那么为何可以登录成功呢,有此万能密码风险的登录逻辑通常是这样的:

复制代码
$user = execute_sql($sql);
if ($user != null) { // 或者 if (count($user) > 0)
    // 登录成功
}
  • 当SQL语句返回了结果集(在这里是所有用户)时,程序就认为认证通过。

  • 通常情况下,应用程序会取结果集的第一条记录 作为当前登录的用户。如果 admin 用户是第一个被创建的用户,其 id 可能最小,排在结果集的第一位,攻击者就直接以管理员身份登录了。即使不是,攻击者也以某个任意用户的身份进入了系统。

综上,admin' or 1=1# 这个Payload的强大之处在于它的双重保险

  • 精确攻击 :首先尝试匹配 admin 这个特定高权限账户。

  • 范围攻击 :如果 admin 账户不存在或不匹配,则通过 or 1=1 这个永真条件,让查询返回数据库中的所有用户。只要用户表不为空,登录就能成功。

  • 绕过验证 :通过 # 注释符,确保密码验证条件 AND password = ... 完全失效。

因此仅凭SQL查询是否返回结果来判断登录成功,而不严格验证用户名和密码的匹配性,以及不限制返回的记录数量。 根本的防御措施依然是使用参数化查询,将用户输入彻底与SQL指令分离。

3、admin' or 1=1 --空格

admin' or 1=1 -- 这个"万能密码"之所以能成功,依赖于三个关键点,它与admin' or 1=1#的原理一样,只不过注释符由#变为--空格:

  • 单引号(' :用于提前闭合用户名字符串,使得后续的 or 1=1 成为SQL语法的一部分。

  • 永真条件(or 1=1 :构造一个永远为真的逻辑条件,确保 WHERE 子句匹配数据库中的大量甚至全部记录。

  • SQL注释符(--空格:用于注释掉原始的密码验证条件,彻底绕过密码检查。

(1)正常登录的 SQL 逻辑

假设后台验证用户名和密码的原始 SQL 语句如下,它会根据用户输入的usernamepassword去数据库匹配数据。

复制代码
SELECT * FROM users WHERE username = '用户输入的用户名' AND password = '用户输入的密码';
  • 只有当 "用户名正确" "密码正确" 时,AND连接的两个条件才同时为真,查询才会返回该用户数据,登录成功。
  • 若任一条件不满足,查询无结果,登录失败。

(2)注入后的 SQL 逻辑篡改

当输入 "admin' or 1=1 --" 作为用户名时,特殊字符会直接拼接到原始 SQL 中,导致语句含义完全改变,最终执行的 SQL 如下:

复制代码
SELECT * FROM users WHERE username = 'admin' or 1=1 -- ' AND password = '用户输入的密码';

篡改逻辑主要依赖三个关键符号,作用如下:

  1. 单引号(') :闭合原始 SQL 中username = '后面的单引号,让 "admin" 成为一个完整的字符串条件,为后续拼接新条件铺路。
  2. or 1=1or表示 "或" 逻辑,1=1是永远为真的表达式。这使得整个WHERE条件变成 "用户名是 admin,或者1=1",最终结果永远为真。
  3. -- :这是 SQL 中的注释符号,会将后面所有内容(包括原始的密码验证部分' AND password = '...)注释掉,使其不参与查询执行。

(3)最终结果

经过篡改后,SQL 查询会变成 "查询users表中所有数据"(因为WHERE条件永远为真),后台会接收到查询结果(通常是第一条用户数据,大概率是管理员账号),从而判定登录成功。

相关推荐
mooyuan天天21 小时前
CISP-PTE 日志分析2
网络安全·cisp-pte·日志分析
mooyuan天天2 天前
CISP-PTE 文件上传5
文件上传·cisp-pte·文件上传漏洞·黑名单绕过
mooyuan天天3 天前
CISP-PTE 文件上传1
文件上传·cisp-pte·文件上传漏洞
mooyuan天天3 天前
CISP-PTE 日志分析1
cisp-pte·日志分析·暴力破解
lightningyang9 天前
渗透入门之SQL 注入(二)
数据库·sql·渗透·sql注入
lightningyang14 天前
渗透入门之SQL 注入(1)
数据库·sql·渗透·sql注入·天枢一体化虚拟仿真平台
mooyuan天天18 天前
CISP-PTE 命令执行1
cisp-pte·命令执行·命令执行漏洞
逻极20 天前
Python MySQL防SQL注入实战:从字符串拼接的坑到参数化查询的救赎
python·mysql·安全·sql注入
码农12138号1 个月前
Bugku 2023 HackINI Virtual Shop 和 2023 HackINI Virtual Shop 2
web安全·sqlite·sql注入