[极客大挑战 2020]Roamphp2-Myblog
源码
<?php
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){
if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){ // No one knows my password, including myself
$logined = true;
$_SESSION['status'] = $logined;
}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){
echo "<script>alert('username or password not correct!');window.location.href='index.php?page=login';</script>";
die();
}
if(isset($_FILES['Files']) and $_SESSION['status'] === true){
$tmp_file = $_FILES['Files']['name'];
$tmp_path = $_FILES['Files']['tmp_name'];
if(($extension = pathinfo($tmp_file)['extension']) != ""){
$allows = array('gif','jpeg','jpg','png');
if(in_array($extension,$allows,true) and in_array($_FILES['Files']['type'],array_map(function($ext){return 'image/'.$ext;},$allows),true)){
$upload_name = sha1(md5(uniqid(microtime(true), true))).'.'.$extension;
move_uploaded_file($tmp_path,"assets/img/upload/".$upload_name);
echo "<script>alert('Update image -> assets/img/upload/${upload_name}') </script>";
} else {
echo "<script>alert('Update illegal! Only allows like \'gif\', \'jpeg\', \'jpg\', \'png\' ') </script>";
}
}
}
?>
解题步骤:
有个登录框,尝试注入,无果。但是url好像有点东西。于是用php伪协议尝试读取源码。
如果加了后缀php,什么都没有。根据上面page传参的规则,盲猜自动加入.php后缀。
所以直接去掉php后缀就能读取。
读了一些,有用的就上面这段,来自admin/user.php
$_POST['password'] == $_SESSION['password']
需要绕过这个,抓包,发现phpsession,直接清空,然后密码清空,这样就能相等了。
登录之后,经典文件上传。在前面已经得知可以使用php伪协议。虽然末尾自动添加php后缀。
所以phar不能用了,因为绕不过末尾的php后缀。但是可以用zip伪协议
zip:// + zip路径 + %23 + php文件名
http://173.82.206.142:8006/?page=zip://./upload/6f49107b371dc2c26e97d8579ecf2c0979936271.jpg%231这里不加.php后缀是因为在index.php包含的时候默认加上了
在本地写一个php马,然后打包成zip文件,改后缀为png。上传。
复制路径,在page进行zip伪协议
然后就能得到flag。
注意:如果在本地编写的php名为asd.php
,而且把这个php文件压缩了,zip://./assets/img/upload/200bbd706272fd357d0dbee16f45529b0c210b22.png%23asd
末尾就要为asd.php(本题自动添加后缀),而且,#必须为%23