代码审计笔记

Crushz-2024 / 2024-08-31 / 原文

渗透测试
白盒:基于内部的测试,
黑盒:基于外部的测试
灰盒:既有功能点又有源代码

在php文件包含:include\require

代码审计:
1.找关键函数
2.全文通读

文件包含:include、require
漏洞:如何控制漏洞呢------传参点
include('./inc.php');
include("$_POST[1]")

第八行:include $_REQUEST['target']
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}

当if语句中的条件表达式为true,则执行include代码
共有五个条件表达式
! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])

第一个:
! empty($_REQUEST['target'])=>true
empty($_REQUEST['target'])
=>false
empty(var) 函数用于检查一个变量是否为空,为空则为true
当 var 存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE

target传参需要值,可以满足

第二个:
is_string($_REQUEST['target'])
is_string() 函数用于检测变量是否是字符串
如果指定变量为字符串,则返回 TRUE,否则返回 FALSE

可以满足

第三个:
! preg_match('/^index/', $_REQUEST['target'])=>true
preg_match('/^index/', $_REQUEST['target'])
>false
返回匹配次数。 它的值将是 0 次(不匹配)或 1 次
0--false 1---true

target传参不能以index开头的文件  index.php  index.html

第四个:
! in_array($_REQUEST['target'], $target_blacklist)=>true
in_array($_REQUEST['target'], $target_blacklist)
=>false

in_array数组中找到值则返回 TRUE,否则返回 FALSE
target传参值不能有$target_blacklist的值

$target_blacklist = array ('import.php', 'export.php');

target传参不能只传入import.php、export.php
可以满足

第五个:
Core::checkPageValidity($_REQUEST['target'])===>true

public static function checkPageValidity($page, array $whitelist = [])
                $page = $_REQUEST['target']

$whitelist===> public static $goto_whitelist = array()

strpos() 函数查找字符串在另一字符串中第一次出现的位置
strpos(string,find)

返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE