转于:迪哥讲事 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为一个兴趣点,敲开审计代码的门。是一件非常愉快的事情。 这篇文章希望能够帮助新手们找到学习代码审计的乐趣 。
公众号在摸索中前进,不断的完善与优质的输出,离不开大家的支持和关注,让我们一起分享、一起学习、一起进步~
|