题
[GXYCTF 2019]BabyUpload
文件上传,先传个普通的一句话木马试试 ,发现提示被限制了,文件后缀不可以有ph,那么php3,php5,phtml等后缀自然无法使用了
那这里的思路我觉得应该是,先判断到底是文件内容被黑名单了,还是文件后缀被黑名单了,一句话来说就是它审核的是文件类型还是文件内容,所以这里选择传个jpg的图片马看看
文件是传上去了,但是文件的木马并没有被传上去,或者说木马的内容没有被执行
那么这里考虑应该就是,对文件的内容进行了判断,那么这里的思路就是再上个.htaccess文件或者.ini文件让图片马的内容被执行
说明上传类型有问题,抓包更改,因为图片形式可以传成功,所以就改成图片形式
上传成功了,然后再上传图片马,获得了路径
访问看看路径
被成功执行,那现在直接用蚁剑连接
在根目录里面找到了flag文件
拿到了flag
[HNCTF 2022 Week1]easy_upload
还是先上传一个纯木马,看看限制条件
访问
蚁剑连接,虚拟终端,命令cat /f*
得到了flag
[SWPUCTF 2022 新生赛]ez_rce
看看源码
源码里面也没有东西,这里我的思路呢是用dirsearch或者御剑扫扫看,看看有没有什么有用的文件
根据经验这里先选择看看,robots.txt文件,看看有没有什么有用的信息
这里给了提示,访问这个网页看看
这里给的提示就是,Think PHP 5 RCE漏洞,然后版本是5.0
然后不断执行命令查看目录,查看flag相关文件就可以了,这里题目环境出问题了,不能执行,隔了一天也没用,所以就不演示了
[NISACTF 2022]bingdundun~
文件上传,给了提示,是要图片类型或者压缩包类型
这里选择先上传一个图片马试试看
获得了路径,访问
返回了一开始的页面,说明木马可能没有被执行
蚁剑连接,发现确实没有被执行成功,本来的思路是再传一个.htaccess文件,然后抓包改类型
但是不行,ini文件也是一样,还是传不上去,看了其他师傅的wp以后发现这里要用的是phar协议
phar协议
phar:// --- PHP 归档
phar://、zip://、bzip2://、zlib://
用于读取压缩文件,zip:// 、 bzip2:// 、 zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。(Phar伪协议是PHP的一个特性,它允许直接从Phar归档中读取文件,而不需要将Phar文件解压)
了解这个知识点以后呢,这道题就有两种解法了,一种是改一句话木马文件的后缀改成zip,然后用phar协议读取一句话木马文件;另外一种是构造phar文件,phar文件包含想要执行的代码,由于index页面提示,flag就在该目录下,因此如果能直接执行cat /flag 就能出结果了。
这里先补充一个细节。
即url有参数bingdundun,和flag文件位置提示
方法一:phar协议读取一句话木马
phar://example.phar/somefile.php
解释:phar://
是协议,example.phar
是Phar文件的名称,somefile.php
是Phar文件中的一个PHP文件。
上传成功(为什么最后不是/shell.php而是/shell,是因为后台会自动加上.php,
后面知识点会提),检测路径以后,蚁剑连接就可以
然后再根目录找flag文件就可以了
方法二:构造phar文件
先创建一个pharfile.php文件
$phar = new Phar("example.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
浏览器访问该文件,在同目录下会生成exp.phar文件。复制一份改成zip格式,然后上传,上传了以后,用phar协议读取创建的pharflie.php文件用&连接里面的参数
[SWPUCTF 2022 新生赛]where_am_i
进来给了提示,11位数字,盲猜电话号码,随便输了一个
但是不对,爆破也跑不出来,猜测应该是这个店的电话号码。。。那就变成misc了
百度识图找了一下
百度找了一下电话
得到了flag
[MoeCTF 2022]baby_file、
就给了一个参数,扫扫后台还有没有什么文件
发现了一个flag.php文件,filter伪协议读取
解码,得到flag
[SWPUCTF 2022 新生赛]xff
关键词:自己的电脑。抓包改个xff看看
又给了提示,jump from home page,要从主页跳转,那就改一下refer头(它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源)
得到了flag
[鹤城杯 2021]Middle magic
代码审计
三层
第一层:GET传参,需要传入一个参数,对其进行正则替换掉/^(.*)level(.*)$/
得到$aaa
,再对$aaa
正则匹配,需匹配到pass_the_level_1#
;
在正则匹配单行模式(?s)
下 ,.
号将匹配所有字符,包括换行符;但默认情况下点号不匹配换行符,因此给了绕过(.*)
的可能。
payload:%0apass_the_level_1%23
,%0a、%23分别是换行符、井号的URL编码。
进入第二层
第二层:
sha1强比较,可以用数组绕过,利用哈希函数无法处理数组,会返回结果null,POST传参的形式
进入第三层
第三层:需要传入一个level_3
参数,经过json_decode()之后与内置的$result
变量弱类型比较相等(==)
具体来说,要求我们POST提交一个level_3变量,是json格式的。要满足level_3变量的result键的值 与result变量相等,但是result变量在index.php中未定义,在result.php中是否定义,未知,所以result变量具体值是多少我们无从得知。暂且将他当成未定义,那么值就是空,NULL。实际测试证明,这里level_3只要POST了就行,值是多少都可以。因为空`NULL`和什么东西弱比较都是true,那么就验证了猜想,`result`变量未定义。
那以下payload都可行
&level_3={"result":"chxvjxkvjckvrfghrekj"} //随机值
&level_3={"result":0} //值为0
&level_3={"result":} //值为空
&level_3=
得到了flag
知识点
文件上传
相关资料参考
文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案_00截断修复方案-CSDN博客
其他扩展的话,还是要通过多做题来积累
Thank PHP v5 框架漏洞
简介:thinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于[框架]对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本。
此版本是5.0版本所以可以利用此漏洞查找flag
这个漏洞我们可以在网上找到payload,?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=
1.index/是对应的模块
2.\think\app 以反斜线开头,这就是我们想要实例化的类
3./invokefunction是让\think\app类想要调用的方法,
4.function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1是对应invokefunction的参数。(这里的phpinfo和1,是可变参数,比如可以为system和ls /
phar
PHAR(PHP Archive)是一种用于将多个PHP脚本文件打包成单个归档文件的格式。这种文件格式旨在简化PHP应用程序的分发和部署,并提供了一种安全的方式来执行和管理PHP代码。PHAR文件可以包含PHP脚本、资源文件、配置文件等,并且可以被像任何其他PHP脚本一样执行。
1.phar 伪协议无论读取什么文件,都会将其视为压缩包进行解压缩,然后作为 php 代码执行,在文件上传类漏洞中经常被用到。
2.Phar伪协议是PHP的一个特性,它允许直接从Phar归档中读取文件,而不需要将Phar文件解压。这样可以直接从Phar文件运行PHP脚本,而无需在服务器上物理地提取文件。
例如,如果你有一个名为example.phar的Phar归档文件,你可以通过以下URL运行其中的PHP脚本:
phar://example.phar/somefile
在这个URL中,phar://是协议,example.phar是Phar文件的名称,somefile.php是Phar文件中的一个PHP文件。
提到这里的话,再提一嘴其他的
phar://、zip://、bzip2://、zlib://都可用于读取压缩文件,zip:// 、 bzip2:// 、 zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif zip xxx 等等。而phar://的伪协议,可以将任意后缀名的压缩包(原来是 .phar 或 .zip,注意:PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行 ) 解包,从而可以通过上传压缩包绕过对后缀名的限制,再利用伪协议实现文件包含。
而在涉及知识点题目中,url栏有个GET传参。传值为index,发现回显好多个//index.php
,猜测这里传参,会自动帮我们加上一个.php
,我们传?bingdundun=index
,后台解析为?bingdundun=index.php
,然后进行文件包含。所以读取文件没有后缀加php。
再详细的phar博客
『PHP』phar文件详解_phar文件格式_调用phar类方法生成phar文件_php phar-CSDN博客
preg_replace()
preg_replace()
是 PHP 中用于执行正则表达式替换的函数。它可以在字符串中搜索符合正则表达式模式的部分,并将其替换为指定的内容。这个函数的语法如下:
preg_replace($pattern, $replacement, $subject [, $limit = -1 [, &$count = NULL ]]) : string|array|null
参数说明:
$pattern
:要搜索的正则表达式模式。$replacement
:替换模式。可以是字符串,也可以是字符串数组。如果是字符串数组,则替换与模式匹配的内容时会依次从数组中选择替换的内容。$subject
:要在其中进行搜索和替换的目标字符串或字符串数组。$limit
(可选):指定最大替换次数。默认值为 -1,表示无限制地进行替换。&$count
(可选):一个变量,用于存储替换次数。
preg_replace()
函数返回替换后的字符串或字符串数组,如果没有找到匹配项,则返回原始的 $subject
。
简单来说,
preg_replace:只能匹配一行的数据。
如果代码替换了abc,但后面又要求有abc,可以用%0a(换行符)
%0apass_the_level_1%23
%0a换行符,%23井号。
举个例子,假设我们有一个字符串,想要将其中所有的数字替换为 "X",可以使用 preg_replace()
函数实现:
$str = "Today is 2024-06-13."; $newStr = preg_replace('/\d/', 'X', $str); echo $newStr; // Output: Today is XXXX-XX-XX.
在上面的例子中,正则表达式 /d
匹配任意数字,然后将其替换为 "X"。
json_decode()函数
json_decode()
是 PHP 中用于将 JSON 格式的字符串转换为 PHP 变量(通常是数组或对象)的函数。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于阅读和编写,也易于解析和生成。
json_decode()
函数会尝试将 JSON 字符串解析为 PHP 变量,并返回解析后的结果。如果解析成功,则返回相应的 PHP 变量;如果解析失败,则返回 NULL
。如果给定了 $assoc
参数,并且其值为 TRUE
,则返回的是关联数组;否则返回的是对象。
扩展