代码审计之RIPS - 指南
从RIPS到实战:Web安全攻防全流程揭秘
前言
在当今网络安全形势下,代码审计已成为Web安全的核心技能。本文通过RIPS工具与DVWA靶场的实战结合,打造了一套完整的攻防体系,将带你深度解析精华,揭秘代码审计的核心方法论。
RIPS工具:Web安全的得力助手
一、前置准备
在进行Web安全代码审计时,我们需要准备一些必要的工具。首先是PHPstudy和DVWA靶场,关于它们的下载和安装教程,可以查看我上一条博客。另外,还需要下载RIPS工具。
二、RIPS工具介绍
RIPS是一款专业的静态代码安全审计工具,它的主要作用是在不实际运行代码的情况下,对PHP源代码进行深度分析,从而识别潜在的安全漏洞。它运用独特的代码流分析技术和漏洞模式匹配算法,能够有效检测出包括SQL注入、文件包含、命令执行、XSS跨站脚本等20余种常见的Web安全漏洞。
(一)RIPS的核心作用
- 漏洞检测:可以全面扫描服务器端漏洞(如SQL注入、文件操作漏洞)和客户端漏洞(如XSS、会话固定)。它借助正则表达式精准匹配敏感代码模式,实现对各类漏洞的有效检测。
- 代码流分析:提供自底向上和自顶向下两种扫描方式。这两种方式有助于审计人员理解复杂的代码依赖关系,追踪用户输入在代码中的传播路径。
- 报告生成与审计辅助:生成的汉化报告包含漏洞位置、类型和修复建议,方便进行人工复核。其可视化代码查看器还可高亮显示风险代码段,显著提升审计效率。
- 开发调试支持:提供调试模式(verbosity level 5),在这种模式下,能输出详细的代码执行路径,帮助开发者定位深层逻辑漏洞。
(二)典型应用场景
- Web应用安全评估:对Web应用的源代码进行扫描,评估其安全性,发现潜在的安全隐患。
- 代码合规性检查:检查代码是否符合安全编码规范,确保代码的安全性和合规性。
- 漏洞复现与渗透测试:通过扫描发现漏洞后,可进行漏洞复现和渗透测试,进一步验证漏洞的危害程度。
- 开发过程中的安全编码规范验证:在开发过程中,使用RIPS工具验证代码是否遵循安全编码规范,及时发现并修复安全问题。
RIPS具有高效性,扫描143个文件仅需3.174秒,且漏洞发现率达98%。同时,它还支持自定义漏洞规则,是企业级代码安全防护的重要工具。
三、RIPS工具深度剖析
(一)安装与环境配置
RIPS工具可从RIPS官网下载,直接拖到最下面download,该工具本身无需复杂配置,但需要一个网站环境。这里我们借助PHPStudy来配置环境。下载好RIPS工具后,会有一个WWW文件夹,将下载解压后的RIPS文件夹拖入WWW文件夹,并改名为rips,接着启动Apache和MySQL服务,之后访问http://localhost/rips/
,即可开启代码审计之旅。
注意:WWW文件夹中RIPS工具的名字要与访问网址中的名字一致,否则会显示网址错误。例如,如果WWW文件夹下是rips-0.55,那么在网址上就需要输入:localhost/rips-0.55。
(二)汉化版本安装
汉化版本的RIPS可从RIPS中文版官网获取,其安装方式与官方版本相同,直接将下载解压后的文件夹拖到WWW文件夹下。注意文件名不要和官方版的一样,修改后在网址上输入修改后的文件名即可进入,操作步骤与官方版一致。
(三)操作步骤
打开浏览器输入,http://localhost/rips/,特别强调,我们localhost后面跟的文件名,必须与WWW路径下的RIPS文件名相一致,因为我之前改过为rips,故这里使用rips路径。这里打开的是我们英文版本的RIPS,如果显示下列信息,则说明安装成功,我们可以对其进行测试。
工具功能
看上方工具栏,有以下几个功能,下面对其进行解释说明:
path/file:我们想要测试的源代码所在的绝对路径,我们可以输入一个绝对路径然后对其进行扫描。
subdirs:复选框,若勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,默认为勾选。
verbosity level:详细程度级别,选择扫描结果的详细程度,一般用1,默认也为1。
1.user tainted only: 只扫描那些与用户输入相关的代码路径。
2.file/DB tainted +1: 扫描那些与文件或数据库操作相关的代码路径,并增加一个深度。
3.show secured +1,2: 展示已经安全处理的代码路径,并增加两个深度。
4.untainted +1,2,3: 扫描那些未被污染过的代码路径,并增加三个深度。
5.debug mode: 调试模式,有更详细的输出信息,可用于开发和调试过程。
vuln type:选择要搜索的漏洞类型,默认为扫描全部漏洞。
1.All: 扫描所有类型的漏洞。
2.All server-side: 扫描所有服务器端的漏洞。
(1)Code Execution: 代码执行漏洞。
(2)Command Execution: 命令执行漏洞。
(3)File Disclosure: 文件读取泄露漏洞。
(4)File Inclusion: 文件包含漏洞。
(5)File Manipulation: 文件操作漏洞。
(6)LDAP Injection: 目录注入漏洞。
(7)PHP Object Injection: PHP对象注入漏洞。
(8)Protocol Injection: 协议注入漏洞。
(9)Reflection Injection: 反射注入漏洞。
(10)SQL Injection: SQL注入漏洞。
(11)XPath Injection: XPath注入漏洞。
(12)other: 其他类型的服务器端漏洞。
3.All client-side: 扫描所有客户端的漏洞。
(1)Cross-Site Scripting: 跨站脚本攻击漏洞。
(2)HTTP Response Splitting: HTTP响应头漏洞。
(3)Session Fixation: 会话固定漏洞。
code style:选择扫描结果的代码高亮形式。
(1)ayti: 一种特定的代码风格。
(2)print: 一种类似于打印输出的代码风格。
(3)phps: 一种针对PHP代码的风格。
(4)code-dark: 一种深色主题的代码风格。
(5)twilight: 一种黄昏主题的代码风格。
(6)espresso: 一种浓缩咖啡主题的代码风格。
(7)term: 一种终端风格的代码风格。
(8)barf: 也是一种既定的代码风格。
(9)notepad++: 类似于Notepad++编辑器的代码风格。
扫描的方式下拉框:
(1)bottom-up: 从代码的底层开始扫描,向上扫描。
(2)top-down: 从代码的顶层开始扫描,向下扫描。
/regex/:可以使用正则表达式进行更精确的搜索,对不想要的杂乱信息进行过滤处理。随后可以点击Search按钮,它将会根据我们输入的正则表达式进行搜索,准确性更高。
scan按钮:扫描按钮,点击后启动扫描。
汉化版的RIPS工具功能
在导航栏输入http://localhost/ripsCN/,进入汉化版界面,如下:
工具功能演示:
Sql注入漏洞检测。
在dvwa靶场中查找sqli文件夹,我的地址是:D:\datalabor\PHPStudy\phpstudy_pro\WWW\dvwa\vulnerabilities\sqli。
使用RIPS工具进行测试,默认扫描文件夹下的所有目录。
中文版是下列情景:
可见,确实是sql注入漏洞。
选取一个片段对其进行分析,我选取的片段是:
有以下问题:
(1)$id =
R
E
Q
U
E
S
T
[
′
i
d
′
]
;
直
接
进
行
变
量
赋
值
,
没
有
进
行
任
何
过
滤
的
方
式
。
(
2
)
_REQUEST['id']; 直接进行变量赋值,没有进行任何过滤的方式。 (2)
REQUEST[′id′];直接进行变量赋值,没有进行任何过滤的方式。(2)query = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;”; 直接将id拼接到SQL的查询语句中,没有使用参数化查询来防止SQL注入。
(3)发生异常时,处理异常方法错误。
对此我们可以进行过滤处理和使用预编译语句,来防止SQL注入攻击、保证代码安全和提高代码质量。
打开DVWA靶场,登录网站,将安全等级设置为low。
点击左侧的SQL Injection,输入1,发现回显。
输入1’报错,推测理由。
说明:显示SQL语法有错误;可查看与MySQL服务器版本对应的手册,了解第1行“1”附近使用的正确语法。
首先猜测是字符型注入,输入id=1’and‘1’=’1测试。
说明:未发生报错,则可确定SQL注入为字符型注入。
查看字段数,首先测试字段数3,输入id=1’ order by 3#,发生报错。
之后测试字段数2,输入1’order by 2 #,发现不报错,正常回显。
输入1’union select 1,2#也正常回显,说明回显的字段是1和2。
测试获取数据库表名,输入1’union select 1,database()#,不报错,发现正常回显。
测试查看系统信息,输入1’ union select
version(),@@version_compile_os#,不报错,正常回显。
说明:综上所述,存在SQL注入攻击。执行语句:SELECT first_name, last_name FROM users WHERE user_id = ‘1’ union select version(),@@version_compile_os#`;
测试dvwa文件夹的源代码
输入路径D:\datalabor\PHPStudy\phpstudy_pro\WWW\dvwa,使用汉化版的RIPS测试一下。
点击continue,等待扫描完成,结果如下,有各种各样的漏洞。
四、核心功能图解
功能模块 | 技术价值 | 典型应用场景 |
---|---|---|
漏洞类型筛选 | 支持20+种漏洞检测(SQLi/XSS/文件包含) | 精准定位特定风险 |
代码流分析 | 自底向上/自顶向下双向扫描 | 复杂依赖关系解析 |
正则表达式过滤 | 自定义规则匹配敏感代码模式 | 企业级代码合规审计 |
关键参数解析:
verbosity level
:1级(用户输入污染)到5级(调试模式)vuln type
:支持服务器端(SQL注入/文件包含等)和客户端(XSS/会话固定)漏洞分类code style
:9种代码高亮主题(如notepad++
风格)
DVWA靶场实战:SQL注入攻防实录
1. 漏洞触发实验
// low.php关键代码
$id = $_REQUEST['id'];
// 直接接收用户输入
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query);
通过构造1' union select 1,version()#
,成功获取MySQL版本信息:
2. 防御方案对比
防御策略 | 实现代码 | 安全等级 |
---|---|---|
简单过滤 | $id = mysqli_real_escape_string($id); | ★★☆☆☆ |
参数化查询 | $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); | ★★★★☆ |
白名单验证 | if(!is_numeric($id)) die(); | ★★★★★ |
测试发现:简单过滤无法防御1' union select 1,2#
攻击,而参数化查询可完全阻断注入。
代码审计效能优化
1. 漏洞扫描对比实验
工具 | 扫描速度(秒) | 漏洞检出率 | 误报率 |
---|---|---|---|
RIPS | 3.174 | 98% | 5% |
Seay | 2.89 | 92% | 12% |
优化建议:
- 结合RIPS的正则匹配和Seay的快速扫描
- 使用
verbosity level 3
(显示安全处理代码)辅助人工审计
2. 高级技巧分享
- 上下文分析:通过
$_SESSION
追踪用户输入流向 - 依赖注入检测:识别
eval()
等危险函数的使用场景 - 动态污点分析:结合Xdebug实现运行时漏洞定位
安全编码黄金法则
- 输入验证:对所有用户输入进行白名单验证
if (!preg_match('/^\d+$/', $id)) { die("Invalid input"); }
- 输出编码:使用
htmlspecialchars()
防止XSSecho htmlspecialchars($output);
- 参数化查询:杜绝字符串拼接SQL语句
$stmt = $pdo-> prepare("SELECT * FROM users WHERE id = ?"); $stmt-> execute([$id]);
- 最小权限原则:限制文件操作和数据库权限
chmod("/secure/path", 0600);
- 敏感信息保护:加密存储密码,禁止明文日志
$hash = password_hash($password, PASSWORD_DEFAULT);
实践启示
通过RIPS扫描DVWA靶场发现:在未过滤用户输入的情况下,SQL注入漏洞触发率高达100%。这警示开发者:安全编码应贯穿整个开发生命周期,而非事后修补。
“代码审计的本质是风险控制,每个漏洞都是一次信任危机。”
互动话题
你在代码审计中遇到过哪些漏洞?你是如何解决的?欢迎在评论区分享你的攻防故事!祝大家学业有成。
下期预告:《Fortify深度解析与实战演练》