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

  • 是否在表单处存在随机token 。
  • 是否存在敏感操作的表单 。
  • CSRF主要利用场景实际上是一些越权的操作 , 或者一些敏感功能存在的地方 , 例如管理后台、会员中心等地方 。 我们可以尝试搜索表单位置 , 查看是否会生成随机token , 在查看后端代码中是否会先验证这部分的token 。 如果没有验证token , 再进一步看看是否有refer的相关验证 , 如果没有 , 那么就存在CSRF的问题 。
    可以尝试全局搜索
    csrf-token
    csrf_token
    csrftoken
    csrf

    下面是一个更新密码的操作 , 假设构造一个链接为 http://127.0.0.1/index.php?password_new=password&password_conf=password&Change=Change#的链接 , 直接发送给受害者点击 , 那么当前情况下 , 可以直接修改受害者的密码 , 因为没有进行任何的验证措施 。 当然一般代码不会这么写 , 只是拿DVWA的CSRF举个例子 。

    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. 变量覆盖审计要素