代码审计指的是对源代码进行检查,寻找代码中的bug以及安全缺陷(漏洞)
Cookies是一种文本文件,包含在访问某些网址时下载到浏览器或设备的少量信息,是服务端保存在浏览器端的数据片段。以 key/value的形式进行保存。每次请求的时候,请求头会自动包含本网站此目录下的 cookie 数据。网站经常使用这个技术来识别用户是否登陆等功能。
简单的说,cookie 就是服务端留给计算机用户浏览器端的小文件。
1. PHP 脚本以 开始,以 ?> 结束。每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
2. 输出文本的基础指令:echo 和 print
3. 注释符:
// 这是 PHP 单行注释
/*
这是
PHP 多行
注释
*/
?>
4. php变量:
PHP 没有声明变量的命令,变量在第一次赋值给它时就被创建
$txt="Hello world!";
$x=5;
?>
5.php是弱类型语言
不必向 PHP 声明该变量的数据类型。PHP 会根据变量的值,自动把变量转换为正确的数据类型。
6.PHP危险函数
题目来源: BUUCTF [HCTF 2018]WarmUp 1
拿到题目
查看源代码看到提示source.php
访问source.php得到
分析源代码
**//mb_strpos():**返回要查找的字符串在别一个字符串中首次出现的位置
// mb_strpos (haystack ,needle )
// haystack:要被检查的字符串。
// needle:要搜索的字符串
//mb_substr() 函数返回字符串的一部分。
//str 必需。从该 string 中提取子字符串。
//start 必需。规定在字符串的何处开始。
//ength 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
在代码中我们还发现了hint.php,访问hint.php
我们先看看源码
"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page))//判断$page是否为空以及是否为字符串 {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) //判断whitelist中是否有page的值,这是in_arry()函数的作用{
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);//截取变量$page首次出现?之前的值
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])//判断file是否为空
&& is_string($_REQUEST['file'])//判断file是否为字符串
&& emmm::checkFile($_REQUEST['file'])//调用checkFile函数来检查变量file
) {
include $_REQUEST['file'];
exit;
} else {
echo "
";
}
?>
代码审计:
isset() 函数定义和用法: isset — 检测变量是否已设置并且非 NULL
mb_substr()定义和用法: mb_substr() 函数返回字符串的一部分, substr()
函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()
mb_strpos (haystack ,needle ): haystack:要被检查的字符串。 needle:要搜索的字符串。 (PHP >= 4.0.6, PHP 5, PHP 7) mb_strpos — 查找字符串在另一个字符串中首次出现的位置
in_array(value,array,type):
参数:
value 必需。规定要在数组搜索的值。
array 必需。规定要搜索的数组。
type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
如果给定的值 value 存在于数组 array 中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。
如果没有在数组中找到参数,函数返回 false。
注释:如果 value 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。
本题:
if (in_array($_page, $whitelist))
{
return true;}判断whitelist中是否存在page的值
只需要让那些if语句返回true
根据提示,flag在ffffllllaaaagggg中,四层目录,%253f是将?经过两次url编码后得到的结果,在服务器接受参数时会进行一次url解码,执行checkFile()函数时再次进行url解码,其实在这里不对?进行编码也是可以的,那么构建payload:
?file=source.php%253f/../../../../ffffllllaaaagggg
得到flag