- 来源:Root-Me
- 题型:Web-Server
- 题目:SQL injection - authentication
- 分数:30 Points
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
,然后解压即可(为了避免直接刷答案)