session利用的小思路
前言
做题的时候经常考到session利用,常见的基本就两种,session文件包含和session反序列化,之前没有详细总结过,就写写吧。
session文件包含
php.ini
session的相关配置
session.upload_progress.enabled=on//enabled=on表示upload_progress功能开始,也意味着当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中;session.upload_progress.prefix="upload_progress_"//将表示为session中的键名session.upload_progress.name="PHP_SESSION_UPLOAD_PROGRESS"//当它出现在表单中,php将会报告上传进度,而且它的值可控!!!session.use_strict_mode=off//这个选项默认值为off,表示我们对Cookie中sessionid可控!!!session.save_path=/var/lib/php/sessions//session的存贮位置,默认还有一个/tmp/目录
当session相关配置如上的时候,我们可以利用session.upload_progress将恶意语句写入session文件,从而包含session文件。
平常,当我们要创建session时往往会在php代码里写session_start(),但我们不写的话,也是可以创建的。
比如,在php.ini中设置session.auto_start=On的情况下,php在接收请求的时候会自动初始化session,不需要执行session_start()。但默认状态下,这个选项是默认关闭的。
不过幸好,session还有一个默认选项,session.use_strict_mode默认值为0。
这样用户是可以自己定义sessionID的。比如,我们在cookie里设置PHPSESSID=AndyNoel,就会在服务器/tmp目录下或者/var/lib/php/sessions/目录下创建一个文件:sess_AndyNoel。即便没有设置自动初始化session,php也会产生session,并生成一个键值,这个键值由ini.get("session.upload_progress.prefix")+我们构造的session.upload_progress.name值组成,最后被一起写入sess_文件里。
[WMCTF]MakePHPGreatAgain
?phphighlight_file(__FILE__);require_onceflag.php;if(isset($_GET[file])){require_once$_GET[file];}//Pleasehackmewithyour0day!
很容易发现存在一个文件包含漏洞,但找不到能包含的恶意文件,那我们就可以往session里面写入恶意内容,然后包含它。
1、份很多已经买不到的绝版电子书2、30G安全大厂内部的视频资料3、份src文档4、常见安全面试题5、ctf大赛经典题目解析6、全套工具包7、应急响应笔记8、网络安全学习路线
session维持
按照上面说的思路创建好session后,问题又来了,那就是在php.ini往往还有一条设置
session.upload_progress.cleanup=on//表示当文件上传结束后,php将会立即清空对应session文件中的内容
默认配置session.upload_progress.cleanup=on导致文件上传后,session文件内容立即清空,清空了就没办法利用了。我们要想办法把session留在里面,所以就要利用条件竞争,在session文件内容清空前进行文件包含利用。
方法一
借助BurpSuite
可以在本地写一个上传页面,然后抓包添加Cookie:PHPSESSID=AndyNoel,再用BurpSuite爆破
!DOCTYPEhtmlhtmlbodyformaction="