16.5.1 访问控制

16.5.1  访问控制

设置访问控制是提高Apache服务器安全级别最有效的手段之一,但在介绍Apache的访问控制指令前,先要介绍一下Diretory段。Diretory段用于设置与目录相关的参数和指令,包括访问控制和认证,其格式如下所示。

 

<Diretory 目录的路径>

    目录相关的配置参数和指令

</Diretory>

 

每个Diretory段以<Diretory>开始,以</Diretory>结束,段作用于<Diretory>中指定的目录及其里面的所有文件和子目录。在段中可以设置与目录相关的参数和指令,包括访问控制和认证。Apache中的访问控制指令有以下3种。

1Allow指令

Allow指令用于设置哪些客户端可以访问Apache,命令格式如下所示。

 

Allow from [All/全域名/部分域名/IP地址/网络地址/CIDR地址]…

 

q      All:表示所有客户端。

q      全域名:表示域名对应的客户端,如www.domain.com

q      部分域名:表示域内的所有客户端,如domain.com

q      IP地址:如172.20.17.1

q      网络地址:如172.20.17.0/255.255.255.0

q      CIDR地址:如172.20.17.0/24

%注意:Allow指令中可以指定多个地址,不同地址间通过空格进行分隔。

2Deny指令

Deny指令用于设置拒绝哪些客户端访问Apache,格式跟Allow指令一样。

3Order指令

Order指令用于指定执行访问规则的先后顺序,有两种形式:

q      Order Allow,Deny:先执行允许访问规则,再执行拒绝访问规则。

q      Order Deny,Allow:先执行拒绝访问规则,再执行允许访问规则。

%注意:编写Order指令时,AllowDeny之间不能有空格存在。

现在,假设网站中有一个名为security_info的目录,因为是一个保存有机密信息的目录,所以网站管理员希望该目录只能由管理员自己的机器172.20.17.55来查看,其他用户都不能访问。可以通过以下步骤实现。

1)打开httpd.conf配置文件并添加以下内容:

 

#使用Diretory段设置/usr/local/apache2/htdocs/secure_info目录的属性

<Directory "/usr/local/apache2/htdocs/secure_info">

    Options Indexes FollowSymLinks

AllowOverride None

#使用Order参数设置先执行拒绝规则,再执行允许规则

Order deny,allow

#使用Deny参数设置拒绝所有客户端访问

Deny from all

#使用Allow参数设置允许172.20.17.55客户端访问

    Allow from 172.20.17.55

</Directory>

 

2)保存后重启Apache服务。

IP地址为172.20.17.55的机器上直接打开浏览器访问http://demoserver/security_info/进行测试,结果如图16.28所示。在其他机器上访问的结果如图16.29所示。

 

16.28  172.20.17.55客户端可以正常访问

 

 

 

 

16.29  其他客户端访问被拒绝

可以看出,访问控制的目的已经达到。

