[GXYCTF2019]BabysqliV3.0
看到页面有一个登录框,我们用admin/password就登录成功了
我们发现url有点眼熟,我们尝试php伪协议读取文件
1 | /home.php?file=php://filter/convert.base64-encode/resource=home |
得到home.php的源码
1 | <?php |
同样的,我们读取upload.php的源码
1 | /home.php?file=php://filter/convert.base64-encode/resource=upload |
1 | <?php |
预期解
由于__destruct() 方法中,想要 eval($this->cmd); 的前提条件是 $this->token 和$_SESSION[‘user’] 相等
1 | function __destruct(){ |
在__construct() 方法中可见如下两行代码
1 | $sandbox = getcwd()."/uploads/".md5($_SESSION['user'])."/"; |
因此可以先随便上传一个 txt,得到的路径中,.txt 前面的就是 $_SESSION[‘user’]
得到:GXY76f8a4e2acfb26839a076ae2ac5bc5d6
,生成phar,并将生成的phar上传
1 | <?php |
得到路径/var/www/html/uploads/93cd61477a821014fa4b00df090ebdcd/GXY3fb034f8f0c46f14bf11438f9afccbf4.txt
然后将这个路径带上 phar:// 作为 name 参数的值,再随意上传一个文件,因为 $this->Filename 被我们手工指定为 phar,触发了 phar 反序列化导致命令执行
Payload:
1 | /home.php?file=upload&name=phar:///var/www/html/uploads/93cd61477a821014fa4b00df090ebdcd/GXY3fb034f8f0c46f14bf11438f9afccbf4.txt |
非预期
由于echo file_get_contents($uploader);
上传后会显示出$uploader 这个文件的内容,所以只要使 $this-Filename 为 flag.php 然后随便传个东西就会得到 flag 了