文章目录
- 给的源码是ThinkPHP框架的话,审计起来和没有使用框架的有什么不同,从流程上或者从关注的点上有什么不同
-
- 反序列的时候,unserialize()反序列一个字符串的时候,对象会有一些魔术方法会被自动调用到,在找反序列化的链时,有哪些魔术方法是可以作为一个入手点去找的
- 如果用白名单策略修复ssrf,从用户输入的变量里拿出要访问的目标,这个要注意哪些,因为一些url会通过特殊的字符做白名单绕过,对取变量这个操作有哪些要注意的细节?
- php中三个等号和两个等号有什么区别
- php代码常见入口函数怎么找
-
- PHP的变量覆盖
- 有一个php的程序,本身就允许文件包含的操作,同时想要避免文件包含漏洞,写代码的时候要注意哪些
- 远程文件包含和本地文件包含,这两种涉及的php设置有什么
-
- 本地文件包含能不能通过php配置限制文件包含的路径(不通过代码直接通过配置项来解决)
给的源码是ThinkPHP框架的话,审计起来和没有使用框架的有什么不同,从流程上或者从关注的点上有什么不同
框架代码审计的流程
- 框架熟悉:首先需要熟悉ThinkPHP的目录结构、配置文件、路由机制、模型-视图-控制器(MVC)架构等。例如,ThinkPHP的配置文件加载顺序为惯例配置->应用配置->模块配置->动态配置
- 漏洞复现:针对ThinkPHP的历史漏洞(如SQL注入、反序列化漏洞等)进行复现和分析,了解其成因和利用方式
- 工具辅助:使用自动化工具(如Seay源码审计系统、PHPStorm)进行初步扫描,结合手动审计验证结果
无框架代码审计的流程
- 代码结构分析:需要手动分析代码的目录结构和逻辑,因为没有框架的约束,代码可能分散且不规范。
- 手动审计为主:由于缺乏框架的规范性,自动化工具的效果有限,更多依赖手动审计。
反序列的时候,unserialize()反序列一个字符串的时候,对象会有一些魔术方法会被自动调用到,在找反序列化的链时,有哪些魔术方法是可以作为一个入手点去找的
- __wakeup():在unserialize()反序列化对象时自动调用。
- __destruct():在对象被销毁时自动调用(如脚本执行结束或手动调用unset())。
- __toString():当对象被当作字符串使用时自动调用(如echo、print、字符串拼接等)。
- __call():当调用对象中不存在的方法时自动调用。
- __get():当访问对象中不存在的属性时自动调用。
- __set():当给对象中不存在的属性赋值时自动调用。
- __invoke():当尝试将对象作为函数调用时自动调用。
如果用白名单策略修复ssrf,从用户输入的变量里拿出要访问的目标,这个要注意哪些,因为一些url会通过特殊的字符做白名单绕过,对取变量这个操作有哪些要注意的细节?
- 检查协议:只允许http和https协议,禁止file://、gopher://、dict://等危险协议。
- 检查域名或IP:使用正则表达式或白名单列表验证域名或IP是否合法。
- 处理编码问题:对URL进行解码(如urldecode()),确保特殊字符(如%2f、%252f)不会绕过白名单。
- 检查路径和参数:确保路径和参数不包含恶意内容(如…/、@、#等)。
- 处理重定向:禁止或限制URL重定向,防止攻击者通过重定向绕过白名单。
- 解析URL:使用parse_url()函数解析URL,确保提取的域名、路径和参数是规范的。
php中三个等号和两个等号有什么区别
- ==:比较两个值是否相等,但在比较之前会进行类型转换(弱类型)
- ===:比较两个值是否相等,且类型必须相同。
php代码常见入口函数怎么找
超全局变量
- $_GET:获取URL参数。
- $_POST:获取POST请求体中的数据。
-
R
E
Q
U
E
S
T
:获取
_REQUEST:获取
REQUEST:获取_GET、
P
O
S
T
和
_POST和
POST和_COOKIE的合并数据。
- $_COOKIE:获取客户端发送的Cookie。
- $_FILES:获取上传的文件。
- $_SERVER:获取服务器和执行环境信息。
输入处理函数
- file_get_contents():读取文件或URL内容。
- fopen():打开文件或URL。
- include / require:包含文件。
- eval():执行字符串中的PHP代码。
- system() / exec() / passthru():执行系统命令。
- unserialize():反序列化数据。
数据库操作函数
- mysqli_query() / mysqli_prepare():执行SQL查询。
- PDO::query() / PDO::prepare():执行SQL查询。
文件操作函数
- file_put_contents():写入文件。
- move_uploaded_file():处理上传的文件。
PHP的变量覆盖
- 通过extract()函数:将数组中的键值对导入当前符号表,键作为变量名,值作为变量值。
- parse_str()函数:将查询字符串解析为变量。
- 通过$$可变变量:通过变量的值作为变量名来访问或修改变量。
- 通过import_request_variables()函数:将GET、POST、Cookie等请求变量导入全局作用域。
有一个php的程序,本身就允许文件包含的操作,同时想要避免文件包含漏洞,写代码的时候要注意哪些
- 限制包含的文件范围:只允许包含预定义的文件。
- 检查文件路径:确保文件路径在允许的目录范围内。
- 禁用远程文件包含,配置PHP:在php.ini中禁用allow_url_include和allow_url_fopen。
- 避免直接包含用户输入:使用安全的封装函数。
- 移除特殊字符:过滤用户输入中的…/、%00等危险字符。
- 避免相对路径:使用绝对路径包含文件,减少路径遍历的风险。
远程文件包含和本地文件包含,这两种涉及的php设置有什么
远程文件包含(RFI)
- allow_url_fopen:
允许PHP通过URL(如http://、ftp://)打开文件。 - allow_url_include:允许PHP通过URL包含文件
本地文件包含(LFI) - open_basedir:限制PHP脚本可以访问的文件目录。
- disable_functions:禁用某些危险函数(如exec、system)。
本地文件包含能不能通过php配置限制文件包含的路径(不通过代码直接通过配置项来解决)
- open_basedir:限制文件访问路径:open_basedir用于限制PHP脚本可以访问的文件系统路径。所有文件操作(包括文件包含)都会被限制在指定的目录及其子目录中。
- disable_functions:禁用危险函数:disable_functions用于禁用某些可能被滥用的PHP函数(如exec、system等),从而减少攻击者通过LFI执行系统命令的风险。
- doc_root:设置文档根目录:doc_root用于指定PHP脚本的根目录。所有文件操作(包括文件包含)都会被限制在该目录下。