当前位置:网站首页 > 技术博客 > 正文

江苏工匠企业管理有限公司



题目是这个样子的:

发现自己编辑的东西有一部分没有被发出来,怪不得阅读量低到可怜...现在重新补上一些内容,解题过程很罗嗦,对小白依然友好~


按照惯例,把源码贴在这里逐行分析一下~

 

解题思路如下:

整个题目就是单纯地在考验php语法,并且每个变量输错了都有不同的提示,可以说是非常贴心了~

顺便说一下,我php语言是0基础,还好最近在翻译代码的时候发现visual studio code:它在选中函数的时候可以直接跳转到php手册,对于小白真是太友好了,下载地址:Visual Studio Code - Code Editing. Redefined~

1 根据第9行 if(isset($a) && intval($a) > && strlen($a) <= 3)   在变量a中写入整数值大于且长度小于3的字符串,可以查阅官方手册intval()的介绍~

2 根据第10行 if(isset($b) && '8b184b' === substr(md5($b),-6,6))

   在变量b中写入末尾md5为'8b184b'的字符串,我在印象里有MD5碰撞专用的网站;

3 根据第20行 if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022)

   在数组c的成员m中写入不是数字或数组字符串且值大于2022的东西...可以查阅官方手册!is_numeric()的相关介绍;

4 根据第21行 if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))

   在数组c的成员n中写入元素值为2且c["n"][0])是数组的东西...可以查阅官方手册!is_numeric()与is_array()的相关介绍;读到这里已经感觉c是一个套娃数组了...

   根据第22行 $d = array_search("DGGJ", $c["n"]); 

   如果"DGGJ"与$c["n"])的搜素结果匹配,且c["n"]不可以是"DGGJ"本身(第24~26有过滤);

5 根据第19行 $c=(array)json_decode(@$_GET['c']);

   数组c除了上述要求外,还需要是JSON 编码。


本题目可以徒手解题,不需要下载工具~

像我一样的0基础小白可能需要携带一个php在线编辑器测试代码运行结果,我自己一般是用这个:菜鸟教程在线编辑器 (runoob.com)~

对于$a,查询关于intvtal()的信息:PHP: intval - Manual;可以看到intval(1e9)> ~

在菜鸟编辑器上运行一下~

然后传到网站上试一下,get型直接在网址后传参,可以看到判定已经更改啦,有点小开心~

对于$b,写入末尾md5码为'8b184b'的字符串,这个好像在考MD5的碰撞,我找了很多现有的MD5碰撞的网站,都没有得到自己想要的效果...大概是因为题目的要求稍微有点特殊...

(还是记录备用一下,也许以后用得上,解码速度非常快,关键是解密过程不像被拉去挖矿:

Cmd5 - MD5 Online ,MD5 Decryption, MD5 Hash Decoder

MD5在线加密/解密/激活成功教程—MD5在线 (sojson.com)

还有三个写得很棒的博文,主题都是脚本暴力激活成功教程MD5:

CTF之 MD5 爆破两个例子_seen_in_hw的博客-CSDN博客_md5爆破

这个大佬是用python写的脚本;

MD5碰撞_清风--的博客-CSDN博客_md5碰撞

CTF强弱碰撞的常见解题思路:包括PHP弱比较、MD5弱比较、MD5强比较、MD5构造特定字符串的讲解,含经典CTF题目讲解的python脚本,超赞~

浅谈md5弱类型比较和强碰撞 (.com)

CTF强弱碰撞的常见解题思路:包括PHP弱比较、MD5弱比较、MD5强比较、MD5构造特定字符串的讲解,含经典CTF题目讲解的php脚本,超赞~)

emm,最后还是自己写一个简单的脚本去运行...

 

 b=53724,输入一下试试看,反馈结果是通过判定~

对于$c已经确认是有2个元素的数组,c = array('m', 'n'),并且是json编码;根据官方手册对于intval的介绍PHP: intval - Manual,发现数字和字符加在一起可以绕过,且数字要前置

根据上面的截图,c[m]我们这里可以填写“>2022的数字+字符”;我这里填写的是“9001+空格”先按照正常的流程走一遍~

发现判定已经更改为nohack,是通过c[m]的判定了~

然后再套用JSON编码运行一遍,就是把c["m"]='9001 '写成c='{"m":"9001 "}';这里注意单引号要变成双引号,因为根据官方教程,写单引号JSON是不会理你的~PHP: json_decode - Manual

(也不要在单引号前加转义字符,变成c='{"m":"'9001 ' "}';否则会被直接判定成非数字,值为0~下面贴一下正确的运行结果...)

array_search绕过可以参考博文:CTF中常见的 PHP 弱类型漏洞总结 - 北极边界安全团队 - 博客园 (cnblogs.com)

因此我们直接为c[n0]赋予空值数组,保证可以通过is_array($c["n"][0])的判定,c[n1]赋予空值,即c=[[],0];绕过检测~ 再通过在线编辑器运行一下,确认没有反馈,是可以通过判定的~

 用JSON编码再试一下,也是可以过判定的~ 

现在把这一堆以get形式传参~ 

 

搞定,最后的结果就是:cyberpeace{265d340c3cc47d2996c1907cac15210b}

解题步骤就是这样子的~有疑问或者批评指正的地方欢迎留言~

话说右手抽筋,左手被冻出疤,这么矫情地码字很不容易的~觉得写得 哎哟不错哟 也可以给个赞鼓励一下,感谢~

版权声明


相关文章:

  • 函数已有主体是什么意思2025-02-08 19:29:59
  • 武汉网络dns地址2025-02-08 19:29:59
  • c++接口类型2025-02-08 19:29:59
  • ddm 公式2025-02-08 19:29:59
  • 笔记本电脑键盘对应快捷键2025-02-08 19:29:59
  • java线程用法2025-02-08 19:29:59
  • 串口调试器sscom2025-02-08 19:29:59
  • java多线程介绍2025-02-08 19:29:59
  • vs2019 离线安装 尝试9次2025-02-08 19:29:59
  • nb-iot 协议2025-02-08 19:29:59