靶场PHP函数整理+防御方式


文章目录


靶场PHP函数整理+防御方式

一、SQL注入

上课讲到的PHP函数:mysqli_real_escape_string()、addslashes()

拓展PHP函数:mysqli_query()、intval()、mysqli_prepare()、mysqli_stmt_execute()、floatval()

函数详细讲解

1.mysqli_real_escape_string() 对SQL语句里的特殊字符(单引号'、双引号"、反斜杠\、NULL等)进行转义,给特殊字符加上反斜杠。注意:必须建立数据库连接之后才能使用;无法防御预处理之外的二次注入、宽字节注入。

  • 案例Less-24(二次注入):注册时调用该函数转义用户输入存入数据库,数据存入数据库后反斜杠消失;登录时直接取出数据库原始数据拼接SQL,造成二次注入。
    2.addslashes() 在单引号'、双引号"、反斜杠\、NULL前面添加反斜杠\。存在宽字节注入缺陷:当数据库编码为GBK时,传入%df%27,addslashes会把%27转为%5c%27,%df%5c组成一个GBK汉字,反斜杠被吃掉,单引号逃逸,触发注入。
    3.mysqli_query() 执行一条SQL语句。如果直接拼接_GET、_POST等用户可控输入到SQL字符串中,会直接产生SQL注入漏洞。
    4.intval() 获取变量的整数值,把输入强制转换为整数。专门用于防御数字型SQL注入;字符串输入会被强制转为0。
    5.floatval() 强制转为浮点型,用于小数数字参数场景防御数字注入。
    6.mysqli_prepare() 预处理语句函数,生成预编译SQL模板,使用占位符代替用户输入,SQL结构和用户数据完全分离,是防御SQL注入最核心方案,搭配mysqli_stmt_execute()执行。
    7.mysqli_stmt_execute() 执行预处理语句,传入参数,用户输入只会当做数据,不会解析为SQL语法。

漏洞成因

直接把用户可控输入(GET/POST/Cookie)拼接进SQL语句交给数据库执行;二次注入:转义仅发生在存入数据库阶段,读取数据库原生数据再次拼接SQL时没有做处理;字符编码配置不当引发宽字节注入。

完整防御方案

1.优先使用mysqli预处理(prepare),SQL语句和用户参数分离,杜绝绝大多数注入。

2.数字参数使用intval()、floatval()强制类型转换。

3.字符集统一设置为utf8mb4,避免GBK编码带来宽字节注入。

4.mysqli_real_escape_string()仅作为辅助手段,不能单独依靠它防御二次注入。

5.最小权限原则:数据库账号只分配业务必需权限,禁止root高权限账号;禁止直接暴露数据库报错信息。

6.输入过滤:对传入参数做白名单校验,只允许预期字符。

二、XSS跨站脚本攻击

上课讲到的PHP函数

htmlspecialchars()、str_replace()、strtolower()、strpos()、eval()、system()

拓展PHP函数

echo()、print()、print_r()、var_dump()、htmlentities()

函数详细讲解

1.htmlspecialchars() 把HTML特殊字符转为HTML实体编码。

默认:只转义& < >;不会转义单引号。

正确写法:htmlspecialchars($str,ENT_QUOTES),带上ENT_QUOTES参数,同时转义单引号、双引号。

漏洞场景:输出点在HTML标签属性值内部,没有开启ENT_QUOTES,单引号可以闭合属性,插入onclick、onfocus等事件触发XSS。

2.str_replace() 字符串替换函数,可用来过滤

漏洞成因

用户可控数据没有经过HTML实体转义,直接输出到浏览器页面;输出位置不同(HTML正文、标签属性、JS内部、CSS内部)绕过方式不一样;只做黑名单过滤容易被绕过。

分类:反射型XSS(参数传入立刻输出)、存储型XSS(恶意代码存入数据库,访问页面加载)、DOMXSS(前端JS处理,后端无输出)

完整防御方案

1.输出到HTML正文/标签属性:使用htmlspecialchars($str,ENT_QUOTES),必须带上ENT_QUOTES,转义单双引号。

2.如果输出位置在JS代码块内部:使用JS转义,不要直接输出原始用户数据。

3.部署HTTP响应头ContentSecurityPolicy(CSP),限制脚本加载来源,阻止恶意脚本执行。

4.输入过滤:优先白名单,谨慎黑名单过滤,黑名单很容易绕过。

5.存储型XSS:数据存入数据库之前或者取出渲染页面时做转义,建议渲染输出阶段转义。

6.开发环境关闭print_r、var_dump调试输出,禁止暴露给用户。

三、文件上传漏洞

上课讲到的PHP函数

deldot()、strrchr()、str_ireplace()、getimagesize()、exif_imagetype()、file_put_contents()

拓展PHP函数

move_uploaded_file()、$_FILES超全局变量、pathinfo()、basename()

函数详细讲解

1.deldot() 自定义函数,删除文件名末尾的点.,用于防御文件名末尾加点绕过(xxx.php.)。

2.strrchr() 查找字符串最后一次出现指定字符位置,获取文件后缀。例:strrchr($filename,'.')拿到后缀名。

3.str_ireplace() 大小写不敏感字符串替换,用来删除后缀中的php、phtml等脚本后缀;可以用双后缀绕过,例如xxx.php.jpg。

4.getimagesize() 读取图片文件头,获取图片宽高等信息;判断文件是否为图片。缺陷:只校验文件头,图片马(图片+php代码混合)可以绕过。

5.exif_imagetype() 读取文件头部字节判断图片类型,比getimagesize性能更高;同样仅校验文件头,图片马可以绕过。

6.file_put_contents() 把字符串写入文件;若文件名、文件内容可控,可写入恶意脚本文件。

7.move_uploaded_file() 将HTTP POST上传的临时文件移动到目标路径。上传漏洞核心函数;如果文件名、后缀校验不严,可以上传php脚本文件到web目录。

8.$_FILES 超全局数组,接收表单上传文件信息,包含name文件名、type(MIME类型)、tmp_name临时路径;type字段来自前端,用户可以伪造,不能作为后端校验依据。

9.pathinfo() 获取路径信息,可以提取文件扩展名,后端获取真实后缀。

10.basename() 获取路径中的文件名部分,剥离路径.../,防止路径穿越。

漏洞成因

仅校验前端MIME类型;黑名单后缀过滤不全,可以被双后缀、点、空格绕过;只校验图片头允许图片马上传;上传目录有执行权限;文件名可控造成路径穿越。

完整防御方案

1.后端获取真实文件后缀,使用白名单校验,只允许jpg、png、gif等允许后缀,拒绝黑名单。

2.禁止信任$_FILES"type"前端MIME字段。

3.使用exif_imagetype()/getimagesize()校验图片文件,图片业务场景下二次重绘图片消除图片马。

4.修改上传文件名,不使用用户原始文件名,防止文件名绕过、路径穿越。

5.上传目录设置:取消PHP脚本执行权限。

6.文件保存路径放在web访问目录之外,需要访问时使用代理读取。

7.限制上传文件大小。

四、文件包含漏洞

上课讲到的PHP函数

include()、include_once()、require()、require_once()

拓展PHP函数

basename()、realpath()、file_exists()、is_file()

函数详细讲解

1.include() 包含并执行指定文件,文件不存在抛出警告。用户可以控制传入路径参数时,触发本地/远程文件包含漏洞。

2.include_once() 功能同include;同一个文件只会被包含一次。

3.require() 包含执行文件;文件不存在直接抛出致命错误终止程序。

4.require_once() 同一个文件只会require一次,文件不存在致命错误退出。

PHP配置allow_url_include=On开启会造成远程文件包含,可以加载远程服务器恶意代码。

5.basename() 提取路径中的文件名,剥离.../路径跳转字符,路径过滤常用。

6.realpath() 返回文件完整真实绝对路径;可以解析.../,校验解析后的路径是否在允许目录内。

7.file_exists() 判断文件或者目录是否存在。

8.is_file() 判断是否是真实文件,而不是目录。

漏洞成因

文件路径参数用户可控;没有过滤.../目录跳转;PHP配置开启allow_url_include造成远程文件包含。

完整防御方案

1.尽量避免把用户输入直接传入文件包含函数。优先使用白名单,允许包含的文件做列表,用户只能选择预设值。

2.使用realpath()解析真实路径,校验解析后的路径是否在允许访问目录。

3.basename()过滤路径,去除.../。

4.php.ini关闭allow_url_include=Off,禁止远程文件包含。

5.设置目录权限,限制web账号访问敏感系统文件。

五、命令执行漏洞

上课讲到的PHP函数

system()、exec()、shell_exec()、passthru()、escapeshellarg()、isset()、call_user_func()

拓展PHP函数

popen()、proc_open()、escapeshellcmd()

函数详细讲解

1.system() 执行系统命令,直接把命令执行结果输出页面。

2.exec() 执行系统命令,不会直接输出;执行结果存入数组,返回命令输出最后一行。

3.shell_exec() 执行shell命令,返回完整字符串结果;没有输出时返回null。

4.passthru() 执行系统命令,输出原始二进制数据流。

5.escapeshellarg() 命令参数防御函数,把整个参数加上单引号,转义shell特殊字符;针对参数处理,不要用来处理整条命令。

6.escapeshellcmd() 转义命令里特殊元字符;对整条命令转义,不推荐,存在绕过风险,优先escapeshellarg。

7.isset() 检测变量是否定义不为null,本身不会产生漏洞;常常和命令执行代码搭配使用。

8.call_user_func() 回调函数,传入字符串当做函数名调用,如果函数名可控,造成代码执行漏洞。

9.popen() 打开进程文件指针,调用系统命令。

10.proc_open() 执行命令并且打开文件描述符,底层命令调用。

漏洞成因

用户可控输入直接传入系统命令执行函数;没有过滤管道符| & ; $ 等shell特殊字符;call_user_func()函数名可控导致代码执行。

完整防御方案

1.尽量避免调用系统命令,优先使用PHP原生函数实现业务逻辑。

2.如果必须调用命令:参数部分使用escapeshellarg()包裹,命令和参数分离。

3.输入做白名单校验,严格限制用户输入内容。

4.PHP配置禁用危险函数(disable_functions):system、exec、shell_exec等不需要的命令执行函数。

5.使用最小权限运行web服务进程。

相关推荐
海兰1 小时前
【 Python 量化交易】第3章:金融基础概念
开发语言·python·金融
一木 之林1 小时前
三.C++ 内存管理(进阶)(二)
开发语言·arm开发·c++
吴声子夜歌1 小时前
Java——类、对象及方法(一)
java·开发语言
阿里嘎多学长1 小时前
2026-08-29 GitHub 热点项目精选
开发语言·程序员·github·代码托管
এ慕ོ冬℘゜2 小时前
JavaScript学习心得:从只会语法,到真正会写业务逻辑
开发语言·javascript·ecmascript
2601_966949652 小时前
五档盘口数据对量化交易有什么价值?从信号判断到策略风险的完整分析
开发语言·人工智能·python·数据分析·量化·股票数据·quantdash
小吴学不废Java2 小时前
Python 基础语法
开发语言·python
布莱克6052 小时前
队列详解:定义、分类、应用场景及与栈的区别(C/C++ 代码讲解)
c语言·开发语言·c++·队列
CPETW2 小时前
USB TO I2C_(Excel)_Scan ---- 1000KHz总线速率测试_A
c语言·开发语言·网络·科技·单片机