应用程序安全设计清单

1. 设计

1.1 代码流-基于MVC的代码

1.1.1 后门参数,功能,文件的存在

检查是否有后门或有没有暴露的业务逻辑类?

是否有与业务逻辑相关的,但未使用的配置?

如果请求参数被用于确定业务逻辑的方法,是否有一个用户权限与该权限允许使用的方法或活动的恰当匹配?

1.1.2 安全检查部署

是否存在处理输入的信息前部署安全检查?

1.1.3 不安全的数据绑定机制

检查未暴露的实参是否出现在表格对象中与用户输入绑定。如果出现,检查它们是否设有默认值。

检查未暴露的实参是否出现在表格对象中与用户输入绑定。如果出现,检查它们在于表格绑定前是否初始化?

1.2身份认证和访问控制机制

1.2.1 不安全的身份认证和访问控制逻辑

身份认证和授权检查的部署是否正确?

在收到非法的请求时。程序运行是否停止或被终止?

安全检查是否被正常执行?是否有后门参数?

在web的根目录中是否对所需文件和文件夹使用了安全检查?

1.2.2 多余的配置

是否有Access-ALL这样的默认配置?

配置是否用于所有的文件和用户?

如有容器托管的身份认证,是否只有基于Web的身份认证方法?

如有容器托管的身份认证,是否对所有的资源使用了身份认证?

1.2.3 不安全的会话管理

设计是否安全地处理会话?

1.2.4 脆弱的密码处理

密码是否强制使用了密码复杂度检查?

密码是否以加密的形式被存储?

密码是否向用户泄露,或写入文件,日志或控制台?

1.3 数据访问机制

1.3.1 配置文件或代码中存在敏感数据

数据库凭证是否以加密的形式被存储?

1.3.2 存在或支持对不同不安全数据和他们相关的漏洞

设计是否支持弱数据存储。如:扁平文件。

1.4 集中验证和截获器

1.4.1 任何已有安全控制中的弱点

集中验证是否应用于所有的请求和所有的输入?

集中验证检查是否阻止了所有的特殊字符?

验证过程中是否有特殊请求被忽略?

设计中是否对被验证的参数或功能维护特定列表?

2. 架构

2.1 入口点

2.1.1 不安全的数据处理和验证

所有不可信的输入数据是否得到了验证?

2.2 外部一体化

2.2.1 不安全的数据传输

数据是否在加密通道中传输?应用程序是否使用HTTPClient进行外部连接?

设计是否包含组件或模块之间的会话共享?在会话两端会话是否被正确验证?

2.2.2 被提高的权限等级

设计是否对外部链接或命令使用了被提高的OS或系统权限?

3. 配置

3.1 使用外部API

3.1.1 在第三方API或功能中出现已知漏洞

在使用的API或技术中是否含有已知漏洞?

3.2 内置安全控制

3.2.1 常见安全控制

设计框架中是否提供内置安全控制?

在已有的内置控制中是否含有漏洞或弱点?

