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.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

浙公网安备 33010602011771号