总结一下Session
众所周知,HTTP是一种无状态的协议,所以就需要一种机制来保存客户端的一些信息,这个时候session就派上用场了
session可以做到的事情有很多,比如最常见的记录登录状态,也可以当作客户个人数据库来使用
但是某些特定情况下,session也会导致一些安全问题
PHP
php session储存在服务端
php一般与nginx、apache一起使用,这种时候日志文件一般是root用户/adm(或者其他)用户组,www-data权限无法包含的,但是session却是www-data用户,也就没有权限上的问题
php session一般保存在/var/lib/php/sessions目录下,以sess_跟sessionid拼接的方式命名,可以通过php.ini配置文件或者phpinfo进行查看
session包含
如果网站存在可利用的文件包含点,且同时session中的内容可控(比如登陆之后的用户名),攻击者就可以通过包含session的方式来get shell
session upload
例题:http://web.jarvisoj.com:32784/
在php的默认配置下(这里我自行关掉了cleanup,为了方便查看上传session upload的结果)
upload_progress.enabled是打开的(哪怕在php.ini中是用;注释掉的,想要关掉就要修改php.ini,去掉注释,并将On改成Off)
在这种情况下,就算网站中session不可控,攻击者可以通过上传session的方式来控制session
参考资料:https://secure.php.net/manual/en/session.upload-progress.php
如果cleanup为On,那就需要使用条件竞争了
Python - Flask
Flask web框架的session储存在客户端
当然是经过加密的,加密的密钥的是Flask app运行的时候使用的secret_key,所以如果我们能获取到这个密钥,就能任意伪造session
脚本如下,从cookie中可以取得伪造的session