题目来源:ctfshow菜狗杯
一言既出
考点:弱类型比较,intval()函数,注释
<?php
highlight_file(__FILE__);
include "flag.php";
if (isset($_GET['num'])){
if ($_GET['num'] == 114514){
assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
echo $flag;
}
}
分析代码,传入num,要使num的值等于114514,经过intval()函数后要等于1919810。因此有两种思路:
1.让num的值同时满足这两个条件。比如可以构造num=114514+1919810-114514,传入时进行url编码。
由于是弱类型比较,提取开头数字就等于114514,满足条件1,而经过intval()函数处理,最后就是intval(1919810)==1919810,而不会执行die();
2.让intval()函数后面的直接不执行(注释掉)。传入
num=114514);//
。
语句在执行的过程中变为:
assert("intval(114514);//)==1919810") or die("一言既出,驷马难追!");
部分被注释,不在运行,此时执行
echo $flag;
webshell
考点:序列化和反序列化
分析,大致就是执行cmd语句,但会对cmd语句进行反序列化,使用传入的cmd要进行序列化
序列化
发现flag.php,再次修改,因为过滤了flag字母,使用tac f*打开。
找到flag
化零为整
考点:代码审计,url编码
其实就是把“大牛”二字用url编码后,分别传参就行。
传说之下(雾)
考点:控制台运行
打开链接,是一个贪吃蛇游戏,根据提示,要得到2077分才能出现flag。
调试器查看文件,发现本地变量是Game。
在控制台输入Game,查看发现其中有个score变量,应该是存储分数的。
输入Game.score=2077,然后开始游戏得一分即可出现flag。
知识点分享:intval()函数绕过
intval的作用是取整。
原型:
intval(var,base) //var是值,base是进制,默认十进制。
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
◦ 如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);
◦ 如果字符串以 “0” 开始,使用 8 进制(octal);
否则, 将使用 10 进制 (decimal)。
例如:
intval('0x123') //结果0
intval(0x123) //16进制,结果291
intval('1e10') //单引号传值的时候,它只识别字母前面的一部分
intval(1e10) //1410065409
echo intval(42); //10进制, 42
echo intval(4.2); // 4 小数点后的数字会直接舍去
但是如果在intval中对字符串进行加减了之后,php会将结果转化为十进制,从而传到intval中的是十进制的数字
例如:
intval('0x123'+1)相当于 intval(292)