一、前期准备

根据比赛规则所知,这是一道综合web渗透题,题目一共包含5个flag。

首先我们访问靶场地址:http://192.168.60.5

通过分析可以得出,该网站为一个个人博客,使用的CMS是WordPress5.8.2,编程语言是PHP,数据库是MySql,操作系统是Debian,使用的WordPress主题是Zakra。

接着我们使用nmap对该IP进行目录扫描:

发现该IP仅开放了80(sql)和3306(mysql)端口,因此判断flag可能就藏在WordPress网站或者数据库中。

二、【宝藏1】

1.登录网站后我们首先看到一篇叫【你好!冒险家!】的文章。

2.阅读之后我们知道了题目一共设置了5个flag。另外我们还发现了一行蓝字,让我们可以去武器库看看。

3.找到武器库后,我们发现里面内置了一些工具,猜测可能与解题有关。根据介绍推出可能有编码题、目录泄露、爆破、SQL注入题等题型。

4.回到首页我们发现还有第二篇博客,名字叫【第一个宝藏】,想必这里应该藏匿了第一个flag。

5.我们访问后,发现是一串看不懂的字符串,但是根据提示说可能和密码学有关,而且有张写着b64的图片,猜测该字符串可能经过base64编码了,我们又想到武器库中有base64解码器,于是去解码试试。

6.解密后得到第一个flag{G1ft_At_F1rst_S1ght}

三、【宝藏2】

1.在武器库中我们还发现了目录扫描工具。

2.于是我们尝试对文章目录进行扫描,看看有什么可以利用的点。

3.我们发现了有www.zip,robots.txt等文件。

4.于是我们先尝试访问robots.txt,发现题目提示第二个宝藏可能在/wp-admin这个目录下面。

5.于是我们访问这个目录,发现是WordPress的管理后台。

6.我们右键查看源代码看看有没有源码泄露的问题。

7.右键查看源码,通过搜索flag字段我们发现了第二个flag,flag{YOur_Are_s0_Lucky_This_1s_Fl4g}

四、【宝藏3】

1.打开刚刚下载的www.zip,发现是网站源码,对源码全局搜索"flag{"字段发现dashboard.php中存在flag,但是内容被隐去。

2.我们发现该文件位置在wp-admin下,猜测可能是管理员用户的文件,想要读取这个文件需要进入管理后台。

3.另外根据武器库的提示,我们发现有一个爆破字典6000.txt,猜测可能需要爆破才能进入管理后台。

4.根据文章发布的作者,我们发现系统后台应该存在一个admin用户。

4.于是我们打算使用武器库提供的6000.txt爆破字典进行弱口令爆破。

5.打开bp抓去后台登录包,将其发送到intruder模块进行爆破,其中log=admin不变,设置pwd的值为变量。

6.通过对响应包对长度进行排序,发现当pwd=x12345678的时候包长度和其它包不一样,推测WordPress的后台密码可能为x12345678

7.使用admin/x12345678进行验证,发现登录成功,获取到第三个flag,flag{The_c0de_1s_0pen_Sesame}。

五、【宝藏4】

1.根据题目关键字“数据仓库”和武器库中包含sqlmap,猜测第4个宝藏应该在数据库中,考点应该是sql注入。

2.打开www.zip发现致冒险家们.txt、wp-login.php和wp_lostpassword.php三个文件的修改日期和其它文件不一致,猜测出题人可能对这个三个文件进行了编辑。

3.打开“致冒险家们.txt”文件,发现提示大家进行代码审计。

4.于是对后面两个文件进行代码审计分析,发现wp_lostpassword.php中包含mysql对账号、密码、数据库名称以及select查询语句。

5.经过分析发现该查询语句没有进行任何过滤,直接将用户提交的参数【$username】拼接到select查询语句中进行数据库查询。另外不会审计的同学也可以通过自动化的审计工具进行代码审计。

6.通过文件名“wp_lostpassword.php”,可知该文件应该在忘记密码的地方,我们尝试在后台点击忘记密码去访问。

7.发现系统会把你输入的用户名带到系统中查询,而执行查询的文件操作的就是存在漏洞的“wp_lostpassword.php”文件。

8.通过测试语句1' or sleep(5)#,发先页面5s后才加载完成,证明数据库执行了休眠5s的操作,存在时间盲注。

9.通过输入paylaod:admin' order by 10# 不报错,而

