极客大挑战 2019 EasySQL 1(万能账号密码,SQL注入,HackBar)

题目

做法

启动靶机,打开给出的网址

随便输点东西进去,测试一下

输入1、1'、1"判断SQL语句闭合方式

输入以上两个都是以下结果

但是,输入1'时,出现的是另外结果

输入1,1"时,SQL语句没有报错,只是提示我们输入的值是不对的,而输入1'时却有截然不同的结果,因此我们可以先假设SQL语句闭合方式是单引号

注:以下sql语句如'1" ' 实际上是'1"' ,这里只是为了快速区分

(1)一般情况下,SQL语句闭合方式为单引号

当用户名为1时,形成的sql语句是

select * from table_name where username='1' and password='123';

当用户名为1"时,形成的sql语句是正确的

select * from table_name where username='1" ' and password='123';

当字符串内需要包含双引号时,除了使用转义字符外,也可以使用一对单引号来包括字符串。此时字符串内的双引号被视为普通字符,无需特殊处理

同理,当字符串内需要包含单引号时,除了使用转义字符外,也可以使用一对双引号来包括字符串。此时字符串内的单引号被视为普通字符,无需特殊处理

补充

使用(转义字符)来判断SQL注入的闭合方式

原理:当闭合字符遇到转义字符时,会被转义,那么没有闭合符的语句就不完整了,就会报错,通过报错信息我们就可以推断出闭合符。

分析报错信息:看\斜杠后面跟着的字符,是什么字符,它的闭合字符就是什么,若是没有,则为数字型。

(但是在本题中有两个变量,这个方法不太适用)

当用户名为1'时,形成的sql语句是错误的

select * from table_name where username='1' 'and password='123';

第一个单引号和第二个单引号形成了新的闭合,剩余第三个单引号,组成的sql语句不正确,于是语句报错

因此,SQL语句闭合方式是单引号

(2)假设MySQL语句为双引号闭合

username输入1时,形成的sql语句是正确的

select * from table_name where username="1"and password="123";

username输入1"时,形成的sql语句是

select * from table_name where username="1" "and password="123";

正确的SQL语句不可以出现一对双引号包含双引号的。所以上面这条应该出现SQL报错,但实际没有报错,因此我们假设的双引号闭合方式是不成立的

username输入的是1',形成的sql语句是正确的,不会报错

select * from table_name where username="1' "and password="123";

而然实际上这条语句报错了,因此我们假设的双引号闭合方式是不成立的

综上,我们可以推出SQL语句闭合方式是单引号

进行SQL注入

万能账号密码获取入口:
万能账号密码使用详解,渗透测试常用的入门级操作 - 知乎

由上得:该数据库的闭合方式为单引号

因此,在理解完以上网页内容后,我们回归该题

当我们不知道用户的账号并且不知道用户的密码时,可以使用万能账号

我们随便挑选一个------a or true #

但是它上面的万能账号都没有加单引号'或是双引号"

因此,综上,我们需要在a后面加上本题的闭合符号," ' " 得出我们所需的账号为a' or true #

密码随便输即可(但是看到其他人通常这种情况都直接写一样的,不知道有啥玄机在里面,这里注意一下)

复制,回去题目提交flag

补充做法(使用HackBar,不过跟上面的大差不差)

自行下载HackBar V2

前提:

先看测试后的网址(与为刚从靶机点进来的网址进行对比),可以看到我们输入的账号密码都显示在url中,可知此处是get传参

补充:get传参------参数和 URI 之间用问号?隔开, 参数键值用等号=连接,然后参数之间用连接符&拼接起来

因为get传参为参数直接暴露在 URL 中,且网页文件名为check.php,只是处理登录校验的常见文件名,而非诸如 login.php(通过表单 POST 传参)等需要动用其他工具,则可直接使用HackBar 修改参数

点击启动靶机后给出的网址,弹出页面,按F12,选择HackBar V2(绿色图标那个)

按一下Load URL,即可获取当前页面的网址

然后随便输入用户名密码,进去后看看网址

我们直接看测试后多出的网址

username=后面跟的是账号

password=后面跟的是密码

因此,我们根据上面说的思路,把万能账号填进去,密码随便填,构造一下,复制

check.php?username=a' or true %23& password=1

然后填进Load URL得出的网址后面,点击Execute执行

解释:%23是#的 URL 编码形式,表示普通字符#,

在 URL 中,某些字符有特殊含义,需要使用URL 编码(即百分号编码)来表示,

类似于进制统一一样,为了避免不必要的麻烦,我们通常都把格式统一一下,

复制代码
   以下字符在 URL 中可直接使用,无需编码:
   字母:`a-z`、`A-Z`
   数字:`0-9`
   部分符号:`-`、`_`、`.`、`~`
但是遇到特殊字符的时候,最好去查一查看下要不要转变成URL

得出flag

更新

于2025.06.04

相关推荐
·云扬·6 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师7 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
IT邦德7 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫7 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i7 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.7 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn7 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露8 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星8 小时前
sql语言之分组语句group by
java·数据库·sql