复制代码

php代码审计--SSRF(服务端请求伪造)

SSRF审计要点一:

  一些危险函数:curl_exec()、fsockopen()、file_get_contents()、fopen()

  curl_exec():

  函数发起curl请求

  url参数用户可控会导致ssrf

  fsockopen():

  函数打开一个网络连接或者一个unix套接字连接

  host和port参数用户可控会导致ssrf

  $sf = fsockopen('www.test.com',80,$errno,$errstr,30);

            host  port       timeout

  还有pfsockopen()和dfsockopen()等函数

  file_get_contents()/foprn()函数:

  本质上是文件读取函数,但它也能读取远程web页面,所以会导致ssrf。

  若该函数中的参数可控,同时也会存在任意文件读取漏洞。

  ssrf需要将php.ini的allow_url_fopen设置成on才能利用。

 

SSRF审计要点二:

  找到危险函数之后

  分析其中参数是否可控;

  是否存在绕过;

  是否限制url(黑/白名单);

  是否限制请求协议(file://、ftp://、gopher://、dict://等);

  是否限制请求端口

  ......

parse_url与curl的不一致性

  parse_url()函数用于解析url并返回解析组成部分的一个关联数组,该函数不会检测url是否合法,只会尽量正确的将其解析。

  某些php程序会利用parse_url()对url进行解析,parse_url与curl两者对url的解析差异可能导致ssrf绕过。

  例如:

    http://user@test.com:80@hacktest.com

          curl解析   parse_url解析

filter_var的解析特性:

  此函数使用特定的过滤器对变量进行过滤。

  此函数对于http://evil.com;google.com会返回false也就是认为url格式错误,但是对于0://evil.com:80;googlr.com:80/、0://evil.com:80,google.com:80/、0://evil.com:80\google.com:80/却返回true。

  fileter_var('http://example.com',FILTER_VAILDATE_URL,FILTER_FLAG_PATH_REQUIRED)           host      过滤器

 

SSRF防范:

  1.设置URL白名单或者限制不允许请求内网IP。

  2.限制请求的端口为必要或常见端口,比如80,443,8080等。

  3.仅允许指定的请求协议,比如http和https请求,可以防止file://,gopher://,dict://等协议引起的问题。

  4.不回显返回信息或过滤返回信息,验证远程服务器对请求的响应是比较容易的方法,如果web应用必须返回请求结果,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

  5.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

  

 

posted @ 2020-08-27 14:33  BU羡  阅读(403)  评论(0)    收藏  举报