安全矩阵

 找回密码
 立即注册
搜索
查看: 940|回复: 0

一次完整的GPT-4代码审计,挖掘CMSeasy漏洞

[复制链接]

251

主题

270

帖子

1797

积分

金牌会员

Rank: 6Rank: 6

积分
1797
发表于 2023-4-2 21:04:15 | 显示全部楼层 |阅读模式
转于:迪哥讲事 2023-03-31 23:51 发表于江苏

这次,使用GPT-4进行一次完整的代码审计工作,进行CMSeasy漏洞挖掘的过程并非是GPT-4多么智能,可完全代替安全从业者去做代码审计。为什么要这么说呢?因为GPT-4审计代码需要很多引导,需要连接多个文件才能进行审查,很难仅仅通过一个文件就能做到。

在这里作者发现了一种可量化审计代码的方式,不需要太多的精力投入,也能让新手迅速提高审计代码能力,跟上行业发展的步伐。
本文需要用到的工具:
Fortify SCA
ChatGPT-4
读完这篇文章收获:
快速使用GPT-4审计代码
自动化对代码整个流程进行注解,翻译。

0x01 简介
本篇文章的大体过程

1.首先搭建CMSeasy环境:
使用版本:CmsEasy_7.7.7_UTF-8_20230221
对想要分析的页面进行抓包,将抓包的参数去源码分析。
比如举个例子
这个地方
使用Burpsuite抓包结果,我使用的汉化版本大家可以下载:
本次抓取到的参数lang_choice, admin_dir,case.我们在源码中查找这个参数,通过确定参数的位置,带入到GPT-4让chatgpt-4分析代码,通过软件的审计结果,导入片段分析。因为大部分人代码功底稍弱,想通过GPT-4给自己打工,所以我这边是常规思路。
0x02 易发漏洞函数
在这里首先我们先要明白几个关键点
在php中可由用户输入的变量
$_SERVER$_GET$_POST$_COOKIE$_REQUEST$_FILES
存在命令注入的函数


systemexecpassthrushell_execpopenproc_openpcntl_exec
存在XSS和CSRF的函数


echoprintprintfvprintf<%=$test%>
存在文件包含的函数


includeinclude_oncerequirerequire_onceshow_sourcehighlite_filereadfileflie_get_contentsfopen
存在代码注入的函数
evalpreg_replaceassertcall_user_funccall_user_func_arraycreate_function
存在SQL注入的语句
insertupdateselectdelete
文件管理函数
copyrmdirunlinkdeletefwritechmodfgetcfgetcsvfgetsfgetssfilefile_get_contentsfreadreadfileftruncatefile_put_contentsfputcsvfputs
0x03 代码审计
这里为了方便大家直观。我会首先将参数带入$GET,$POST进行分析如:
$GET['admin_dir'],$POST['admin_dir'],$_REQUEST['admin_dir'].....
分析代码需要耐心,这里只是打样,抛砖引玉,小伙伴受到启发,在日常工作中,可以将部分工作量交给GPT-4,作者建议自我主导,GPT只是个玩具。而不是GPT主导所有工作。当然作者也有很多不足的地方,欢迎大家私信,我会更新具体信息给大家。
输入的地方并不多,是不是没有输入的地方就没有问题,并不是,审计过程先是寻找比较容易有问题的点,不啃硬骨头,没有输入的地方可以找到引用,包含,二次注入形式,这里换另一个。$_GET['lang_choice']
这里有点意思....
很明显了,我们假装不明白,把ADD_ACTION.EDIT_ACTION函数发送给GPT-4分析。
GPT-4对代码分析结果:
将整个流程大体勾勒出来,有些小伙伴会说啦,太简单,这里的整个过程并不是很复杂。这里针对的是对代码不熟悉,确想审计代码的小伙伴学习使用,如果是大神,我想也不用来辅助,主要用来对付自己并不熟悉的代码。


