Finger
一只孤独的代码狗/程序猿/攻城狮

自己转发自己的,首发于圈子 https://www.secquan.org/CodeAudit/417

工作需要一直在代码审计漏洞挖掘这一块的

可能来不及审计写成帖子了(忙得一匹)

如有问题或者交流的
直接在帖子下面提问或者群里艾特我

我最近在审计的是drupal 8.2和joomla还有wordpress 4.7.5

跪求大佬支援

file

这篇就写思路吧。

首先你要知道,程序的根本是什么

函数和变量#

我们代码审计就怼这两个东西,要让根本变成可利用的漏洞

1.可控变量#
2.变量到达有利用价值的函数(危险函数)#

一般来说,漏洞的利用效果取决于最终函数的功能,
说下我自己的一些简单的思路,一般拿到一个cms,如果是之前一直没有审计过的,我就会先通读一遍代码,
再通过写思维导图(就是写目录注释的意思),看目录和对应功能的文件给一一列举一下出来(就是写代码注释的意思),摸清楚大体的框架。如果是之前就审计过的,我就不通读了,直接上工具走一遍危险函数。

接下来就是审计了,审计的话,我有两条线:

一是按照具体功能审计#

就是对应我们通读代码的时候标志好的

file

比如说,upload对应的是上传功能,那我们就应该开工找上传是首选。

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

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

(2) 黑名单扩展名过滤:
限制不够全面:IIS默认支持解析.asp,.cdx, .asa,.cer等。
扩展名可绕过:
不被允许的文件格式.php,但是我们可以上传文件名为1.php(注意后面有一个空格)

(3) 文件头 content-type验证绕过:
getimagesize()函数:验证文件头只要为GIF89a,就会返回真。
限制$_FILES["file"]["type"]的值 就是人为限制content-type为可控变量。

(4) 防范:
使用in_array()或 利用三等于===对比扩展名。
保存上传文件是重命名,规则采用时间戳拼接随机数:md5(time() + rand(1,1000))。

......等等 尼玛又扯远了,说思路的 ,基础看这个吧 https://www.secquan.org/CodeAudit/415

二是按照漏洞类型审计#

这个很好理解,命令执行,代码执行,sql注入,文件操作(包含上传读取下载等),变量覆盖,xss(个人认为还不如黑盒,有问题问我m哥:群里那个看不懂名字的那个~~)

其实按照漏洞类型的好处就是目标明确,我个人建议是此入手,直接上一个法师的代码审计工具,编写一下正则,就是这个

file

或者直接上notepad++的查找也一样的

file

规则的用处就是由高危函数回溯到Model层再到Control层,最终定位漏洞的触发位置。

再举个例子,写几条我常用的正则

file

双$$变量覆盖#

