加固思路
防御跨站要防御的有三点,第一是防止其他用户列网站目录,防止自己的一些敏感文件名被看到及访问;第二是防止其他用户读取自己的文件,防止配置信息泄露;第三就是防止其他用户写shell在自己目录。
nginx加固措施
0x01 屏蔽ip
可以根据业务需求屏蔽一部分的ip、可以过滤大部分来自国外的恶意扫描或者无用访问。
if ( $geoip_country_code !~ ^(CN|US)$ ) {
return 403;
}
0x02 封杀各种user-agent
除非经过伪装,恶意扫描工具一般都会在user-agent里留下某些特征字眼,比如scan,nmap等。我们可以用正则匹配这些字眼,从而达到过滤的目的,请根据需要调整。
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
return 403;
}
if ($http_user_agent ~* "" ) {
return 403;
}
这里分析得不够细致,具体的非法user-agent还得慢慢从日志中逐个提取。
0x03 封杀特定的url
特定的文件扩展名,比如.bak
location ~* \.(bak|swp|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;
}
知名程序,比如phpmyadmin
location /(admin|phpadmin|status) { deny all; }
0x04 封杀特定的http方法和行为,比如
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 405;
}
if ($http_range ~ "\d{9,}") {
return 444;
}
0x05 强制网站使用域名访问,可以逃过IP扫描,比如
if ( $host !~* 'abc.com' ) {
return 403;
}
0x06 url 参数过滤敏感字,比如
if ($query_string ~* "union.*select.*\(") {
rewrite ^/(.*)$ $host permanent;
}
if ($query_string ~* "concat.*\(") {
rewrite ^/(.*)$ $host permanent;
}
0x07 强制要求referer
if ($http_referer = "" ) {
return 403;
}
0x08 目录只读
如果没有上传需求,完全可以把网站根目录弄成只读的,加固安全。
0x09 overlayfs
假设网站根目录/var/www/html有一个目录upload是要求可读写的,其他只读即可,那么仔细看下面的操作
mkdir -p /data/lower
mkdir -p /data/upper
mkdir -p /data/worker
mv /var/www/html/upload /data/upper/
mv /var/www/html/* /data/lower/
mount -t overlayfs overlay -o lower=/data/lower,upper=/data/upper,workdir=/data/worker /var/www/html
php 加固措施
0x10 禁用不安全PHP函数
disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,phpinfo
0x11 关闭php错误日志
display_errors = On
改为
display_errors = Off
0x12 关闭php信息
expose_php = On
改为
expose_php = Off
不轻易透露自己php版本信息,防止黑客针对这个版本的php发动攻击.
0x13 禁止动态加载链接库
disable_dl = On;
改为
enable_dl = Off;
0x14 禁用打开远程url
allow_url_fopen = On
改为
allow_url_fopen = Off
参考资料
https://www.imooc.com/article/33496
http://www.vuln.cn/6334
https://blog.51cto.com/purplegrape/1651656