任意代码执行
eval()—— 直接执行字符串assert()—— PHP7前可执行代码(PHP7之后默认只判断真假,但部分场景下仍可利用)call_user_func()/call_user_func_array()—— 间接调用任意函数,可控函数名即为RCEpreg_replace('/pattern/e', ...)(过时)—— 带/e修饰符的正则表达式执行(PHP5)
系统命令执行
pcntl_exec()—— 进程控制,执行命令exec()—— 执行命令,返回最后一行结果passthru()—— 直接输出命令执行的原始结果popen()—— 打开一个进程管道shell_exec()—— 直接返回完整命令执行输出system()—— 执行命令,输出结果,并返回最后一行proc_open()—— 打开一个进程并能控制输入输出backticks`` ``(反引号执行)—— 等价于shell_exec
Magic 函数触发点
__construct()—— 类实例化时自动调用__destruct()—— 对象销毁时(如页面执行完毕或手动unset)自动调用(常用于POP链出口)__call()—— 调用未定义对象方法__callStatic()—— 调用未定义静态方法__get()/__set()—— 操作不存在属性时触发__isset()/__unset()—— 判断/删除不存在属性时触发__sleep()—— serialize时调用,可控制序列化字段__wakeup()—— unserialize时调用(⚡ 重要反序列化点)__toString()—— 对象转字符串时调用(如echo打印)__invoke()—— 将对象当作函数调用时触发__set_state()——var_export导出后再恢复时触发__clone()—— clone对象时触发__debugInfo()——var_dump时返回自定义调试信息
文件相关敏感函数
move_uploaded_file()—— 上传文件移动,可能导致任意文件上传file_put_contents()—— 写入内容到文件(任意写文件)file_get_contents()—— 读文件(任意文件读取)unlink()—— 删除文件fopen()/fgets()—— 打开文件,读取内容
SSRF 相关函数
file_get_contents()—— 远程/本地资源访问fsockopen()—— TCP连接(可以打内网)curl_exec()—— CURL库,最常见SSRF入口fopen()—— 远程文件协议readfile()—— 读取并直接输出文件内容
PS: SSRF不仅仅是能请求HTTP,能发TCP包、访问Unix socket也可以算(取决于协议)。
Phar 反序列化触发点(文件操作相关函数)
fileatime()/filectime()/filemtime()stat()/fileinode()/fileowner()/filegroup()/fileperms()file()/file_get_contents()/readfile()/fopen()file_exists()/is_dir()/is_file()/is_link()/is_readable()/is_writable()parse_ini_file()unlink()copy()exif_*()系列(如exif_thumbnail())gd图像处理相关(如imagecreatefromjpeg())hash_file()/hash_hmac_file()/md5_file()/sha1_file()getimagesize()/getimagesizefromstring()get_meta_tags()/get_headers()
简单理解
只要文件函数需要读取文件meta信息/内容,很可能触发phar伪协议反序列化。
原生类利用(gadget类)
- XSS
ErrorException
- SSRF
SoapClient(初始化即请求远程)
- open_basedir 绕过
DirectoryIterator+glob://(配合协议)
- XXE
SimpleXMLElementDOMDocumentXMLReader

Comments NOTHING