<think> 我们已知用户的操作系统是iOS 16.5.1,这属于较新的系统版本,通常使用Swift 5.x版本。但是仍然遇到了符号查找问题。我们需要进一步调整策略。 ### 针对iOS 16.5.1的解决方案 1. **确认Swift版本**: iOS 16.5.1通常使用Swift 5.7或5.8。这些版本的符号命名规则与之前相同,但可能因为优化而隐藏。建议使用动态查找方式。 2. **使用动态符号查找**: 通过枚举`libswiftCore.dylib`的所有符号,查找包含`append`和`SS`的符号(因为SS表示Swift.String类型)。 ```javascript let appendSymbols = []; Module.enumerateExportsSync('libswiftCore.dylib').forEach(exp => { if (exp.name.includes('append') && exp.name.includes('SS')) { appendSymbols.push(exp.name); } }); console.log('可能的append符号:', appendSymbols); ``` 3. **备用方法:Hook所有可能的符号**: 如果找到多个候选符号,可以尝试Hook所有可能的符号。 ```javascript const swiftCore = Module.waitForModule('libswiftCore.dylib'); const appendSymbols = [ '$sSS6appendyySSF', // Swift 5.x标准符号 '_$sSS6appendyySSF' // 某些情况下可能有下划线前缀 ]; appendSymbols.forEach(sym => { const addr = swiftCore.getExportByName(sym); if (addr) { Interceptor.attach(addr, { onEnter(args) { // 解析字符串参数args[1] } }); } }); ``` 4. **直接使用字符串对象的内存布局解析**: 由于iOS 16使用Swift 5.7,字符串布局相对稳定。我们可以使用以下方法解析: ```javascript function parseSwiftString16(strPtr) { // 读取前16字节 const buffer = Memory.readByteArray(strPtr, 16); // 获取第15字节的标志位 const flags = buffer[15]; const isSmallString = (flags & 0x80) === 0; if (isSmallString) { const length = flags & 0x7F; return Memory.readUtf8String(strPtr, length); } else { // 读取低56位的堆指针 let heapPtr = strPtr.and(0x00FFFFFFFFFFFFFF); // 只取低56位 heapPtr = heapPtr.add(0); // 确保对齐 const length = Memory.readU32(strPtr.add(8)); // 长度在偏移8的位置 return Memory.readUtf8String(heapPtr, length); } } ``` 5. **错误处理加强**: 在Hook时添加错误捕获: ```javascript Interceptor.attach(addr, { onEnter(args) { try { const str = parseSwiftString16(args[1]); console.log('追加内容:', str); } catch (e) { console.error('解析失败:', e); } } }); ``` ### 完整脚本示例 ```javascript // iOS16_hook_append.js const swiftCore = Module.waitForModule('libswiftCore.dylib'); // 尝试获取符号地址 let addr = swiftCore.getExportByName('$sSS6appendyySSF'); if (!addr) { // 尝试其他可能的符号 addr = swiftCore.getExportByName('_$sSS6appendyySSF'); } if (addr) { Interceptor.attach(addr, { onEnter(args) { try { const strPtr = args[1]; const flags = Memory.readU8(strPtr.add(15)); if ((flags & 0x80) === 0) { // 小字符串 const length = flags & 0x7F; console.log('追加内容:', Memory.readUtf8String(strPtr, length)); } else { // 大字符串 const heapPtr = Memory.readPointer(strPtr); const length = Memory.readU32(strPtr.add(8)); console.log('追加内容:', Memory.readUtf8String(heapPtr, length)); } } catch (e) { console.error('解析错误:', e); } } }); } else { console.error('未找到append符号'); } ``` ### 如果仍然找不到符号 考虑以下替代方案: - **Hook Objective-C桥接方法**:如果Swift代码通过@objc暴露,可以Hook对应的Objective-C方法。 - **字符串修改监控**:通过Hook内存分配函数(如malloc)来监控字符串内容变化,但效率较低。 ### 注意事项 - iOS 16.5.1使用arm64e架构,指针可能有PAC(指针验证码),需使用`Process.pointerSize`确保正确读取指针。 - 如果应用使用SwiftUI,字符串操作可能发生在系统框架中,需要Hook更高层的UIKit/AppKit方法。 §§相关问题§§ 1. 在iOS 16中Swift字符串的内存布局与之前版本有何不同? 2. 如何通过Frida动态枚举Swift函数的符号? 3. 当目标函数符号无法直接获取时,有哪些替代Hook方法? 4. 如何Hook Swift中自定义类的字符串操作方法? 5. PAC(指针验证码)如何影响Frida的内存读取操作? </think> 针对 iOS 16.5.1 系统的 Frida Hook 问题,以下是完整的解决方案。iOS 16.5.1 使用 Swift 5.7 运行时,其字符串布局和符号查找方式有特定变化: ### iOS 16.5.1 专有解决方案 #### 1. **确认 Swift 运行时版本** ```javascript // 检查 Swift 运行时版本 const swiftCore = Module.findBaseAddress('libswiftCore.dylib'); console.log(`Swift 运行时地址: ${swiftCore}`); // 读取版本信息(偏移量可能变化) const versionPtr = swiftCore.add(0xFFFFF); // 需要动态查找 ``` #### 2. **修正的符号查找方法** iOS 16.5.1 中符号可能被混淆或优化: ```javascript // 动态查找 append 函数 const swiftCore = Module.waitForModule('libswiftCore.dylib'); let appendSymbolAddr = null; // 方法1:特征码扫描(针对 arm64e) const results = Memory.scanSync(swiftCore.base, swiftCore.size, { // arm64e 函数序言特征 (iOS 16 特有) bytes: 'FF 83 01 D1 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 39', mask: 'FF FF FF FF ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? FF FF' }); if (results.length > 0) { appendSymbolAddr = results[0].address; console.log(`通过特征码找到地址: ${appendSymbolAddr}`); } // 方法2:枚举所有包含 "append" 的符号 if (!appendSymbolAddr) { Module.enumerateExportsSync('libswiftCore.dylib').forEach(exp => { if (exp.name.includes('append') && exp.name.includes('SS') && exp.name.length > 30) { console.log(`找到候选符号: ${exp.name} @ ${exp.address}`); appendSymbolAddr = exp.address; } }); } ``` #### 3. **iOS 16 字符串解析修正** ```javascript function parseSwiftString_16(strPtr) { // 读取标志字节(偏移 15) const flags = Memory.readU8(strPtr.add(15)); // 小字符串 (flags & 0x80 == 0) if ((flags & 0x80) === 0) { const length = flags & 0x7F; return Memory.readUtf8String(strPtr, length); } // 大字符串 else { // 读取长度(偏移 8-11) const length = Memory.readU32(strPtr.add(8)); // 读取堆指针(考虑 PAC 指针验证) const heapPtr = Memory.readPointer(strPtr); // 处理 arm64e PAC 指针 if (Process.arch === 'arm64e') { const pacStrip = new NativeFunction( Module.findExportByName(null, 'ptrauth_strip'), 'pointer', ['pointer', 'int'] ); return Memory.readUtf8String(pacStrip(heapPtr, 0), length); } return Memory.readUtf8String(heapPtr, length); } } ``` #### 4. **完整的 Hook 脚本** ```javascript // ios16_hook_append.js const swiftCore = Module.waitForModule('libswiftCore.dylib'); // 动态获取 append 地址 const appendAddr = swiftCore.getExportByName('$sSS6appendyySSF') || findAppendByPattern(swiftCore); function findAppendByPattern(module) { const patterns = [ { // iOS 16.0-16.5 常见模式 bytes: [0xFF, 0x83, 0x01, 0xD1, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x7B, 0x02, 0xA9], mask: 'FFFFFFFF????????FFFF' } ]; for (const pattern of patterns) { const result = Memory.scanSync(module.base, module.size, pattern); if (result.length > 0) return result[0].address; } return null; } if (appendAddr) { Interceptor.attach(appendAddr, { onEnter(args) { try { const strToAdd = parseSwiftString_16(args[1]); console.log(`[APPEND] 追加内容: "${strToAdd}"`); // 打印调用栈(调试用) console.log('调用栈:'); Thread.backtrace(this.context, Backtracer.ACCURATE) .map(DebugSymbol.fromAddress).forEach(log => console.log(`\t${log}`)); } catch (e) { console.error(`解析错误: ${e} at ${args[1]}`); } } }); } else { console.error('[错误] 无法定位 append 函数'); console.log('尝试列出所有相关符号:'); Module.enumerateExportsSync('libswiftCore.dylib') .filter(exp => exp.name.includes('String')) .forEach(exp => console.log(`\t${exp.name}`)); } ``` #### 5. **执行命令优化** ```bash # 使用完整内存访问权限 frida -U -f com.example.app \ --runtime=v8 \ --eternalize \ -l ios16_hook_append.js ``` ### iOS 16.5.1 特有注意事项 1. **PAC 指针保护**: - 使用 `ptrauth_strip()` 处理带签名的指针 ```javascript const pacStrip = new NativeFunction( Module.findExportByName(null, 'ptrauth_strip'), 'pointer', ['pointer', 'int'] ); ``` 2. **字符串布局变化**: - 小字符串标志位偏移:15 字节 - 大字符串长度偏移:8 字节 - 额外标志位 `0x40` 表示 UTF-16 编码 3. **静态符号缺失**: - 使用 `Module.enumerateExportsSync()` 替代 `findExportByName` - 优先扫描 `libswiftCore` 而非全局模块
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值