PHP|代码审计思路之PHP代码审计( 五 )



6.2.4. SSRF漏洞ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器 。 常见的方式如下:
1.可以对外网、服务器所在内网、本地进行端口扫描 , 获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别 , 通过访问默认文件实现;
4.攻击内外网的web应用 , 主要是使用get参数就可以实现的攻击(比如struts2 , sqli等);
5.利用file协议读取本地文件等 。
审计要素:

  • 是否存在可以产生SSRF漏洞的函数 。
  • 是否存在内网ip地址正则过滤 , 且正则是否严谨 。
  • 是否存在限制请求的方式只能为HTTP或者HTTPS 。
当然PHP底下经常可能会出现SSRF漏洞的主要有几个函数 , 它们分别是file_get_contents()、fsockopen()、curl_exec()、get_headers() 。 通过全文关键函数搜索 , 在看是否限制了访问端口 , 访问协议 , 内网ip地址等 。
利用file://、http/https:// 、dict://、gopher://协议去搞内网 。
列一下 , 我经常搜索的关键词
file_get_contents
fsockopen
curl_exec
get_headers
fopen
readfile

注意
  1. 一般情况下PHP不会开启fopen的gopher wrapper
  2. file_get_contents的gopher协议不能URL编码
  3. file_get_contents关于Gopher的302跳转会出现bug , 导致利用失败
  4. curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
  5. curl_exec() //默认不跟踪跳转 ,
  6. file_get_contents() // file_get_contents支持 php://input协议
各种绕过 , 我就不在这说了 。
6.2.5. XML外部实体注入审计要素
  • 参数是否用户可控
  • 是否libxml版本为2.9.0以上
  • 是否禁用了外部实体
这个一般我关注的少 , 仅仅是搜索“DOMDocument” , “SimpleXMLElement”和“simplexml_load_string”等关键词 , 分析下是否存在参数拼接的XML字符串 , 或未做限制的批量解析方法 。 对参数进行回溯 , 判断其是否用户可控 。
6.2.6. 文件包含漏洞审计要素
  • 参数是否用户可控
  • 是否存在include , require , include_once require_once等函数 。
文件包含算是拿shell最快的方法了 , 所以一般要重点关注 。
无非是include , require , include_once require_once这四个函数 , 全局搜索这四个函数 , 一个一个去看 , 去回溯 , 查看变量可不可控 。
6.2.7. 文件上传漏洞审计要素
  • 是否检查了上传文件的文件类型
  • 是否限制了文件上传路径
  • 是否对文件进行了重命名
  • 文件大小是否限制
  • 是否返回了文件路径或文件路径很好猜测
有的项目 , 会对文件上传下载进行分装 , 所以可以全局搜索有关upload、file的函数 , 看看是不是封装了
function upload
function file

如果封装了 , 那么就看这些封装好的函数 , 有没有上面提到的审计要素的漏洞 。
如果没封装 , 一般是move_uploaded_file这个函数 , 全局搜索 , 这个函数 , 回溯查看这些漏洞存不存在 。 (白盒黑盒一起搞比较好 。 )
6.2.8. 变量覆盖审计要素