代码审计入门总结

简介: 参考文献:http://www.vuln.cn/6701通用思路通读全文代码,从功能函数代码开始阅读,例如include文件夹下的common_fun.php,或者有类似关键字的文件。

参考文献:http://www.vuln.cn/6701

通用思路

  • 通读全文代码,从功能函数代码开始阅读,例如include文件夹下的common_fun.php,或者有类似关键字的文件。
  • 看配置文件,带有config关键字的文件,找到mysql.class.php文件的connect()函数,查看在数据库连接时是否出现漏洞。
  • 继续跟读首页文件index.php了解程序运作时调用了哪些函数和文件,以index.php文件作为标线,一层一层去扩展阅读所包含的文件,了解其功能,之后进入其功能文件夹的首页文件,进行扩展阅读。

漏洞总结:

1.文件操作漏洞

①.文件包含漏洞:(详细可看:https://www.jianshu.com/p/41bb503abe61)
(1) 本地文件包含:
一般存在于模块加载,模板加载,cache调用
包括函数:include()/include_once(),require()/require_once()寻找可控变量

(2)* 远程文件包含:*
前提条件:allow_url_include = on

(3) 文件包含截断:
%00截断(php版本小于5.3)
问号截断(问号后面相当于请求的参数,伪截断)
英文(.) 反斜杠(/) 截断

②.文件读取(下载)漏洞:
搜索关键函数:

file_get_contents()
highlight_file()
fopen()
read file()
fread()
fgetss()
fgets()
parse_ini_file()
show_source()
file()
......

③.文件上传漏洞:
搜索关键函数:
move_uploaded_file()接着看调用这个函数的代码是否存在为限制上传格式或者可以绕过。

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

(2) 黑名单扩展名过滤:
限制不够全面:IIS默认支持解析.asp,.cdx, .asa,.cer等。

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

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

④.文件删除漏洞:
搜索关键函数:
unlink()利用回溯变量的方式
老版本下的session_destroy(),可以删除文件,现已基本被修复。

2.代码执行漏洞

①代码执行函数:
搜索关键函数:

eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()

(1) preg_replace()函数:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

当$pattern处存在e修饰符时,$replacement 会被当做php代码执行。

(2)call_user_func()函数

mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…):

第一个参数为回调函数,第二个参数是回调函数的参数

(3)eval()和assert():
当assert()的参数为字符串时 可执行PHP代码

eval(" phpinfo(); ");【√】 eval(" phpinfo() ");【X】
assert(" phpinfo(); ");【√】 assert(" phpinfo() ");【√】

②.动态函数执行:
动态函数后门:

<?php
$_GET['a']($_GET['b']);
?>
img_9cbae7a32763fdd64fa19557ecaf92a6.png
1.png

③.命令执行函数:
搜索关键函数:

system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()

(1) popen()和proc_open():

<?php 
popen( 'whoami >> 1.txt', 'r' ); 
?>

所在路径就会出现一个1.txt ,里面的内容为命令执行后的结果

(2) 反引号命令执行:

<?php 
echo `whoami`;
?>                //直接就可以执行命令

双引号和单引号的区别:

<?php 
$a = 1;
echo " $a " ; //1
echo ' $a ' ;//$a
?>                //双引号时,可以直接解析变量,造成代码执行漏洞。

3.变量覆盖漏洞

①.函数使用不当:

int extract( array &$var_array , int $extract_type = EXTR_OVERWRITE , string $prefix = null )
void parse_str( string $str , array &$arr )
bool import_request_variables( string $type , string $prefix )

②.$$变量覆盖:

<?php
include "flag.php";
if ($_SERVER["REQUEST_METHOD"] != "POST")
    die("flag is here");
if (!isset($_POST["flag"]) )
    die($_403);
foreach ($_GET as $k => $v){
    $$k = $$v;
}
foreach ($_POST as $k => $v){
    $$k = $v;
}
if ( $_POST["flag"] !== $flag )
    die($_403);
echo "flag: ". $flag . "\n";
die($_200);
?>

使用了两个foreach并且也使用了$$.两个foreach中对 $$key的处理是不一样的,满足条件后会将$flag里面的值打印出来。
但是由于后两个if语句及foreach代码会将$flag的值给覆盖掉了,所以需要先将$flag的值赋给$_200或$_403变量,然后利用die($_200)或 die($_403)将flag打印出来。

解题方法:
利用第一个foreach先将$flag的值赋给$_200,然后利用die($_200)将原本的flag值打印出来。
最终PAYLOAD:

GET DATA:?_200=flag 
POST DATA:flag=aaaaaaaaaaaaaaaaaaaaa

4.逻辑漏洞

需要思考的问题:

  • 程序是否可以重复安装
  • 修改密码是否存在越权,修改其他用户密码
  • 找回密码验证码是否可以暴力破解
  • cookie是否可以预测 验证存在绕过

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

  • 水平越权:A用户能够以B用户的身份,进行B用户的全部权限操作。前提A用户和B用户拥有相同的权限。
  • 垂直越权:A用户能够以C用户的身份,进行C用户的全部权限操作,前提C用户比A用户拥有更高的权限。

