原文地址: http://www.freebuf.com/articles/web/184567.html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
  
#php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市场。但是php本身的安全问题却一直不曾消停,以及不规范的php代码编写规范,使得web应用漏洞百出。这篇文章从配置文件和代码编写角度出发,总结记录php相关安全。新手上路,向前辈致敬。
 
 
1. 基本信息
#注意到以下的文件结构在新版本php或者不同的发行版中略有不同,就好比在ubuntu18.04中安装php7就和下面的文件结构有较大的差别,所以下面的文件仅仅作为一个apache的架构参考。
//----------------------------------------基本信息  begin
Root:/var/www/html
 
默认Web服务:Apache(可以使用Lighttpd或Nginx代替)
 
默认PHP配置文件:/etc/php.ini
 
默认PHP Extensions
 
配置目录:/etc/php.d/
 
PHP安全配置样例文件:/etc/php.d/security.ini(需要使用文本编辑器创建这个文件)
 
php 版本: php -v
 
查看当前PHP所编译 : php -m
//----------------------------------------基本信息  end
 
 
2. 敏感配置
#以下是一些常见的配置举例,更多请查看:http://php.net/manual/zh/ini.core.php#ini.variables-order。
 
1). 不在请求头中泄露php信息:
//---------------------------------------begin
expose_php=Off
//---------------------------------------end
 
2). 不回显php错误(包括运行错误时和启动时错误),但是进行错误记录:
//--------------------------------------begin
play_errors=Off
display_startup_errors=off
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log
//--------------------------------------end
 
3). 文件上传开启与否和最大上传文件限制:
//-------------------------------------begin
file_uploads=On
upload_max_filesize=1M
//-------------------------------------end
 
4). 控制最大post数据:
//-------------------------------------begin
post_max_size=1M
#注意:到要比upload_max_filesize大,否则后者失效。
//-------------------------------------end
 
5). 关闭远程代码执行:
//------------------------------------begin
allow_url_fopen=Off
allow_url_include=Off
//------------------------------------end
 
6). 关闭全局注册变量,不过默认5.x版本的php是off:
//-------------------------------------begin
register_globals=off
//-------------------------------------end
 
7). 关于安全模式和粗暴的魔术引号过滤,注意到save_mode模式在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了:
//------------------------------------begin
safe_mode=On
safe_mode_include_dir = D:/phpstudy/www/include/
magic_quotes_gpc=Off   #如果开启了这个,然后在php应用中使用addslashes()过滤输入会造成双重转义,使得过滤无济于事,遇到这种情况时可以使用函数   get_magic_quotes_gpc() 进行检测。
magic_quotes_runtime
//------------------------------------end
 
8). 资源管理防止过分消耗服务器资源:
//------------------------------------begin
max_execution_time = 30
max_input_time = 30
memory_limit = 40M
//------------------------------------end
 
9). 禁用危险函数:
//------------------------------------begin
disable_functions =
phpinfo,eval,passthru,assert,exec,system,ini_set,ini_get,get_included_files,
get_defined_functions,get_defined_constants,get_defined_vars,
glob,``,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,
ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,
symlink,popepassthru,stream_socket_server,fsocket,fsockopen
//------------------------------------end
 
10). 限制php访问文件系统:
//------------------------------------begin
open_basedir='/var/www/html/';......;......
//------------------------------------end
 
11). session保存路径:
//------------------------------------begin
session.save_path="/var/lib/php/session"
//------------------------------------end
 
12). 上传文件默认路径:
//------------------------------------begin
upload_tmp_dir="/var/lib/php/upload"
//------------------------------------end
 
 
3. 关于危险函数
 
特殊符号:
//------------------------------------begin
“:反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的,同时与其它某些语言不同,反引号不能在双引号字符串中使用。否则将会当作shell命令执行,执行效果等同于shell_exec()。
 
文件操作:http://php.net/manual/zh/ref.filesystem.php。
 
全局信息,配置等:http://php.net/manual/zh/ref.info.php。
 
程序执行:http://php.net/manual/zh/book.exec.php。
//------------------------------------end
 
 
4. 不要过分相信php
 
1). 弱类型
#前人之述备矣,仅仅做个汇总。同样还可以参看官网给出的类型表(PHP 类型比较表)。
//------------------------------------begin
0=='0'        //true
0 == 'abcdefg'    //true
1 == '1abcdef'    //true
null==false     //true
123=='123'      //true
 
//哈希比较
"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1dddada"    //false
"0e1abc"=="0"     //true
 
"0x1e240"=="123456"        //true
"0x1e240"==123456        //true
 
var_dump(intval('2'))    //2
var_dump(intval('3abcd'))    //3
var_dump(intval('abcd'))    //0
 
//任意两个array,MD5相等
var_dump(md5($array1)==var_dump($array2));    //true
 
//case 自转换,以下代码输出i is less than 3 but not negative
$i ="2abc";
switch ($i) {
case 0:
case 1:
case 2:
echo "i is less than 3 but not negative";
break;
case 3:
echo "i is 3";
}
 
//in_array的缺陷,array_search
$array=[0,1,2,'3'];
var_dump(in_array('abc', $array));  //true
var_dump(in_array('1bc', $array));    //true
 
//strcmp在php5.x个版本后有些特性不太同,所以遇到的时候具体讨论
//------------------------------------end
 
2). 全局注册变量
#如果已经弃用的 register_globals 指令被设置为 on 那么局部变量也将在脚本的全局作用域中可用。例如, $_POST['foo'] 也将以 $foo 的形式存在。这将会造成一些变量覆盖,条件判断绕过。以下是简化的全局变量认证绕过模型:
//------------------------------------begin
if(authenticated_user()){
$authorized=true;
}
if($authorized){
do something......
}
 
#对于以上的绕过,我们可以有以下的规避措施:(1) php.ini register_globals=off(2) 在每次判断前初始化变量,如下:
 
$authorized=false;
 
if(authenticated_user()){
$authorized=true;
}
if($authorized){
do something......
}
//------------------------------------end
 
3). php伪协议
#伪协议在很多绕过场景下发挥着举足轻重的作用,如后面提到的文件包含file://协议绕过,以及最近才提出的phar协议反序列化对象注入,我们可以在不存在可控unserialization()函数的情况下利用phar反序列化对象,实现对象注入。所以在web应用中不要忽视他们的存在,千里之堤,溃于蚁穴。
//------------------------------------begin
file:///var/www/html  访问本地文件系统
ftp://<login>:<password>@<ftpserveraddress>   访问FTP(s) URLs
data://  数据流
http:// — 访问 HTTP(s) URLs
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流
zlib:// — 压缩流
data:// — Data (RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP Archive
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — Audio streams
expect:// — 处理交互式的流
//------------------------------------end
 
  


---------------------------------------------------------------------------------------------
不忘初心 方得始终!

唯有志存高远,方能风行天下。

道之所存,虽千万人吾往矣! 情之所钟,虽千万里吾念矣~

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。