preg_match函数定义与用法:
企业级理解:
preg_match —— 执行匹配正则表达式
语法
int preg_match ( string $pattern , string KaTeX parse error: Expected 'EOF', got '&' at position 18: …bject [, array &̲matches[, int $flags = 0 [, int $offset = 0 ]]] )
$pattern: 要搜索的模式,字符串形式。
$subject: 输入字符串。
$matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
$flags:flags 可以被设置为以下标记值:
PREG_OFFSET_CAPTURE: 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。
offset: 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。
普通理解:
过滤掉指定的字符串
preg_match函数该怎么绕过:
一般情况下以下几种方式可以绕过该函数
- 数组绕过preg_match只能处理字符串,当传入的subject是数组时会返回false
- 换行符绕过,preg_match不会匹配换行符例如: /?value=%0ashell.php 则会成功传入
/?value=shell.php - PCRE回溯限制次数绕过,这个通俗的讲便是重复的填入正常字符串一般往里面插入个100个字母便可,让preg_match函数一直回溯一直回溯,直到吹灯拔蜡返回false
- 根据不同的限制手法天马行空的绕过
move_uploaded_file函数定义与用法:
企业级理解:
move_uploaded_file() 函数将上传的文件移动到新位置。
若成功,则返回 true,否则返回 false。
语法
move_uploaded_file(file,newloc)
file 必需。规定要移动的文件。
newloc 必需。规定文件的新位置。
move_uploaded_file怎么绕过:
一般情况下以下几种方式可以绕过该函数
- 截断法例如:上传shell.php\x00.jpg 成功上传后便是shell.php ,但一般%00截断需要PHP<5.3.4,最新的PHP版本很难用到
- 如有文件包含漏洞,可以结合图片马再文件包含来getshell
include构造例题
1、首先!empty表明file不为空
2、其次is_string表示为字符串
3、emmm::checkFile调用checkfile函数检查,在checkfile中的第一个要求page为字符串且不能为空,第二判断page存在于$whitelist数组中,第三函数mb_substr意思是取0到mb_strpos(字符串在别一个字符串中首次出现的位置)范围的内容,也就是?之前的部分,成为白名单 mb_strpos()
4、对url解码——urldecode,取?之前的部分,白名单
XCTF例题源码如下
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($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'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
总结:
复现复现