web渗透测试之代码审计

  1. 基本信息:
    • 原理:
      • 代码安全测试是从安全的角度对代码进行测试评估
      • 结合丰富的安全知识、编程经验、测试技术,利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷,在代码形成软件前将业务安全降到最低
    • 方式:
      • 人工+工具双重审核
      • 人工审核:
        • 既能解决内部问题也能解决外部问题,最有效率的解决方案,理论上人工审核最有效,但是效率不高,所以会采用自动化分析工具辅助人工的方式来提供效率
      • 静态分析工具:
        • 通过一组全面规则、测试机制和方针在软件开发过程、测试过程发现软件的安全缺陷
    • 思路(php代码审计为例):
      • 通读全文代码,从功能函数代码阅读开始,如include关键词下的common_fun.php或者类似关键词的文件
      • 看配置文件,带有config关键词的文件,找到mysql.php文件的connect()函数,查看数据库是否有连接漏洞
      • 跟踪index.php文件,了解此文件运作时加载了哪些函数和文件,一层一层去扩展阅读包含的文件,了解功能 
    • 漏洞产生的原因:
      • 变量控制不严(一切输入都是有害的)
      • 变量到达有利用价值的函数(一切进入函数的变量都是有害的),漏洞利用的效果取决于最终函数的功能
    • 挖掘流程:
      • sql注入关键词:
        • select、insert、update、$_GET、$_POST、$_REQUEST、urldecode/rawurldecode(编码注入关键词)、gbk(宽字节注入关键词)
        • pdo预处理所用函数prepare、execute
        • 原理:
          • 1、先看预处理的语法

              $pdo->prepare('select * from biao1 where id=:id');

              $pdo->execute([':id'=>4]);

            2、语句一,服务器发送一条sql给mysql服务器,mysql服务器会解析这条sql。

            语句二,服务器发送一条sql给mysql服务器,mysql服务器不会解析这条sql,只会把execute的参数当做纯参数赋值给语句一。哪怕参数中有sql命令也不会被执行,从而实现防治sql注入。
             

      • 上传漏洞关键词:
        • $_FILES、move_uploaded_file
      • CSRF漏洞关键词:
        • token、referer
      • 执行漏洞关键词:
        • shell_exec、exec、passthru、system、popen
      • 包含关键词:
        • include、include_once、require、require_once
      • 文件下载、读取漏洞关键词:
        • file_get_contents()、highlight_file()、fopen()、readfile()、fread()、fgetss()、fgets()、parse_ini_file()、show_source()、file()
      • 变量覆盖关键词:
        • $$
      • XSS跨站漏洞关键词:
        • echo、print、print_r、var_dump、var_exprot
      • 会话认证漏洞关键词:
        • cookie、session、sso、oauth、openid等
      • xsearch工具搜索关键词:
        • web渗透测试之代码审计_第1张图片

  2. 使用工具进行代码审计:
    • Fortify工具的使用:
      • web渗透测试之代码审计_第2张图片
      • 根据工具扫描结果分析风险漏洞成因,手工跟踪相关函数及变量,测试漏洞是否可利用、排除误报可能。
      • 通过工具修复建议,手工修复相关漏洞。如XSS漏洞:$data = htmlentities ($_POST['input']);
    • Seay源代码审计系统的使用:
    • 工具的局限性:
      • 工具本身存在一定量的误报或者漏报。
        扫描结果需要大量人工确定甄别。
        如用多种语言开发的软件,则需单独分析。
        使用工具缺乏规范化的编码规范。
        不能自动收集常见的代码安全问题。      
  3. 代码审计思路:
    • SQL注入
      • 原理:
        • 开发者在编写数据库代码的时候直接将外部可控的参数拼接到SQL语句中,没有经过任何过滤就直接放入数据库引擎执行。由于SQL注入是直接面对数据库进行攻击的,所以它的危害不言而喻。
      • 攻击方式:
        • 权限较大的情况下,通过SQL注入可以直接写入webshell,或者执行系统命令等。
        • 权限较小的情况下,通过SQL注入来获得管理员密码等信息,或者修改数据库内容进行一些钓鱼或者其他间接利用
        • sqlmap是用的最多的注入工具,python开发,支持多种方式所有类型的数据库注入,兼容性强。
      • 利用方式:
        • 普通注入:
          • 结果:');
            print_r(mysql_fetch_row($result))
            ?>
          • 观察上述代码,存在一些关键词:select from、mysql_connect、mysql_query、mysql_fetch_row等,还有update、insert、delete等,在做白盒审计时,只需要查找这些关键词,即可定向挖掘sql注入漏洞
        • 编码注入:
          • 宽字节注入:
            • 当使用php连接mysql时候,设置"set character_set_client=gbk"时会导致一个编码转换的注入问题,也就是宽字节注入,这时在注入参数里带入%df%27,即可把程序中过滤的\(%5c)吃掉,由于单引号被自动转义成"\'",前面%df和转义字符\反斜杠(%5c)组合成%df%5c,也就是“運”字,成功闭合前面的单引号
            • 原因:php连接mysql使用了set characer_site_client="gbk"。
            • 解决方法:
              • set character_set_client=binary
              • pdo处理:setAttribute(PDO::ATTR_EMULATE_PREPARES,false);禁用prepared statements的仿真效果
          • 二次urldecode注入:
            • 只要字符被进行转换就可能产生漏洞,现在web程序大多进行参数过滤,通常使用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC的方式来防止注入。
      • 漏洞防范:
        • 过滤函数和类union、select等关键词
        • pdo预处理:prepare()、execute()函数预编译的方式来处理数据库查询。
    • XSS漏洞:
      • 原理:
        • 跨站脚本攻击:攻击者利用网站漏洞把恶意脚本代码注入到网页当中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者用户可能采取Cookie窃取、会话劫持、钓鱼欺骗等各种攻击。通常包含了用户端脚本语言。
      • 分类:
        • 反射型XSS:通过外部输入直接在浏览器端触发
        • 存储型XSS:把代码先保存到数据库或者文件中,web程序读取利用代码时候并输出到页面触发漏洞
      • 危害:
        • 窃取cookie、修改页面钓鱼等
        • 一句话:前端页面能做的事它都能做
      • 挖掘经验:
        • 寻找没有被过滤的参数,且这些参数传入到输出函数,输出函数列表如下:
        • print、print_r、echo、printf、sprintf、die、var_dump、var_export
        • XSS对浏览器环境的利用影响大,需要掌握浏览器容错、编码等特性和数据协议
      • XSS出现的地方(XSS比SQL注入更多,也更难防御):
        • 文章发表、评论回复、留言及资料设置等地方
        • 资料设置的地方:用户昵称、签名、修改资料
      • 漏洞防范:
        • 特殊字符HTML实体转码(' " <> \ : & # )
        • 输出和二次调用的时候进行如HTML一类的转码,防止脚本注入
    • CSRF漏洞:
      • 原理:
        • 跨站请求伪造(劫持其他用户进行一些请求)
      • 如何挖掘:
        • CSRF主要用于越权操作,所有漏洞自然在有权限控制的地方
        • 管理后台、会员中心、论坛帖子及交易管理等
      • 具体操作:
        • 相关页面使用burp suite抓包看看有没有token,如果没有token,再直接请求这个页面,不带referer,如果返回数据还是一样的话,就很有可能存在CSRF漏洞,
        • 白盒:找源代码里边有没有token和referer相关代码
      • 漏洞防范:
        • 增加token、referer验证避免img标签请求的水坑攻击
        • 增加验证码
    • 文件操作漏洞:
      • 文件操作包括(文件包含、文件读取、文件删除、文件修改及文件上传),每种漏洞都有各自的漏洞以及利用方式。
      • 文件包含(包含直接执行包含文件的代码,包含文件格式不受限制,能正常执行 ):
        • 分类:
          • 本地文件包含(local file include)
            • 上传一个允许上传的文件格式文件再包含来执行代码
          • 远程文件包含(remote file include)
            • 需要设置allow_url_include=On、magic_quotes_gpc=off
            • php5.2之后是PHP_INI_ALL
            • php输入输出流利用方式:可以直接执行post代码,如:post请求1.php?a=php://input
        • 危害:
          • 文件包含漏洞大多可以直接获取webshell
        • 函数:
          • include()、include_once()、require()、require_once()
        • 区别:
          • include遇到错误依然执行,require遇到错误直接退出程序
        • 文件包含截断:
          • %00截断:受限于GPC和addslashes等函数的过滤,php5.3之后修复了%00截断
          • 利用多个英文(.)点号和反斜杠(/)来截断,php5.3之后也修复了
          • 远程文件包含利用时间问号(?)来伪截断,访问http://xxx.com/1.txt?.php,问号后面的当成请求参数
      • 文件读取(下载)漏洞(读取敏感文件):
        • 黑盒:
          • 查看功能点对应的文件,再去读文件,查找文件下载的地方,使用../../方式读取上层敏感信息文件
        • 白盒:
          • 搜索文件读取的函数,如:file_get_contents()、highlight_file()、fopen()、readfile()、fread()、fgets()、show_source()、parse_ini_file()、file()
        • 除此之外也可以利用php文件流读取文件:php://fiter/
      • 文件上传漏洞:
        • 原理:
          • 代码写进文件里面执行,如果把文件上传到管理员或者应用程序不想让你上传的目录,那就是文件上传漏洞
        • 挖掘经验:
          • 白盒:
            • 代码文件里搜索:move_upload_file()函数,再去调用这个函数上传文件的代码存不存在未限制上传格式或者可以绕过
          • 黑盒:
            • 搜索网站有文件上传的地方,添加文章、留言板等
          • 思路:
            • 黑名单绕过:限制的扩展名不够全、存在漏网之鱼,配合IIS的解析漏洞(cdx、asa、cer),可以直接绕过
            • 如果是黑名单限制文件格式以及未更改文件名的方式,没有更改文件名的情况下,在apache利用其向前寻找解析格式和iis6的分号解析bug都可以执行代码
            • 验证扩展名的方式存在问题可以直接绕过,结合php和系统的特性,导致可以截断文件名绕过黑名单限制。
            • 文件头、content-type验证绕过:抓包在文件头里面加上"GIF89a",就会返回一个图片的尺寸数组。
        • 防范:
          • 白名单方式过滤文件扩展名,使用in_array()或者三个===对比扩展名
          • 保存上传的文件名时需要重命名文件,文件命名规则采用时间戳拼接md5方式
    • 代码执行漏洞:
      • 原理
        • 应用程序本身过滤不严,通过请求将代码注入到应用中执行。如:php代码执行就是把代码注入到应用中最终到webserver去执行
      • 原因:
        • eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()、array_map()等参数过滤不严导致
      • 漏洞防范:
        • 参数过滤
    • 命令执行漏洞:
      • 原理:
        • 可以执行系统或者应用(如CMD或者bash命令)的漏洞
        • system()、exec()、shell_exec()、passthru()、pcntl_exec()、popen()、proc_open()
        • php执行命令是继承webserver用户的权限,一般是向web目录写文件,漏洞危害大
      • 防范:
        • 参数白名单:参数过滤不严产生的漏洞都可以使用参数白名单,在配置文件中限定某些参数,在使用的时候匹配一下参数在不在白名单列表中,如果不在直接报错即可
    • 逻辑处理漏洞:
      • 原理:
        • 广义上来说,大多数的漏洞都是由于程序的逻辑失误导致的,都可以叫做逻辑漏洞,但我们这里说的逻辑漏洞没有那么大范围,这里指程序在业务逻辑上面的漏洞,业务逻辑漏洞也是一个不小的范围,在不同的业务场景有不同的漏洞出现,目前逻辑漏洞是各大企业存在最多的漏洞之一,因为逻辑漏洞在挖掘和利用时都需要进行一些逻辑判断,机器代码很难模拟这块的逻辑处理,所以无法用机器批量化扫描检测,检测的少了,现存的漏洞自然就多了。
      • 场景:
        • 支付、找回密码、程序安装等
      • 挖掘:
        • 通读源码,熟悉程序的业务流程,焦点:程序是否可以重复安装,修改密码处是否可以越权修改其他用户密码、找回密码验证码是否可以暴力破解以及修改其他用户密码,cookie是否可预测或者可绕过等
      • 防范:
        • 熟悉业务逻辑,根据业务需要编写满足需求而又不画蛇添足的代码
        • 多熟悉函数和功能的差异,代码执行逻辑上考虑周全
    • 会话认证漏洞:
      • 原理:
        • 会话认证是非常大的话题,涉及各种协议和框架,如cookie、session、sso、oauth、openid等,出现问题比较多的是cookie上面,cookie是web服务器返回客户端一段越来标识用户身份或者认证情况的字符串,保存在客户端,浏览器下次请求时会自动带上这个标识,由于这个标识字符串可以被用户修改,所以存在安全风险,一般这块的认证安全问题都出在服务端直接取用cookie的数据而没有校验,其次是cookie加密数据存在可预测的情况。另外是session是保存在服务器端的信息,如果没有代码操作,客户端不能直接修改session,相对比较安全。
      • 挖掘:
        • 找到登录注册的程序功能代码,查看整个过程有没有可以控制session值或者直接绕过密码验证的漏洞
      • 防范:
        • 严格限制输入的异常字符以及避免使用客户端提交上来的内容直接去操作,把session和cookie结合起来使用,设置session时,保证客户端不能操作敏感session参数。
        • 敏感数据不要放到cookie中,防止攻击者通过cookie登录你的账号

你可能感兴趣的:(web安全)