(?:extract|parse_str)\s{0,5}\(.{0,50}\$

\$\$

\${{0,1}\$\w{1,20}((\[["']|\[)\${0,1}[\w\[\]"']{0,30}){0,1}\s{0,4}=\s{0,4}.{0,20}\$\w{1,20}((\[["']|\[)\${0,1}[\w\[\]"']{0,30}){0,1}

array_map代码执行#

\barray_map\s{0,4}\(\s{0,4}.{0,20}\$\w{1,20}((\[["']|\[)\${0,1}[\w\[\]"']{0,30}){0,1}\s{0,4}.{0,20},

(?:\beval\(|assert\(|call_user_func\(|call_user_func_array\(|create_function\(|preg_replace\(\s{0,5}.*/[is]{0,2}e[is]{0,2}["']\s{0,5},(.*\$.*,|.*,.*\$))

命令执行#

(?:\bexec\(|passthru\(|\bsystem\(|\bpopen\(|proc_open\(|proc_close\(|shell_exec\(|pcntl_exec\(|escapeshellcmd\().{0,50}\$

一切变量输入都是有害的#

在 PHP 中可由用户输入的变量列表如下:

  • $_SERVER
  • $_GET
  • $_POST
  • $_COOKIE
  • $_REQUEST
  • $_FILES
  • $_ENV
  • $_HTTP_COOKIE_VARS
  • $_HTTP_ENV_VARS
  • $_HTTP_GET_VARS
  • $_HTTP_POST_FILES
  • $_HTTP_POST_VARS
  • $_HTTP_SERVER_VARS

以上不一一解释,挑几个大家熟悉的。

其他的,可以自行百度。#

  • $_GET

就是我们在提交get请求时url之后的一些参数

比如 'https://www.baidu.com/s?wd=123&page=456'

get的内容就是

s?wd=123&page=456

两个参数 一个wd 一个page

  • $_POST

    这个也是常见类型 就是我们在提交post请求时 提交正文内的一些参数

常见于 登陆页面

比如

file

其中 post 内容 就是各种参数

email:12312123
password:123123123
csessionid:
sig:
token:
scene:
_token:sWHNmoDCeWTbXfGJkClQ6omGFaW81LE6vbKESOtH
jump:aHR0cHM6Ly9zZWNxdWFuLm9yZw==

细心的 小伙伴看到这里就有点想法了

其实代码审计就是 结合web容器对脚本程序的一种调试

类似我们用IDA静态分析PE文件 用OD动态调试PE文件 #

file

代码审计出的常见漏洞的几大类型#

1. 系统命令执行#

PHP 执行系统命令可以使用以下几个函数:

system、exec、passthru、“、shell_exec、
popen、proc_open、pcntl_exec

我们通过在全部程序文件中搜索这些函数,确定函数的参数是否会因为外部提交而改变,

检查这些参数是否有经过安全处理。

这个漏洞一般比较少见(原谅我孤陋寡闻)一般出现在参数代入无过滤 或者是csrf等 场景限制比较大#

防范方法:

  • 使用自定义函数或函数库来替代外部命令的功能
  • 使用 escapeshellarg 函数来处理命令参数
  • 使用 safe_mode_exec_dir 指定可执行文件的路径

2. PHP代码执行#

PHP 可能出现代码执行的函数:

eval、preg_replace+/e、assert、call_user_func、
call_user_func_array、create_function

查找程序中程序中使用这些函数的地方,检查提交变量是否用户可控,有无做输入验证

这个漏洞相对常见,而且危害性很大 可以参照团长爆的那个maccms的洞#

file

防范方法:

  • 输入数据精确匹配
  • 白名单方式过滤可执行的函数

3. SQL 注入#

SQL 注入因为要操作数据库,所以一般会查找 SQL 语句关键字:insert、delete、update、select,

查看传递的变量参数是否用户可控制,有无做过安全处理

很常见 非框架的cms 也相对好挖出来该洞#

听说 sql注入现在盛行在浏览器标识中进行盲注注入#

防范方法:

使用参数化查询


4. 文件包含漏洞#

PHP 可能出现文件包含的函数:

include、include_once、require、require_once、
show_source、highlight_file、readfile、file_get_contents、fopen、 nt>file

另外不单单存在玉php原生的函数里

一些框架自定义的函数也会存在

一般存在于模块加载,模板加载,cache调用

包括函数:

$tpl= $tpl参数过滤不严

include()/include_once()

require()/require_once()

该漏洞也很常见 静态分析都可以挖出来一些,很多人觉得用处不如前三种 但是#

该类型的洞 结合文件上传漏洞有奇效 如果有后缀限制 + 配合%00截断 或者文件名长度溢出 爽歪歪#

比如我上传个图片马 再一包含 shell到手

补充:thumbsup:

什么是%00 截断#

在php的某些低版本里 %00是空字符 php解释器 就不会在继续读取 %00之后的内容

这样我们就可以把jpg当成php执行

文件名长度溢出#

Linux文件名的长度限制是255个字符

windows下完全限定文件名必须少于260个字符,目录名必须小于248个字符。

file

防范方法:

  1. 对输入数据进行精确匹配,比如根据变量的值确定语言 en.php、cn.php,那么这两个文件放在
    同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检查提交的数据是否是 en 或者
    cn 是最严格的,检查是否只包含字母也不错
  2. 通过过滤参数中的/、..等字符

5 变量覆盖#

PHP 变量覆盖会出现在下面几种情况:

  1. 遍历初始化变量
    例:

    foreach($_GET as $key => $value)
    $$key = $value;
    
  2. 函数覆盖变量:

    parse_str、mb_parse_str、import_request_variables
  3. Register_globals=ON 时,GET 方式提交变量会直接覆盖

防范方法:

  1. 设置 Register_globals=OFF
  2. 不要使用这些函数来获取变量

6. 文件读取(下载)#

PHP 的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可
能成为高危漏洞。我们应该在程序中搜索如下函数:

copy、rmdir、unlink、delete、fwrite、
chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、
file_put_contents、fputcsv、fputs

但通常 PHP 中每一个文件操作函数都可能是危险的。

这个我也不懂 哈哈哈哈哈哈哈哈#

防范方法:

  1. 对提交数据进行严格匹配

7. 文件上传#

搜索关键函数:
move_uploaded_file() 接着看调用这个函数的代码是否存在为限制上传格式或者可以绕过。
(1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件即可利用。

(2) 黑名单扩展名过滤:
限制不够全面:IIS默认支持解析.asp,.cdx, .asa,.cer等。
扩展名可绕过:
不被允许的文件格式.php,但是我们可以上传文件名为1.php(注意后面有一个空格)

(3) 文件头 content-type验证绕过:
getimagesize()函数:验证文件头只要为GIF89a,就会返回真。
限制$_FILES["file"]["type"]的值 就是人为限制content-type为可控变量。

(4) 防范:
使用in_array()或 利用三等于===对比扩展名。
保存上传文件是重命名,规则采用时间戳拼接随机数:md5(time() + rand(1,1000))。

防范方式:

  1. 使用白名单方式检测文件后缀
  2. 上传之后按时间能算法生成文件名称
  3. 上传目录脚本文件不可执行
  4. 注意%00 截断

8. XSS#

各显神通吧。。。

得了,暂时不写了,不然【2】写啥,我打算接下来这样写:
####### 快速代码审计 ########
#######业务漏洞逻辑漏洞相似性漏洞挖掘 #######
#######基于白盒的fuzz #######
####### 搞基代码审计#######

file

这篇文章还没有人发言,快抢第一!

发表评论