(1) 未exit/return/die

<?php
if(file_exists('install.lock)){
    header("Location:xxx.com");
}
echo "test";
?>

test 依旧会被输出,替换成安装流程,PHP依旧会进行。

(2) 支付漏洞:

  • 客户端修改单价
  • 客户端修改总价和购买数量
  • 服务端未校验严格
  • 重复发包利用时间差:
    <?php
    if (check_money($price)){
      //Do something
      //花费几秒
      $money = $money - $price;
    }
    ?>
    

可能导致漏洞函数: str_replace()

<?php
$a = addslashes($_GET['a']);
$b = addslashes($_GET['b']);
echo "$a<br>$b<br>";
$c = str_replace($a,'',$b);
echo trim($c);
?>
img_d37628ca87b19b229223563d2f2741ef.png
1.png

5.会话认证漏洞

  • COOKIE验证:没有使用SESSION验证,将信息直接保存在COOKIE中
  • 找到传入sql语句的参数的传递过程,回溯变量到最原始的函数,看它保存在cookie的算法是否可逆
  • 审计代码时,查看登录处代码
目录
相关文章
|
JavaScript 前端开发 Android开发
转换 ES6 代码时需要注意哪些兼容性问题
在转换ES6代码时,需关注兼容性问题,如箭头函数、模板字符串、let/const等语法在旧浏览器中的支持情况,以及模块化、类、Promise等特性是否需要polyfill。使用Babel等工具可有效解决大部分兼容性问题。
|
安全 Java 测试技术
【代码审计篇】 代码审计工具Fortify基本用法详解
本篇文章讲解代码审计工具Fortify的基本用法,感兴趣的小伙伴可以研究学习一下,文中部分地方可能会有遗漏,麻烦各位大佬指正,深表感谢!!!
3324 1
|
16天前
|
程序员
别用命换工作:一位32岁程序员周末晕倒后猝死留给我们的生存思考
32岁程序员高广辉加班猝死,抢救时被拉入工作群,死后8小时仍收工作消息。他的离世揭开了996高压下的行业伤痛,令人警醒:代码可重构,生命仅一次。愿天堂无加班,生者学会为健康设“断点”。
281 2
别用命换工作:一位32岁程序员周末晕倒后猝死留给我们的生存思考
|
SQL 安全 前端开发
对于Java代码审计,主要的审计步骤如下:
### Java代码审计简介 Java代码审计是确保应用程序安全的重要步骤,主要包括以下几个关键环节: 1. **确定项目结构与技术框架**:了解项目的整体架构和技术栈。 2. **环境搭建**:配置开发环境,确保能够正常运行项目。 3. **配置文件分析**:重点分析`pom.xml`、`web.xml`等配置文件,特别是依赖组件的版本是否存在已知漏洞。
|
供应链 数据挖掘 BI
1688 买家订单,订单物流,订单回传接口系列(1688 寻源通 API)
1688作为国内领先的批发采购平台,提供了买家订单、订单物流及订单回传三大API接口,助力企业实现订单管理、物流跟踪和信息反馈的自动化。通过这些接口,企业可以获取订单详情、物流状态,并将处理结果回传至平台,提升运营效率。Python示例代码展示了如何使用这些接口进行数据交互,适用于电商内部管理、物流跟踪及数据分析等场景。
|
SQL 存储 NoSQL
实时计算 Flink版产品使用合集之使用ParameterTool.fromArgs(args)解析参数为null,该怎么处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
355 2
|
网络协议 SDN 数据中心
VXLAN的应用场景
VXLAN技术用于云数据中心间虚拟机迁移,确保迁移过程中业务连续性和网络无感知。通过在虚拟机上联交换机配置VXLAN信息,建立VXLAN隧道和网关,实现跨数据中心的大范围二层网络连接。在SDN环境下,SDN控制器可管理VXLAN的IP和VID对应关系,提高灵活性与扩展性。
533 3
|
存储 监控 数据挖掘
Kylin使用心得与实战经验分享
本文详细介绍了Apache Kylin的使用方法及其在大数据分析中的优势。首先,Kylin是一款基于Hadoop和Spark的开源分布式分析引擎,通过预计算技术实现亚秒级的交互式查询响应,大幅提高数据分析效率。接着,文章阐述了Kylin的核心特点,包括高效多维分析能力和预计算与实时查询的平衡。然后,详细说明了环境搭建、配置步骤及示例代码,展示了如何配置HBase存储后端。在数据建模与优化部分,讲解了星型模型和雪花模型的选择,以及分区策略和索引优化技巧。
|
Ubuntu Linux
ubuntu源码编译指定版本make
以上内容涵盖了在Ubuntu中编译安装指定版本软件的全过程,这是一个技术性很强的操作,不仅可以带来定制化的安装体验,同时也能增加对系统管理和软件构建流程的理解。遵循以上步骤,任何有一定基础的用户都能够按需编译和安装软件。
394 8
DHCP的option43
DHCP的option43
925 4