强网杯线下赛小记
这次比赛整体来说质量还是很高的,可惜线下赛就一道Web题,外加i春秋平台网络拓扑的限制,导致很多好玩的操作都打不出来。不过,也正是因为只有一道Web题,才能见识到各位选手们新颖的思路:如何用100种方式把别人的Gamebox打down😂。整个比赛,基本都是在维护Web服务,保证Web不down。
整个Web题,至今已知的大概有一个任意文件读、前台一个任意文件写、后台一个任意文件写、任意文件读、N个SQL注入和一个越权操作。以前一直以为线下赛的最终目的就应该是寻找漏洞,获得RCE,种后门,维持权限。也因此,我一直以为在线下赛,XSS、SQL注入、SSRF、越权等等一般都不需要考虑的。然而,经过这次比赛,我才真正意识到原来一个SQL注入也可以在线下赛展现出这么大的威力。
以下总结一下比赛过程中学习到的一些基础知识。
Mysql基础知识
在比赛过程中,由于刚重置mamp一些配置都没了,导致在本地怎么也搭建不起来,记录一下。
localhost和127.0.0.1的异同(仅针对mysql,和linux的localhost、127.0.0.1不一样):
localhot(local) 是不经网卡传输!这点很重要,它不受网络防火墙和网卡相关的的限制。 127.0.0.1 是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。 一般设置程序时本地服务用 localhost 是最好的,localhost 不会解析成 IP,也不会占用网卡、网络资源。 有时候用 localhost 可以,但用 127.0.0.1 就不可以的情况就是在于此。猜想 localhost 访问时,系统带的本机当前用户的权限去访问, 而用 IP 的时候,等于本机是通过网络再去访问本机,可能涉及到网络用户的权限。
所以:
- mysql -h 127.0.0.1 的时候,使用 TCP/IP 连接
- mysql -h localhost 的时候,是不使用 TCP/IP 连接的,而使用 Unix socket;此时,mysql server 则认为该 client 是来自 “localhost”
因此,如果要用127.0.0.1来进行连接时,一定要开启MAMP的Allow network access to MySQL
功能,不然会出现connection refuse的现象。
此外,如果要修改parameters.yml文件中的配置,使连接走localhost socket通道,那么需要首先删除app/cache文件,才能真正使能我们的修改内容。
这个Web题有基本没有限制的SQL注入,导致攻击手可以任意修改数据库信息,包括用户密码、用户、各种数据库操作。
记录一些攻击方式和防御措施:
drop database edusoho;#删库
update mysql.user set authentication_string=PASSWORD('hi23333');# 修改所有用户密码
flush privileges;
UPDATE mysql.user SET User='aaaaaaaaaaaa' WHERE user='root';
flush privileges;
#降权
grant all on *.* to moxiaoxi@localhost identified by 'moxiaoxi';#一句话完成,具体权限修改all
grant select, update on dbname.* to username@'%' identified by 'password'
CREATE USER 'test'@'localhost' IDENTIFIED BY '123456'; #create user使用
GRANT ALL ON databasename.* TO 'dog'@'localhost';
flush privileges;
delete from mysql.user ;#删除所有用户
flush privileges;
可以用一个bash无限执行来保护数据
#!/bin/sh
sql="
delete from user where id=1;
delete from user where id=2;
delete from user where id=3;
INSERT INTO user VALUES (1,'admin@admin.admin','','ceVlajyMRMai5fZgMsVWONHqT1oo5yO/ZZUvPMMTs1A=','34zq6f815g84ww44ww0wsckk44kok04','','',NULL,'','admin','admin','','default',0,0,'public://default/2017/09-27/21374040438b731443.png','public://default/2017/09-27/213740403024308615.png','public://default/2017/09-27/213740401c25733180.png',1,1,'|ROLE_USER|ROLE_TEACHER|ROLE_SUPER_ADMIN|',0,0,0,0,0,0,0,1506566358,'172.17.0.1','qc8phortur7geu00bpitu024o1',0,'unapprove',0,0,'',1506519316,1506566358,NULL,1,'1.',''),(2,'user_seoadickk@edusoho.net','','+9tE6Xx7na+CK/NpolrRQEISKt7wYGpGQNcCimz9aME=','pr35kto2ilcgw4k008kgs4s8gwo0gc8','','',NULL,'','userm0zktb(系统用户)','','','system',0,0,'','','',1,1,'|ROLE_USER|ROLE_SUPER_ADMIN|',0,0,0,0,0,0,0,1506564289,'172.17.0.1','6hpidoqjs0cqnhfvmbdc91avq2',0,'unapprove',0,0,'',1506519316,1506564289,NULL,1,'1.',''),(3,'teacher@teacher.teacher','','ns+vr5Mxwmdtm37RzAE9OO5H6pDYzvMLw27daoQfDo0=','sr6c1dqxx2s80000wogks40skwc888g','','',NULL,'','teacher','','','import',0,0,'','','',0,1,'|ROLE_TEACHER|ROLE_USER|',0,0,0,0,0,0,0,1506568255,'172.17.0.1','43vmu844mthr4jeavgllld6ol5',0,'unapprove',1,0,'172.17.0.1',1506519434,1506568255,NULL,1,'1.','');
delete from course_set_v8 where id=1;
INSERT INTO course_set_v8 VALUES (1,'normal','飞猪普通课程','','',0,NULL,'','',0,'','published',1,1506519674,1506567784,'none',0,0,0,9,0,0,0,1,'1.',0,10.00,0,100,0,0,0,0.00,0.00,'|1|',1);
delete from classroom where id=1;
INSERT INTO classroom VALUES (1,'飞猪提高班','published',NULL,0,NULL,0.00,0,'','','',3,'[\"1\"]',NULL,0,0,4,0,0,0,0,0,0,0,0.00,1506564550,1506567866,NULL,0,0,100,0,100,1,1,'0',1,'1.','forever',0,1);
"
MYSQL="/Applications/MAMP/Library/bin/mysql -uroot -proot -Dedusoho"
result="$($MYSQL -e "$sql")"
echo $result
此外,还可以通过触发器来进行保护,不过由于很难知道check检查了哪些地方,很容易修挂。
Tips
这个比赛可以使用.htaccess,所以导致基本上很难写shell。所以后期大家都在尝试打down别人的服务。而如果此时我们有一个任意命令执行,我们就有一个很好的思路来打别人。
假设你找到了任意一个rce,你可以直接通过这个RCE快速写一个内存马(或者竞争内存马等等)。然后迅速用一句话执行system指令,修改对面数据库user密码,使对方down机。那么,只要对面不存在一个已连接上数据库的session,他就永远无法知道现在的数据库密码是多少,所以他的gamebox肯定一直处于down机状态。而与此同时,我们还可以通过之前的内存马持续收割flag。这样整个流程下来,我们就能让对方又down又丢分。
而如果对方选择重置服务器,那么只要在他修复漏洞或者删站之前能够重新再打一发rce,我们就又能修改对面数据库密码。也就是说,如果我们的速度足够快,理论上可以让对面永远修不好自己的服务。至于内存马的权限维持,就得看大家自己的权限维持手段了。