具体场景——session

我们可以查一下手册,看看这个参数是默认开启:

举栗子

通过上传一个orange作为key传一个值传给这个变量,放到file函数中,再去比对file函数读取结果文件中的第一行0前面六个字符串是否匹配,如果是orange就会作为包含,否则就会显示源代码。

这道题的难点在于包含一个文件要控制里面的内容,file函数的作用是把一个整一个文件读到一个数据中去,filename要读取文件名:

Session.upload_progress.enabled这个参数会生成一个上传进度文件,如何生成、是否可控以及它有什么用呢?

用curl来操作

可以尝试着在后面再去跟一个文件,再次传一个表单。

会发现这个文件是可以留下来的,这段文件内容其实你是可控的,这个地方的值可以直接包含漏洞进行利用了,但是它反而没有这么简单,因为题目在实际判断中,需要读取文件的前六位。upload progress之后的字符串是可控的,之前的却是不可控的,这个地方又是下一个突破点。
 
upload progress不可控就没有办法进行绕过,想办法让它可控,可以考虑运用伪协议进行突破的时候做一个消失。php://filter/convert-base64.encode去做一个文件读取的操作,base64可以让它转码,

如果在后面跟两个等于号会怎样呢?

会发现它返回的结果还是一样的,base64在解码的时候,先做一个正值匹配,把非base64字符串去掉变成空格,自动删去空格再做解码 。

四个字符串解一次就会变成三个字符串再解一次。二次解码之后,如果不在base64之列就会忽视掉这些东西自动消失,直到第三次解码最后拼接一些字符串。

运行后返回一个字符串,有了这个字符串之后就可以把它拿来用了。

会发现它的长度变小,说明成功了

这个文件会在tmp目录下去生成一个web,成功实现getshell。