为什么会有文件包含漏洞?
因为将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性, 从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。文件包含函数的参数没有经过过滤,可以被攻击者控制,包含其他恶意文件,导致了执行恶意的代码。
什么是文件包含漏洞?
PHP的文件包含可以直接执行包含文件的代码,包含的文件格式不受限制(无论是txt、图片文件还是远程URL,全都作为PHP代码执行),只要能正常执行即可。文件包含函数有include()、include_once()、require()、require_once(),它们之间的区别在于include()和include_once()在文件包含时即使遇到错误,下面的代码仍继续会执行;而require()和require_once()则会直接报错退出程序。【摘自《代码审计——企业级Web代码安全架构》】
一:知识大概
1. 伪协议:
php://fiter:convert.base64-encode和convert.base64-decode的使用方法(这两个在CTF web题目中经常出现)
应用方法一般为:
php://filter/read=convert.base64-encode/resource=<数据源>
使用file2=php://input,将执行代码通过在POST data中提交
file2=data://text/plain,hello ctf
或者转换成base64编码
可以结合一句话木马成功链接网站
2.Session & Cookies
Linux系统下的session文件路径:/var/lib/php/session
session文件名的构造:sess_ + sessionid, sessionid在cookie中可以查看
session : 就是一个文件,文件名是一个ID号,内容就是用户的登录信息
存储在服务端,保存用户名,登录状态等信息
Cookies:session的ID号,浏览器自动存储
由服务器下发给客户端,保存在客户端的一个文件里. 保存的内容主要包括: SessionID
Session & Cookies 流程
当客户端访问服务器时,登录服务器页面,服务器会自动生成一个session文件,文件名是一个id号,内容为用户的登录信息,用户登录成功后服务器会返回一个页面(网页信息)给客户端,同时,也返回了cookie,cookie的值为session的文件名id号,藏在了数据包头里,存在客户端的浏览器里.
当客户端第二次访问网站时,因为客户端浏览器有cookie,所以客户端的浏览器会主动发送cookie到服务器上,证明曾经登录过.这样客户端就不用反复重复登录.
3.截断
问题:get参数中id内容无法完全传递?被截取?
示例:axios.get(http:localhost:300?id=09050#1669867676398#132)
结论:请求连接包含#,后边的参数获取都为空。
解决:1.使用post请求传递 2.编码转译(#=%23)
疑问:为什么会被截取掉?
第三题 session本地文件包含
查询sessionid
在第一关使用文件包含漏洞成功链接
第四题 远程文件
远程文件包含(remote file include,RFI)是指包含文件的位置并不在本地服务器,而是通过URL的形式包含到其他服务器上的文件,以及执行文件中的恶意代码
allow_url_fopen = On (允许打开URL文件,预设启用)
allow_url_fopen = Off (禁止打开URL文件)
allow_url_include = Off (禁止引用URL文件,新版增加功能,预设关闭)
allow_url_include = On (允许引用URL文件,新版增加功能)
开启远程文件条件:
allow_url_fopen=On
allow_url_include=On