加载中...

【Root-Me】 SQL injection - authentication



SQLi 水题,为了方便构造 payload 建议使用 Burp Suite 。

初步猜想 SQL 是这样的:

select * from account where Login = '${Login}' and Password = '${Password}'

Login 和 Password 都可以注入,注入任意一个即可。

由于题目要求我们找到 administrator 的密码,我们把 Login 的值固定为 administrator 就好了。


在 Password 输入任意值提交,报错 Error : no such user/password

尝试在 Password 构造探针 :exp' or '1'='1

虽然注入成功,但是查询结果只返回了一个账密: user1 / TYsgv75zgtq

不要着急用这个密码去验证,题目要求找到 administrator 的密码,而不是 user1 的密码。

换言之可能 account 表里面只有普通用户的账号记录,我们需要把目标转移到 系统表

由此先想办法找到数据库类型,这样就可以间接确定系统表名称,再跨表查询


要知道数据库类型,可以尝试构造错误的 payload 令 SQL 解析失败,看看会不会抛出异常到前端。

尝试在 Password 构造 payload :'exp error' (即不闭合引号),前端抛出异常,发现这是 SQLite3 数据库。

在 SQLite3 中只有一个系统隐藏表 sqlite_master ,其表结构如下:

CREATE TABLE sqlite_master (
    type TEXT,
    name TEXT,
    tbl_name TEXT,
    rootpage INTEGER,
    sql TEXT
);

虽然这张表不是用来存储用户账密的,但他存储了数据库中每个数据表的信息,可以通过它找到其他数据表。

在 Password 构造 payload 跨表查询 (注意末尾 -- 注释掉原 SQL 中多余的内容) :

exp' or 1=1 union select name, sql from sqlite_master --

直接就获得 administrator 的密码,挑战成功。

其实这题不像是真正的数据库环境,感觉就是一个沙箱根据输入的内容做出对应的预设反应。


答案下载

flag 下载后的 flagzip 的文件需要手动更改后缀为 *.zip,然后解压即可(为了避免直接刷答案)


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
  目录