PHP代码审计

  • 什么是代码审计?

代码审计指的是对源代码进行检查,寻找代码中的bug以及安全缺陷(漏洞)

  • 什么是cookies ?

Cookies是一种文本文件,包含在访问某些网址时下载到浏览器或设备的少量信息,是服务端保存在浏览器端的数据片段。以 key/value的形式进行保存。每次请求的时候,请求头会自动包含本网站此目录下的 cookie 数据。网站经常使用这个技术来识别用户是否登陆等功能。

简单的说,cookie 就是服务端留给计算机用户浏览器端的小文件。

  • PHP语法

1. PHP 脚本以 开始,以 ?> 结束。每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。

2. 输出文本的基础指令:echoprint

3. 注释符:

// 这是 PHP 单行注释

/*
这是
PHP 多行
注释
*/
?>

4. php变量:

PHP 没有声明变量的命令,变量在第一次赋值给它时就被创建

$txt="Hello world!";
$x=5;
?>

5.php是弱类型语言

不必向 PHP 声明该变量的数据类型。PHP 会根据变量的值,自动把变量转换为正确的数据类型。

6.PHP危险函数

题目来源: BUUCTF  [HCTF 2018]WarmUp 1

拿到题目

PHP代码审计_第1张图片

查看源代码看到提示source.php

PHP代码审计_第2张图片

访问source.php得到

PHP代码审计_第3张图片PHP代码审计_第4张图片

 分析源代码

**//mb_strpos():**返回要查找的字符串在别一个字符串中首次出现的位置
// mb_strpos (haystack ,needle )
// haystack:要被检查的字符串。
// needle:要搜索的字符串

//mb_substr() 函数返回字符串的一部分。

//str 必需。从该 string 中提取子字符串。
//start 必需。规定在字符串的何处开始。
//ength 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
 

在代码中我们还发现了hint.php,访问hint.php

PHP代码审计_第5张图片

我们先看看源码

 "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

PHP代码审计_第6张图片

 

你可能感兴趣的:(php)