11. FFI扩展(PHP>7.4.0)
这一扩展可以让PHP语言中使用C语⾔中的函数和库
常见调用方式:
1)FFI::def
2)创建FFI对象,一个字符串,包含常规C语言中的一系列声明(类型、结构、函数、变量等)。实
际上,这个字符串可能是从C头文件复制粘贴的。
$ffi=FFI::cdef("int system(const char *command);");
$a = '/readflag > /var/www/html/1.txt';
$ffi->system($a);exit();
这段代码首先创建了一个新的 FFI 对象调用 Linux 库的 int system(const char* command);函数,作用是把 command 指定的命令名称或程序名称传给要被命令处理器执行的主机环境,并
在命令完成后返回。
3)FFi::load
加载C文件
public static
FFI::load
(
string
$filename
):
?
FFI
4)
FFi::scope
使用预加载期间解析的C声明实例化FFI对象
public static
FFI::scope
(
string
$name
):
FFI
5)FFi::new
创建一个C语言数据结构
public static
FFI::new
(
FFI\CType
|string
$type
,
bool
$owned
= true
,
bool
$persistent
= false
):
?
FFI\CData
6)FFi::cast
执行C类型转换
public static
FFI::cast
(
FFI\CType
|string
$type
,
FFI\CData
|int|float|bool|null
&$ptr
):
?
FFI\CData
7)
FFi::memcmp
比较内存区域的大小字节
public static
FFI::memcmp
(
string|
FFI\CData
&$ptr1
,
string|
F FI\CData
&$ptr2
,
int
$size
):
int
8)FFI::memcpy
复制一个内存区域到另一个内存区域
public static
FFI::memcpy
(
FFI\CData
&$to
,
FFI\CData
|string
&$from
,
int
$size
):
void
12. 特定函数绕过
parse_url:
PHP: parse_url - Manual
例:web396
传入http://`ls`/a.php,parse_url函数分解为 echo `ls`> /a.php,会写如到根目录下,不方便访问。因此要想办法写入到当前目录,构造语句将前面提前闭合。http://1/1;echo `ls` >t.txt (注意这里用反引号,不用system,因为system是php函数,这里设shell_exec里,用反引号来代表命令替换)发现flag文件,访问即可:http://1/1;echo `cat fl0g.php` >t.txt
call_user_func:
PHP: call_user_func - Manual
preg_match绕过:
不会匹配换行符
在非多行模式下,$会忽略掉句尾的%0a
preg_match
只匹配字符串不匹配数组 ,传入数组时返回
false
(
PHP利用PCRE回溯次数绕过限制
正则匹配中的某些字符对于被匹配字符串出现可匹配也可不匹配的情况,那么先不匹配,让下一个正则表达式的字符去匹配,如果无法匹配则让该字符匹配字符串称为一次回溯,但正则匹配有回溯次数的限制,一般利用脚本提交10000个字符差不多可以超过回溯次数绕过正则)
无字母数字的webshell:
浅析无字符数字构造webshell_Lemon's blog-CSDN博客_无字符webshell