这段 PHP 代码中存在一个潜在的任意文件执行风险,主要原因是对用户输入没有进行足够的过滤和验证。具体来说,存在安全隐患的部分是 $lang_choice 变量的处理。
首先,该代码允许用户通过 GET 请求的 lang_choice 参数来指定 $lang_choice 的值。此时,如果恶意用户输入了一个包含相对路径(例如 ../../../some/evil/path)的参数,那么 $path 变量将指向一个非预期的文件。phpCopy code$lang_choice='system.php';if (isset($_GET['lang_choice'])){    $lang_choice=$_GET['lang_choice'];}接下来,代码将 $path 拼接到网站根目录下的 lang 目录下。此时,如果 $lang_choice 包含了恶意的相对路径,$path 将指向一个完全由攻击者控制的文件。phpCopy code$path=ROOT.'/lang/'.$langurlname.'/'.$lang_choice;当用户提交表单后,代码将修改 $path 指向的文件内容。如果 $path 指向了一个恶意文件,攻击者可以任意修改这个文件的内容,从而实现任意代码执行。phpCopy codeif (front::post('submit')) {    ...    file_put_contents($path,$content);
让我们开始从这里针对这个点,使用GPT-4进行突破。
这里是个上传点。理论将文件上传上去就可以了。那就上传问题吧。
这里就找到了一个需要突破的点:
checkstr代码:


   static function checkstr($str)    {        if (preg_match("/<(\/?)(script|i?frame|style|html|\?php|body|title|link|meta)([^>]*?)>/is", $str, $match)) {            //front::flash(print_r($match,true));            return false;        }        if (preg_match("/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/is", $str, $match)) {            return false;        }        return true;    }                  
使用了正则匹配,正则的大体意思我生成一个格式图,方便大家理解。
需要执行PHP,那必须要闭合。怎么办,GPT-4快告诉我。
PUA一下GPT-4
GPT-4回答结果

我很意外GPT-4使用了短标签的方法,因为这种方法可以规避正则匹配,但是它对版本的要求有限制。从其中给出的结果看,GPT-4并没有很好地理解这个正则表达式的意思,给出了一些绕过方式,例如使用PhP和实体编码等方式。所以并不能直接套用结果,需要对这种方法进行训练。建议大家自己进行训练。
使用GPT-4反馈PAYLOD进行测试。


<?php phpinfo();__halt_compiler();

这里其实还是有一种方法,使用ADD参数。


POST /CmsEasy_7.7.7_UTF-8_20230221/index.php?case=language&act=add&id=5&lang_choice=system_custom.php&admin_dir=admin&site=default&username=&url=&isvisual=&aid=&catid=&dfile=&lang_choice=system_custom.php
在array中拼接system_custom.php,就可以让其执行代码。
一处注入


从这段代码来看,存在SQL注入的风险。原因如下:在execsql_action,execsqls_action和execupdate_action这三个函数中,从用户输入直接获取SQL查询语句(通过front::get("sql")),然后直接将其传递给service::execsql()函数执行。在这种情况下,攻击者可以通过构造恶意的SQL语句来执行SQL注入攻击。为了防止SQL注入攻击,您可以采取以下措施:参数化查询:使用预编译语句和参数化查询来避免将用户输入直接拼接到SQL查询中。验证和过滤用户输入:对用户提供的输入进行有效性检查,以确保它符合预期的格式。在有可能的情况下,使用白名单验证而非黑名单验证。请注意,这里提供的建议并非详尽无遗。在实际开发中,您可能需要根据具体情况采取更多的防护措施来确保代码的安全性。
不懂代码是什么意思怎么办?生成code注释。


/*以下是对上述代码的解释:1.该函数是使用$sqlquery参数调用的。如果$sqlquery参数为空,则函数将返回一个空字符串。2.函数从$sqlquery参数中去除回车,并将cmseasy_前缀替换为数据库前缀。3.函数将$sqlquery参数拆分为一个由分号(;)字符分隔的查询数组。4.然后,函数在查询数组中循环,并执行每个查询。如果查询导致错误,函数将返回错误消息。5.如果查询成功,函数将统计已执行的查询数,并返回已执行的询问数*/
构建sql=

Fortify SCA还没有出场
下载地址:
为什么放到最后讲Fortify SCA,因为太简单啦,将SCA的结果片段导入到GPT-4,让GPT-4进行结果输出。省去了对代码整体的分析。大体流程是:定位到问题代码---使用GPT-4进行分析。
对于那些想要学习审计代码的新手来说,学习新技能可能会遇到各种挑战和困难,借GPT-4为一个兴趣点,敲开审计代码的门。是一件非常愉快的事情。
这篇文章希望能够帮助新手们找到学习代码审计的乐趣 。




公众号在摸索中前进,不断的完善与优质的输出,离不开大家的支持和关注,让我们一起分享、一起学习、一起进步~

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 18:36 , Processed in 0.016821 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表