zoukankan      html  css  js  c++  java
  • 代码审计入门

    又补了一大章节的课程,对我来说感觉很多都要学习,不太会,那就先熟悉流程

    1 代码审计入门

    1、常见的代码审计工具

    1、Fortify SCA

    2、Checkmarx CxSuite

    3、360代码卫士

    4、PHP代码审计工具——Rips

    参考:https://www.jianshu.com/p/cd1cb66e4d7d

    5、seay代码审计(常用)

    参考:https://www.oschina.net/p/seay

    6、SonarQube

    参考:https://www.cnblogs.com/qiumingcheng/p/7253917.html

    7、Cobra

    参考:https://zhuanlan.zhihu.com/p/32363880

    8、kiwi

    参考:https://github.com/alpha1e0/kiwi

    2、代码审计中常见的危险函数和字符串

    参考:

    https://wps2015.org/drops/drops/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E5%85%A5%E9%97%A8%E6%80%BB%E7%BB%93.html

    0x01 整体

    0x02 各种洞洞

    a.文件操作漏洞

    1.文件包含漏洞:

    (1) 本地文件包含:
    (2) 远程文件包含:
    (3) 文件包含截断:

    2.文件读取(下载)漏洞:

    3.文件上传漏洞:

    (1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件即可利用。
    

        (2) 黑名单扩展名过滤:

        (3) 文件头 content-type验证绕过:

    (4) 防范:

    4.文件删除漏洞:

    b.代码执行漏洞

    1.代码执行函数:

    (1) preg_replace()函数:

    (2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…):
    (3)eval()和assert():

    2.动态函数执行:

    3.命令执行函数:

    (1) popenproc_open()

    (2) 反引号命令执行:

    c.变量覆盖漏洞

    1.函数使用不当:

    2.$$变量覆盖:

    d.逻辑漏洞

    1.等于与存在判断绕过:

    (1) in_array(): 比较之前会自动转换类型
    (2)is_numeric():当传入参数为hex时 直接通过并返回true 并且MYSQL可以直接使用hex编码代替字符串明文 可以二次注入 并且可能造成XSS漏洞
    

    (3)双等于==和三等于===

    2.账户体系中的越权问题:

    (1) 未exit/return/die:
    (2) 支付漏洞

    e.会话认证漏洞

    1. 找到传入sql语句的参数的传递过程 回溯变量到最原始的函数 看它保存在cookie的算法 是否可逆
    2. 和MD5比起 sha1更安全 解密sha1的网站更少
    3. 限制一个用户只能同时在一个IP上登录

    f.二次漏洞

    1.类型:

    2.技巧:

    (1) 钻GPC等转义的空子:
      GBK的宽字节注入
    (2)字符串问题:

    2 常见的危险函数和审计点

    1、RIPS审计工具的下载,安装,使用

    2、PHP常见的部分危险函数解析

    2.1 PHP代码执行函数

    a.eval()

    b.assert()

    c.create_function()

    2.2 PHP包含函数

    常见的包含函数:require,include,require_once,include_once

    include $file 中,如果变量 $file 可控,则就可以包含任意文件。

    此外,根据不同的配置环境,可以包含不同的文件:远程文件和本地文件。

    包含函数还可以通过支持的协议和封装协议以及 过滤器读取任意文件内容。

    例子,如

    利用php流filter读取任意文件

    include($_GET('file');

    // ?file=php://filter/convert.base64-encode/resource=index.php

    上面的代码中,就通过filter读取index.php的内容,并将内容编码成base64再输出。

    2.3命令执行函数

    常见的命令执行函数有:

    * exec() -- 执行一个外部程序

    * passthru() -- 执行外部程序并显示原始输出

    * proc_exec() -- 通过shell环境执行命令,并且将完整的输出以字符串的方法返回

    * system() -- 执行外部程序,并且显示输出

    * popen() -- 通过popen()的参数传递一条命令,并对popen()所打开的文件进行执行。

    2.4 文件操作函数常见的任意文件读取,写入,删除往往是下面几个函数受到了控制.

    copy() -- 拷贝文件

    file_get_contents() -- 将整个文件读入一个字符串

    file_put_contents() -- 将一个字符串写入文件

    file() -- 将整个文件读入一个数组中

    fopen() -- 打开文件或者URL

    move_uploaded_file() -- 将上传的文件移动到新位置

    readfile() -- 读取文件

    rename() --重命名文件或者目录

    rmdir() -- 删除目录

    unlink() & delete() -- 删除文件

    详细参考链接:https://www.zybuluo.com/Dukebf/note/715934

    https://www.bbsmax.com/A/pRdB8DR6Jn/

    3 代码审计实战之SQL注入漏洞

    1.基本技巧

    sql注入漏洞通常有两种利用方式。一种是权限较大,直接写入webshell,另外一种是权限较小,但是可以读取用户账号密码,比如读取管理员账号密码,登录后台管理。

    sql注入经常出现在登录页面http请求中的user-agent,client-ip,x-forward-for等可能会被程序存储到数据库中的地方。另外,在订单处理的地方,由于业务逻辑复杂,经常会有二次注入漏洞。

    至于在白盒审计中,若想定向挖掘sql注入漏洞,只需要注意这几个数据库操作关键字:select from , mysql_connect , mysql_query , mysql_fetch_now , update , insert , delete ; 查到这些关键字后,定向追踪他们,就可以审计sql注入漏洞

    2.编码注入

    程序在进行一些操作之前,经常会进行一些编码处理,通过输入一些编码函数不兼容的特殊字符,可以导致输出的字符变成有害数据。其中最常见的编码注入就是mysql的宽字节注入以及urldecode/rawurldecode这两个函数。

    宽字节注入

    怎么说呢,这个漏洞以前研究过,但是总是没研究透。个人感觉,只要是set character_set_client='gbk'或者set NAMES 'gbk',那么就可能存在漏洞。至于原理虽然无法搞的十分清楚,但是可以直接手工测试。看能否吃的掉转义字符。

    解决这个漏洞的方法:

    第一种方法,set NAMES 'gbk' 之后,在 set character_set_client=binary就可以了。

    第二种方法,使用pdo方式,在php5.3.6及以下版本设置 setAttribute(PDO::ATTR_EMULATE_PREPARES,false);来禁用prepared statements的仿真效果。

    综上所述,要想看代码中是否有宽字节注入,那么搜索几个关键字:

    SET NAMES

    character_set_client

    mysql_set_charset('gbk')

     

    二次urldecode注入

    如果目标网站开启了GPC,并且用了urldecode或者rawurldecode函数,那么通过二次解码,第二次就会解析出单引号,导致注入。

    因此,在代码审计中,可以通过搜索urldecode和rawurldecode来挖掘二次注入漏洞。

     

    常见的注入点:

    • 输入
    • HTTP头
    • user-agent
    • client-ip
    • x-forward-for
    • 数据库操作关键字
    • select/update/insert/delete
    • mysql_connect
    • mysql_query
    • mysql_fetch_row

     

    编码注入

    sql注入预防方法

    通常,程序要么被动获取参数,比如get,post;要么主动读取文件或者远程页面;因此,过滤好这两条路,就可以防止sql注入。

    在PHP的核心配置中,magic_quotes_gpc负责对get,post,cookie的值进行过滤,magic_quotes_runtime对从数据库中或者文件中获取的数据进行过滤。

    但是,上面两种方法只能过滤部分sql注入,因为他们只是转义了单引号,双引号,反斜杠,空字符null,对int注入没什么用。因为int类型可以直接接sql语句,不需要闭合。

     

    addslashes函数

    这个函数对参数中的单引号,双引号,反斜线,空字符进行过滤。但是有的程序员在开发的时候,没有考虑到get请求中可能存在数组(这个函数是对字符串进行过滤),导致了绕过。

    说实话,get请求中带数组是怎么带的?这个我还真比较懵。估计得完整开发一个网站之后,才能知道get请求中带数组是怎么回事?

    mysql_rel_escape_string($str,$con)

    这个函数也是过滤,第一个参数是字符串,第二个参数可选,是数据库连接,若没有设置第二个参数,那就默认为上一次连接的数据库。

    这个函数主要过滤的是:x00, , ,,',",x1a

    但是,这里的x00和x1a我不太懂是什么意思。

    intval()函数

    前面的函数针对的是字符型注入,对Int型注入效果不是太好。因此,这个intval()函数就是以白名单的思想,对数据进行过滤。

    4 代码审计实战之任意文件上传

    1、代码审计之文件上传漏洞危险函数的绕过姿势

    A.move_uploaded_file() 接着看调用这个函数的代码是否存在为限制上传格式或者可以绕过。

    B.getimagesize函数验证:只要在文件头添加GIF89a即可;

    C文件头content-type验证绕过:验证$_FILES[“file”][“type”]的值,这个是可控的。

    D.函数误用导致上传绕过

    以iconv()函数为例,在iconv转码的过程中,utf->gb2312(其他部分编码之间转换同样存在这个问题)会导致字符串被截断,如:$filename=”shell.php(hex).jpg”;(hex为0x80-0x99),经过iconv转码后会变成$filename=”shell.php “。

    E.竞争上传,主要涉及到的为copy函数。

     

    2、文件上传漏洞审计流程

    1. 审计函数
    2. move_uploaded_file()
    3. 定义和用法:
    4. move_uploaded_file() 函数将上传的文件移动到新位置。
    5. 若成功,则返回 true,否则返回 false。
    6. 语法:
    7. move_uploaded_file(file,newloc)
    8. 超全局变量 $_FILES
    9. 后缀名是图片格式
    10. 前缀名不能是外部提交的
    11. 上传的目录不可以是获取外部提交的路径

     

    3、代码举例分析

    文件上传首先需要一个表单,如下,我们把它叫做a.html

    <form action="t.php" method="post" enctype="multipart/form-data"><input name="aaa" type="file" /><input type="submit" /></form>
    

    这里有几个要素:

    • action属性是提交的目标。
    • method属性是提交所用的HTTP方法,常用的就是 POST 和 GET,文件上传一般用 POST。
    • enctype属性必须要写成这样,因为文件上传和普通的提交具有不同的编码方式。如果不写的话,可能会被当做urlencoded,就是k1=v1&k2=v2的键值对形式,导致解析不出东西。
    • 最后是文件输入框,它的name属性非常重要,它是PHP脚本中寻找文件的关键字。

    接下来是PHP脚本中的东西,PHP中通过$_FILES对象来读取文件,通过下列几个属性:

    • $_FILES[file]['name'] - 被上传文件的名称。
    • $_FILES[file]['type'] - 被上传文件的类型。
    • $_FILES[file]['size'] - 被上传文件的大小(字节)。
    • $_FILES[file]['tmp_name'] - 被上传文件在服务器保存的路径,通常位于临时目录中。
    • $_FILES[file]['error'] - 错误代码,0为无错误,其它都是有错误。

    t.php中的代码写成这样:

    <?phpif(!isset($_FILES['aaa'])) {
        echo 'file not found';
        exit();
    }
    
    var_dump($_FILES['aaa'])
    

    可以看到那个aaa就是文件输入框中的name属性。

    我们把这两个文件放到服务器的目录中,或者直接在目录下启动PHP自带的服务器。之后打开a.html随便传上去一个文件,会得到这样的结果,这里我直接上传了a.html

    array(5) { 
        ["name"]=> string(6) "a.html" 
        ["type"]=> string(9) "text/html" 
        ["tmp_name"]=> string(44) "C:UsersasusAppDataLocalTempphp43A1.tmp" 
        ["error"]=> int(0) 
        ["size"]=> int(133) 
    }
    

    需要说的是,在处理文件上传的时候,不应信任文件类型type,因为类型在浏览器生成之后,是可以改的。甚至可以手动构造出于类型与实际内容不匹配的数据包。

    同时也不应该信任文件名称name。而是应该分离文件名与扩展名,对扩展名进行白名单过滤。文件名按需舍弃重新生成,或者过滤后再使用。

    5 PHP反序列化漏洞代码审计

    1、什么是序列化

    A、PHP网站的定义:

    B、PHP反序列化

    2、理解PHP反序列化漏洞

    3、PHP反序列化漏洞利用的前提

    a.unserialize()函数的参数可控;

    b.php文件中存在可利用的类,类中有魔术方法

    4、PHP反序列化漏洞—发现技巧

    5、PHP反序列化漏洞—构造exploit思路

    6、案例分析

    https://www.cnblogs.com/xiaozi/p/7839256.html

    https://www.grt1st.cn/posts/php-unserialize-analysis/

    注:以上大多转自破壳笔记学习资料,欢迎大家前来报名学习

  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/klsfct/p/11192581.html
Copyright © 2011-2022 走看看