2024-省赛决赛
2024-省赛决赛
Ec3o2024-省赛决赛
遇到了两位很强大的队友,有幸拿到了省一.(题目出的很好,下次不要再出了)
作为web手的我在做题的过程中其实还是遇到了不少阻力,包括但不限于不出网、模块不熟悉、对PHP部分了解比较生疏导致的.
Web
消失的第一题(?)
第一道是什么已经不重要了,全场唯一血+限制登录+黑盒已经让这道题目失去了原本的考察意义🤔,随他去吧
记得限制了登录用户密码长度不能超过9位,尝试超过一定次数会封1个小时不能打,注释里面写了sleep出现会被替换成NULL,看不懂
赛后交流了一下听说是弱密码?反正挺抽象一题
wucanrce
1 |
|
题如其名,“无参”RCE.没有参数的RCE.也就是说,我们只能使用函数,然后使用函数的返回值作为参数传递给其他函数最终来进行文件读取/命令执行.
题目特征
1 | if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['param'])) { |
正则表达式 [^\W+]\((?R)?\)
匹配了一个或多个非标点符号字符(表示函数名),后跟一个括号(表示函数调用)。其中 (?R) 是递归引用,它只能匹配和替换嵌套的函数调用,而不能处理函数参数。使用该正则表达式进行替换后,每个函数调用都会被删除,只剩下一个分号 ;,而最终结果强等于;时,payload才能进行下一步。简而言之,无参数rce就是不使用参数,而只使用一个个函数最终达到目的。
常用函数
无参RCE常用函数,我把它们分为三类,一种是引入函数(引入外界可控注入变量的),一种是中继函数(用来处理‘参数’的),一种是威胁函数(对目标进行实际操作的,比如文件读写、命令执行等.
获取环境信息
phpinfo()
引入函数
函数名称 | 函数作用 |
---|---|
getallheaders | 获取所有的请求头 |
get_defined_vars | 返回由所有已定义变量所组成的数组,会返回$_GET,$_POST,$_COOKIE,$_FILES 全局变量的值,返回数组顺序为 get->post->cookie->files |
session_start | 通过session_id(session_start())配合PHPSESSID Cookie传参来完成传参 |
localeconv | 返回一包含本地数字及货币格式信息的数组,其中数组的第一项是”.” |
hex2bin | 配合session使用,产生phpsessid中不允许使用的括号 |
dirname | 返回文件或目录路径中的父目录路径 |
中继操作函数
函数名称 | 函数作用 |
---|---|
array_pop | 删除数组中的最后一个元素,并返回被删除的元素的值.用于获取尾元素 |
array_flip | 交换数组中的键和值,成功时返回交换后的数组 |
array_rand | 从数组中随机取出一个或多个单元 |
array_values | 返回一个包含给定数组中所有键值的数组,但不保留键名。 |
array_reverse | 将数组内容反转 |
strrev | 反转给定字符串 |
next | 返回数组中下一个单元 |
current | 返回数组中的当前单元, 默认取第一个值 |
end | 将 array 的内部指针移动到最后一个单元并返回其值 |
prev | 返回数组中上一个单元 |
pos | 返回数组中的当前元素的值 |
威胁函数
函数名称 | 函数作用 |
---|---|
system | 执行系统命令,并在当前页面直接输出结果 |
file_get_contents,show_source,highlight_file,file_get_contents,readgzfile | 文件读取,展示源码 |
scandir | 扫描当前目录所有文件并以数组映射形式返回 |
readline | 等待终端输入,拒绝服务攻击 |
readline_add_history | 文件写入,使用readline_add_history来写入缓冲区 |
记不起来?全被ban了?留个妙妙小脚本看看?
获取0参函数
1 |
|
获取1参传递函数
1 |
|
常用Payload收集
命令执行
1 | 命令执行 |
构造点参
1 | 构造点参 |
当前目录文件读取
1 | 查看当前目录文件名 |
上级目录文件读取
1 | 查看上一级目录文件名 |
unserialize
类太多了还有好多小Trick,但是好几个没啥用,现场太长了先去打别的题了
源码如下
1 |
|
PHP的反序列化调用链
AAA.__construct()->AAA.__destruct()->AAA.__toString()->GGG.__invoke()->EEE.__get()->eval()
绕过小Trick
两次md5弱等于
1 | if(md5(md5($this -> book)) == 666) { |
弱类型绕过,找到一个两次md5以666开头,后续为字母的字符串,需要爆破一下
1 | import hashlib |
1 | Found matching string: |
循环引用绕过赋值
1 | $this->d[$this->e]=1; |
这里 $this->d[] = 1
会在 $this->d
数组的末尾添加一个新的值 1
,这是典型的 PHP 动态数组添加写法。
这种写法相当于 $this->d[] = 1;
并返回赋值的值(即 1
),因此整个表达式为 if (1)
,所以 if
条件成立。
但是如果设置$this->d[$this->e] = &$this->d;
则会把它的引用设置为它本身,从而进行循环赋值.只能说是非常神车了。
事后调试了一下发现给出的Payload不完全正确,正确的做法是把属性d和属性e都设置为NAN
导致赋值失败,就会进入else逻辑.
1 |
|
数据安全
数据安全1
从csv文件中提取有用的姓名、身份证号和手机号码,其中姓名由全中文构成,手机号为十一位长度并有限定号段开头,身份证号码有固定的格式和校验位.里面数据大概长这个样子
1 | 数据值 |
把处理完的数据提交到数据清理平台,正确率>98%就会给出flag.
1 | import csv |
数据安全2
给出wireshark
http
流量数据包,要求处理其中的数据,并读取其中混杂的数据,从中正则匹配出IP地址、身份证号和手机号,其中身份证号和手机号可能以非标准形式出现,需要使用模糊正则来进行处理.
我遇到的第一步也是最大的困难是导出请求正文。wireshark提供了一个导出对象的功能,可以导出HTTP请求的请求主体,在单独设置的时候可以设置保存文件名,批量保存就不可以了,默认的文件名/
存储到999就会一直覆写,很烦.
后来赛后进行复现的时候一个好兄弟找到我说可以导出成json再用python的json模块来做数据处理,很厉害.
提取所有请求包中的http.file_data_raw
字段中的第一部分,并用正则表达式遍历提取特征数据.
1 | I'll think of you every st552132197411262118ep of the way.Reading is to the mind while exercise to the body.The journey of a thousand miles begins with a single step.Time is money.A year's plan starts with spring.The first step is as good as half over.A faithful friend is hard to find.Stars can't shine without darkness.No way is impossible to courage.He that respects not is not respected.You had me at hello.Success belongs to the persevering.We never know the worth of water till the well is dry.There is no royal road to learning.Imagination is more important than knowledge.Winners do what losers don't want to do.No way is impossible to courage.Reading is to the mind while exercise to the body.I prefer having your accompanying for life-long time to the short-time tenderness.The first wealth is health.Jack of all trades and master of none.Every single person has at least one secret that would break your heart.There is no smoke without fire.The shortest answer is doing.Believe in yourself.Always have, always will.We are all too young, a lot of things don't yet know, don't put the.I need you like i need the air to breathe.May the force be with you.May the force be with you.Life is the flower for which love is the honey.You are braver than you believe.Rome was not built in a day.Genius is nothing but labor and diligence.Every man is the architect of his own fortune.No looking back, only forward.While there is life, there is hope.I can because i think i can.If there were no clouds, we should not enjoy the sun.Be cheerful and hopeful.Forget others' faults by remembering your own.It's up to you how far you'll go.If you don't try, you'll never know.Bind the sack before it be full.If i could rearrange the alphabet, i'd put y and i together. yiLife is short and you deserve to be happy.A man is only as good as what he loves.A man can do no more than he can. |
里面传输的都是这种数据,里面会塞一些奇怪的数据等待提取.
需要找到身份证号、⼿机号、 IP 地址,若经过了变形需还原回去。例如找到的身份证号是“794688-19761015-0966”,则需还原回“794688197610150966”.
最终将找到的身份证号、⼿机号、 IP 地址进⾏数据分类后保存到 csv
⽂件中,⽂件编码为 utf-8
,列名为 category,value
.
尝试使用正则表达式
1 | import re |
ujson是一个使用C语言编写的json处理库,在处理大规模json数据时比标准json库更快.