在设计中是否启用了所有安全设置?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
{************************************************************** 浅谈软件安全设计(一) code by 黑夜彩虹 & vxin with almost pure delphi 网站:http://soft.eastrise.net 2007-03-07 --- 转载时请保留作者信息。 **************************************************************} 此CM的设计模式: 1、插入一些花指令 2、写了一些代码迷惑Cracker 3、有简单的Anti_DEDE 和检测调试器 话不多说,请看以下代码: unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,strutils; Const C1= 17856; C2= 23589; type TForm1 = class(TForm) Image1: TImage; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Edit2: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} Procedure Anti_DeDe();//检测DEDE反编译器 var DeDeHandle:THandle; i:integer; begin DeDeHandle:=FindWindow(nil,chr($64)+chr($65)+chr($64)+chr($65)); if DeDeHandle0 then begin For i:=1 to 4500 do SendMessage(DeDeHandle,WM_CLOSE,0,0); end; end; Function ABC42():Boolean; //检测调试器; var YInt,NInt:Integer; begin asm mov eax,fs:[30h] movzx eax,byte ptr[eax+2h] or al,al jz @No jnz @Yes @No: mov NInt,1 @Yes: Mov YInt,1 end; if YInt=1 then Result:=True; if NInt=1 then Result:=False; end; function EncryptModule(SourceStr:String;Key:Word;N:Integer):String; var //加密函数 I:Integer; begin SetLength(Result,Length(SourceStr));//利用SetLength函数指定密文长度 //对每一个索引元素进行变换 for I:=1 to Length(SourceStr) do begin Result[I]:=Char(byte(SourceStr[I]) xor (Key Shr N)); Key:= (byte(Result[I]) + Key)*C1+C2; end; end; //==========以下是549的函数,据说没有暴破点,顺便试一试 //========函数作用:动态改变程序运行罗辑 function GetEIP: Integer;//自动生成address的方法 asm mov eax, [esp]; sub eax, 5; //call GetEIP占用5字节 end; function PatchOneItem(PatchItem: String): Boolean; var PatchAddress: Integer; PatchLength: DWord; PatchData: Pointer; PatchDataStr: String; i: Integer; PatchByte: Byte; PID, PHandle: THandle; WriteCount: DWord; begin Result := False; if Length(PatchItem) < 11 then Exit; PatchAddress := StrToInt(\'0x\' + LeftStr(PatchItem, 8)); for i := 1 to Length(PatchItem) do begin if PatchItem[i] \' \' then PatchDataStr := PatchDataStr + PatchItem[i]; end; PatchLength := (Length(PatchDataStr) - 9) div 2; GetMem(PatchData, PatchLength); try for i := 0 to PatchLength - 1 do begin PatchByte := StrToInt(\'0x\'+PatchDataStr[10 + i * 2] + PatchDataStr[10 + i * 2 + 1]); Byte(Pointer(Integer(PatchData) + i)^) := PatchByte; end; GetWindowThreadProcessId(Application.Handle, PID); PHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID); WriteProcessMemory(PHandle, Pointer(PatchAddress), PatchData, PatchLength, WriteCount); CloseHandle(PHandle); finally FreeMem(PatchData, PatchLength); end; Result := PatchLength = WriteCount; end; procedure Patch(PatchFile: String); var PatchItems: TStrings; PatchIndex: Integer; begin if not FileExists(PatchFile) then Exit; PatchItems := TStringList.Create; try PatchItems.LoadFromFile(PatchFile); for PatchIndex := 0 to PatchItems.Count - 1 do begin PatchOneItem(PatchItems[PatchIndex]); end; finally PatchItems.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Anti_DeDe; //检测DEDE,检测到关闭它。 if ABC42 then ExitProcess(0); //检测调试器,终止。 end; procedure TForm1.Button1Click(Sender: TObject); //注册按纽,开始检测 begin //========在这里插入一些花指令 asm jz @Start jnz @Start db 0E8h, 24h, 0, 0 ; db 0, 8Bh, 44h, 24h db 4, 8Bh, 0, 3Dh db 4, 0, 0, 80h db 75h, 8, 8Bh, 64h db 24h, 8, 0EBh, 4 db 58h, 0EBh, 0Ch, 0E9h db 64h, 8Fh, 5, 0 db 0, 0, 0, 74h db 0F3h, 75h, 0F1h, 0EBh db 24h, 64h, 0FFh, 35h db 0, 0, 0, 0 db 0EBh, 12h, 0FFh, 9Ch db 74h, 3, 75h, 1 db 0E9h, 81h, 0Ch, 24h db 0, 1, 0, 0 db 9Dh, 90h, 0EBh, 0F4h db 64h, 89h, 25h, 0 db 0, 0, 0, 0EBh db 0E6h db 0EBh, 1, 0Fh, 31h ; db 0F0h, 0EBh, 0Ch, 33h db 0C8h, 0EBh, 3, 0EBh db 9, 0Fh, 59h, 74h db 5, 75h, 0F8h, 51h db 0EBh, 0F1h db 0B9h, 4, 0, 0 ; @Start: end; if length(edit2.Text)>3 then //比较大于3位 begin //============再写一些骗Cracker if edit2.Text=EncryptModule(Edit1.Text,12345,10) then begin showmessage(\'请重启本软件。\'); //=======还可以再写一些记号,这里我就不写了 end; PatchOneItem(edit2.Text); //真正的比较 showmessage(\'ok\'); //弹出OK对话框 end; end; end.  //====附件为CM,会破解的兄弟可以试试其强度....

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值