快捷搜索:   nginx

php_info漏洞解决方案分析

应群里朋友要求,我就班门弄斧一次,个人感觉大致是这样的,看有什么不对的,各位帮忙纠正下
首先我们要知道
1.request_filename表示当前连接请求的文件路径,由root或alias指令与URI请求生成。这个变量是本地文件系统的文件名称
2.!-e判断不存在
3.set在这里是设定shell变量并赋值
4.剩余的就是if判断,~*区分大小写,\转义字符,其余的这里不多说了
下面来对比下张宴给出的php_info漏洞的俩个解决方案

  1. if ($request_filename ~* .*\.(phpphp5)$) {
     
  2. set $is_path_info '0';
     
  3. }
     
  4. if (-e $request_filename) {
     
  5. set $is_path_info '1';
     
  6. }
     
  7. if ($is_path_info ~ '0') {
     
  8. return 403;
     
  9. }
  1. if ($request_filename ~* (.*)\.php) {
     
  2. set $php_url $1;
     
  3. }
     
  4. if (!-e $php_url.php) {
     
  5. return 403;
     
  6. }

明显区别就是判断的第一句最后的$符号,是结尾的意思,也就是说不是php结尾即可- -!!,之后去掉了$只去掉$还不行,
重启nginx会出错[emerg]: invalid condition “.*\.php”需要把.*用括号,括起来
至于为什么michael说的如http://localhost/..1.jpg/1.php/?abc=1这样的url二次执行可以绕过第一种配置
原因其实很简单,大家可以新建test.php代码如下
 

  1. <?system ($_GET[id]);?>

访问http://http://localhost/test.php?id=uname%20-a和http://localhost/test.php/?id=uname%20-a
同样是可以执行的,根据以上判断这个大家不难理解,所以什么”..xx.jpg”前面的点有没有都是无所谓的.这个也算是一个bug吧放入nginx.conf测试一切正常,支持php_info伪静态,问题得到解决.
为了便于多个虚拟主机引用,我们可以加入fcgi.conf,内容如下


  1.  
  2. if ($request_filename ~* (.*)\.php) {
     
  3.     set $php_url $1;
     
  4. }
     
  5. if (!-e $php_url.php) {
     
  6.     return 403;
     
  7. }
     

  8.  
  9. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
     
  10. fastcgi_param  SERVER_SOFTWARE    nginx;
     

  11.  
  12. fastcgi_param  QUERY_STRING       $query_string;
     
  13. fastcgi_param  REQUEST_METHOD     $request_method;
     
  14. fastcgi_param  CONTENT_TYPE       $content_type;
     
  15. fastcgi_param  CONTENT_LENGTH     $content_length;
     

  16.  
  17. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
     
  18. fastcgi_param  SCRIPT_NAME        $uri;
     
  19. fastcgi_param  REQUEST_URI        $request_uri;
     
  20. fastcgi_param  DOCUMENT_URI       $document_uri;
     
  21. fastcgi_param  DOCUMENT_ROOT      $document_root;
     
  22. fastcgi_param  SERVER_PROTOCOL    $server_protocol;
     

  23.  
  24. fastcgi_param  REMOTE_ADDR        $remote_addr;
     
  25. fastcgi_param  REMOTE_PORT        $remote_port;
     
  26. fastcgi_param  SERVER_ADDR        $server_addr;
     
  27. fastcgi_param  SERVER_PORT        $server_port;
     
  28. fastcgi_param  SERVER_NAME        $server_name;
     

  29.  
  30. # PHP only, required if PHP was built with --enable-force-cgi-redirect
     
  31. fastcgi_param  REDIRECT_STATUS    200;
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论