CG-CTF

https://cgctf.nuptsast.com/challenges#Web

 

  续上~

  第十六题:bypass again

 

  代码分析:

  当a不等于b,且a和b的md5值相同时,才会返回flag值。

  思路①:同第二题的思路,因为是==比较,只判断值是否相等,不判断类型是否相同。在PHP语言中,如果数据类型不同先转换为相同的类型再进行比较,而PHP在处理哈希字符串时,会把0E(或0e)开头的哈希值解释为0。所以如果两个值通过md5后值都以0E(或0e)开头,其值就会相等;

  构造a=s878926199a,b=s155964671a;

  取得flag(干杯~);

 

  思路②:同第十五题思路,PHP中md5()函数并不能处理数组数据类型,在遇到数组的时候会返回NULL,其值就会相等。(且这种方法在===比较中也可以适用;

  取得flag(干杯~);

 

  思路③:MD5本质上是使用哈希算法的一种散列函数,一个MD5理论上是可能对应多个原文的,原理是MD5是有限多个的,而原文是无限多个的;

  此处举个不准确但可以辅助理解的例子:

  1+7=8,但是只拿到8并不能推出1+7,但是我们可以构造2+6,2*4等使其最终的值相等。

  那么我们只要找到两个MD5值相同的原文(MD5散列碰撞),这道题就能解决了。

 

  第十七题:变量覆盖

 

  变量覆盖学习:

  https://www.baidu.com/link?url=-6QNTpui6xtGtWZeZ_FckrQRAfkP_VNych7jn9uhkLd9RZCB0XykXyF4CF1uwuMs386GwuzYHA1gIyxvdMJ4n_&wd=&eqid=81b0d711000afa1e000000035ddc96ae

  本题查看source.php;

  只需要使$pass和$password_123的值相同即可,用burp抓包添加password_123参数;

  取得flag(干杯~);

 

  第十八题:PHP是世界上最好的语言

 

  题目消失,去网上找到原题:

 

  代码分析:id的值与hackerDJ不同,而URL解码后的id与hackerDJ相同;

  思路:对hackerDJ进行两次URL加密即可;

 

  第十九题:伪装者

 

  分析:源代码啥也没有,只能在本地登录,说明对IP做了限制,那么尝试在HTTP头部中进行修改头部信息以达到伪装成本地登录;

  思路①:增加X-Forwarded-For请求头部,其格式为:X-Forwarded-For: client, proxy1, proxy2;

  然而好像没有达成目的,可能后端验证的不是这个头部;

  

  思路②:client-ip;

  取得flag(干杯~);

 

  第二十题:Header

 

  题目消失,上网找了一下原题;

 

  咳咳,评价刁钻;

 

  第二十一题:上传绕过

 

  点击Submit;

  提示仅支持上传jpg,gif,png后缀的文件;

  尝试上传test.jpg文件;

  提示必须上传成后缀名为php的文件;

  上传php文件;

  用burp拦包;

  思路:如果我们上传php文件,第一步就会报错,那么我们需要判断它是如何识别后缀的,可以从返回的包中看到,是根据./uploads目录下的basename来进行识别的,可以尝试进行截断;

  首先在/uploads/后面增加1.php;

  发现basename处变为1.phptest.jpg;尝试用00截断,在1.php后面增加一个空格,然后在Hex下将20改为00;

  取得flag(干杯~);

 

  未完待续~