admin' order by 11#  报错,可知该表存在十个字段值。

10.通过payload:1' union select 1,2,3,4,5,6,7,8,9,10# 可以判断回显字段。

11.发现回显点为第二位,证明可以进行联合注入。

12.于是我们把payload改为1' union select 1,version(),3,4,5,6,7,8,9,10#  成功查询了数据库的版本信息。

13.使用payload:1' union select 1,database(),3,4,5,6,7,8,9,10# 查询当前数据库。 

14.后面我们来正式获取flag,flag{This_1s_My_Dad_G0ld_Bank} 。

a.1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3,4,5,6,7,8,9,10# 查库名

b.1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = 'wordpress'),3,4,5,6,7,8,9,10# 查表名

c.1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name = 'flag'),3,4,5,6,7,8,9,10# 查列名

d.1' union select 1,(select flag from flag),3,4,5,6,7,8,9,10# 查flag

15.当然大家也可以使用武器库提供的sqlmap来直接获取flag。

通过bp抓post请求包保存为url.txt,然后使用sqlmap命令来进行sql注入:

python3 sqlmap.py -r url.txt --batch --dbs
python3 sqlmap.py -r url.txt --batch -D wordpress --tables
python3 sqlmap.py -r url.txt --batch -D wordpress -T flag --dump

16.当然有人可能想起来之前用nmap扫描发现主机对外开启了3306端口,并且我们也知道了数据库的账号和密码,是否可以直接用数据库管理工具连接读取flag呢?

答案是否定的。因为通过select user,host from mysql.user;

我们发现用户root的访问权限为localhost,表示root用户只支持本地访问,无法进行远程连接。

六、【宝藏5】

1.我们登录后台后,浏览了一下发现没有其它flag,猜测可能最后一个flag藏在Debian的服务器上,于是我们在后台寻找上传点,看看能不能上传webshell。

2.经过一番搜寻后,我们在外观-主题处发现了一个名字叫做websell的可疑主题,猜测可能是别人留下的后门。

3.但是我们不知道其真实路径,后来我们回想起我们在前期准备阶段了解到这个站点使用的是Zakra主题,而且我们现在手中又正好有这个网站的源码,这样我们就可以通过Zakra主题的位置来推测webshell的位置。

4.我们发现zakra中存在一个webshell.php。

5.我们后来打开发现原来是个假shell,内容为phpinfo。

6.虽然是假webshell,但是可以帮我确定位置,我们验证我们推测的地址是否可以直接访问,于是我们访问http://192.168.60.5/wp-content/themes/zakra/webshell.php。发现确实可以访问,证明我们推测无误。

7.目前有两个方案,一是去连接webshell主题中别人留下来的webshell,虽然我们可以推测出路径,但是我们不知道webshell的文件名和密码。另一方案是我们自己写一个webshell放到主题里面打包上传到网站中。

8.我们在主题处发现可以自己打包zip的主题压缩包进行上传。

9.于是我们修改zakra中webshell.php的内容为一句话木马。

10.然后重新打包上传。

11.发现此处也会爆出文件路径,我们直接点击替换,覆盖当前版本。

12.覆盖成功后参数使用webshell管理工具进行连接。

13.在根目录发现flag,flag{C0ngratu1at10n_0n_y0ur_Graduat10n}

七、思考

1.对sql注入不熟悉的同学其实可以先做【宝藏5】,然后使用webshell管理工具自带的数据库管理工具来直接读取【宝藏4】数据库中的flag。

2.没有找到【宝藏5】webshell上传点的小伙伴也可以通过【宝藏4】sql注入写shell的方式来直接向网站目录写入webshell。

python3 sqlmap.py -r url.txt --os-shell --batch

sqlmap写入的shell

直接读取flag

八、赛后复现

1.我已将本次赛题打包成镜像上传到dockerhub,想复现本次竞赛的同学可以自己拉取dokcer镜像。

使用方法:

#拉取docker镜像
docker pull kakaxi1996/acs_ctf:v5
#运行docker镜像,将容器内的80端口映射到本地80端口
docker run -d -p 80:80 kakaxi1996/acs_ctf:v5
#打开浏览器访问http://127.0.0.1即可

若想让除本机外的内网其它主机访问,需修改文件/var/www/html/wp-config.php中的以下地址为运行docker的宿主机对外的IP地址。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