应用安全主要确保软件应用在需求、设计、研发、测试、部署、升级等全生命周期的安全性。
应用安全往往是各家企业都有配置资源建设,且往往都是重要方向。此处应用安全定义为基础设施之上运行的软件服务,主要分为应用安全、供应链安全、移动端安全、IoT安全、Web3安全以及AI安全等方向。应用安全主要以Java/PHP/Go等语言开发的业务应用。供应链安全包括采购部署的各类开源/商业的三方应用或者服务,甚至这些应用所依赖的中间件、组件。移动端安全主要保障在Android和iOS上的App,以及在微信/支付宝等平台上的小程序,主要围绕程序保护(逆向、混淆、虚拟机等)、端环境与风险识别(应用、设备、行为等维度信息分析、设备ID、设备指纹等)、安全组件(包括滑块/投篮/选图/无痕验证码、安全键盘、安全签名验签、安全储存、安全Webview容器、加解密、恶意软件识别、钓鱼链接识别、诈骗电话/短信识别等)、端安全对抗(攻击行为采集、HotPatch等)、端代码安全扫描(包括合规扫描、漏洞扫描等)。IoT安全主要保障各类软件和硬件结合的产品,主要解决传感器安全、通用固件提取与修改、测信道、无线网络攻防、入侵检测、FIDO以及特定场景(比如工业设备、汽车等安全)。Web3以及AI安全等为近些年新出现的场景。
应用安全的建设一般分为安全能力建设岗位与安全运营岗位,安全能力建设偏向开发方向,包括建设黑白灰盒(IAST/DAST/SAST/MAST)、安全组件、SDL平台、安全资产平台、应用安全防护能力(RASP等)、漏洞管理平台等。安全运营岗位偏向机制建设与运营,包括建设应用安全流程、规范、机制建设(涵盖安全意识提升、安全策略运营、安全风险治理等等工作)。当进一步深入建设后,还会衍生出通用程序分析、漏洞扫描与挖掘、各类环境模拟等基础安全研究方向岗位。
安全运营
安全理念
安全意识
略
安全规范
避免持续不断的发现漏洞、应急漏洞,而是为了让不出现漏洞建立各种规范。就像是交通法规不是为了限制路权,是为了保障人身财产安全。安全规范绝不是消灭代码的创造性、优雅性,而是限制过度灵活,推行标准化,以一种共识去写代码,提升效率。
安全评估
略
略
略
使用高强度的不可逆的Hash算法,且加动态盐。具体成型算法可以使用pbkdf2、bcrypt、scrypt等。
略
增加密码复杂性;限制单机/IP请求次数;增加人机识别验证;
略
略
略
略
略
略
略
略
略
略
略
略
安全解决方案
略
密钥暴露面越多,风险越大:密钥硬编码在代码中导致的直接结果就是代码在哪里,密钥就在哪里。研发人员电脑上存在密钥,如果电脑被攻击则密钥也会被泄漏。其次研发人员会因为没有安全意识,将代码上传至各类私有云盘或家里电脑又或是U盘中,导致风险面增大。更有甚者,将代码上传至GitHub,而忽略了代码中的硬编码密钥,从而被恶意着利用;攻击者拿到硬编码密钥后攻击成本较低:攻击者无论通过什么方式拿到你代码,首先就会去看硬编码密钥部分,尝试去利用这些代码中的明文密钥,比如存在邮箱密码则会去尝试登陆你的邮箱进一步渗透挖掘邮件中有价值的内容,有FTP账号密码则会尝试连接FTP挖掘FTP Server中有价值的文件;硬编码意味着你不会去变更它:当密钥硬编码在代码中时,改动密钥的成本就会增大,每次改动密钥时你需要额外进行应用发布和测试。而密钥的安全策略中,定期更换是最重要的因素,因为你无法知道在何时何处密钥泄漏过,因此定期更换密钥能降低风险。解决方案:核心点在于密钥需要和代码分离,尽可能少的让密钥被人接触到。
略
略
略
略
Session ID的目的是为了识别【当前会话】,原则上当前会话发送改变,则销毁该会话。大部分平台的真实情况是session id可以跨平台使用,在业务场景中是方便。但在安全角度有风险。
场景:如果APP端的Session ID被盗取,攻击者拿着该Session ID来请求即可拥有你的身份。在PC端最常见的就是通过XSS拿Token,替换后拿到你的账户权限(比如腾讯的Session ID就是和UserAgent等信息绑定的,盗取来无法直接使用的)。
作用:若Session ID和设备ID绑定后,SessionID被盗取后将无法直接使用,增加攻击成本。
场景:攻击者盗取了你的Session ID后,由于微信通信是双向加密的,无法模拟请求,攻击者则可以将小程序的Session ID替换到PC端,从而拥有你PC的账户权限来进行攻击。
场景:比如支付功能在PC上有验证码,而在APP端无验证码,那攻击者就可以通过盗取PC的Session ID填充到移动端进行支付了。
作用:同平台的Session ID都应该失效,跨平台更应该失效掉,同样也是为了增加攻击成本。
安全资产
渗透测试
漏洞是应用安全岗位从业基础,挑选两到四个不同方向常见和不常见的漏洞,就漏洞原理、利用方式和修复方案进行提问,然后根据回答的情况进行详细深入的二次提问。
略
略
略
常规漏洞
写Crontab、写公钥、写webshell等。
略
JSONP在利用时可通过Meta标签去掉Referer,因此在修复时需要主意Referer为空情况;
略
略
略
原理略;彻底解决该漏洞可以分析根因,Fastjson主要因为Autotype导致的、Log4j主要因为Lookup,可考虑移除经常出现问题的代码,制作内部精简定制版本。或者通过应用运行时防护(RASP)。
业务逻辑漏洞
考察对业务逻辑的理解,如果只局限在越权则比较浅。凡是和业务比较贴近的漏洞都算业务逻辑漏洞,比如身份校验相关的风险(未授权访问、非正常账户态、身份可枚举、水平越权、垂直越权等)、接口逻辑实现不一致(不同协议实现不一致、同类产品不同逻辑、不同阶段逻辑不一致-流程绕过)、不安全的可信端数据(APP数据)、预设要求不符合(依赖条件不安全-业务校验属性设计、人工客服容易被骗-业务流程设计)、滥用合理业务需求等等。
此题考的是当账户状态改变时,由于各个业务逻辑并不一定严格遵循该账户状态的要求导致的还可以继续进行一些预期外的操作。一般账户状态在注销、禁用、风控、司法冻结等时候,会出现该问题。
伪造他人身份态。
Cookies、自定义Header、URL Path、URL Param Value、URL Param JSON、Body Form、Body JSON、Body XML、自定义协议的自定义字段等等。
一般针对数字类型的越权可以通过递增枚举数字,根据响应情况可以判断是否存在越权。此外还可以通过两个账号相互访问对方创建的资源来判断,可避免不连续的数字导致的遗漏。
数字加减遍历只能针对数字类型资源ID,且只能针对连续的数字,遗漏情况较多,且对业务有损(会导致操作或查询他人数据)。通过两个账号的方式,可以不用遍历,不容易被发现,也不会遗漏,对他人数据无影响。当然,在某些场景下,数字加减遍历方式相较于换账号方式更有优势。比如在多个参数的接口中,有N个参数是有校验和当前账号关系,但有一个参数未校验。此时用换账号的方式就得将多个账号都调整为正确参数后再测试问题参数。而+-方式则可以直接测试每一个参数。
除了修改按钮属性使其可用或分析灰色功能对应的后端接口,直接调用接口外。如果能考虑到不同协议的实现可能不一致就更加全面了,比如APP上不能用,PC上是否就能用了,PC也不能用,通过各种协议(HTTP、WSDL、REST、GraphQL)的API调用是否能绕过。
流程绕过漏洞可以理解为不同阶段逻辑实现不一致,比如创建和后续状态变更时的要求不一致(一个操作创建时权限校验很严格,结果修改的时候的权限要求却不一致)、一个流程某个步骤的要求不一致(第一步要输入密码,结果第二部下单的时候并未强校验前面输密码是否完成)、并发逻辑控制(开多窗口同时支付,使一个优惠多次使用)、特殊时期的逻辑绕过(大促时期的校验机制降级)等等。
API安全
传输窃取->HTTPS;未授权访问->API调用密钥;请求篡改->请求签名;请求重放->加随机数的请求签名;
排序的目的是为了签名时和验证签名时数据排列是一致的,避免因为参数顺序问题导致签名不正确。分隔符是为了避免各个参数值不一致(比如a=123&b=456
和a=1&b=23456
),但签名还能一致的情况。
秒时间戳在防重放攻击时,会存在一秒内可重发多次问题,可增加一个随机数或使用毫秒随机数。
SHA256存在彩虹表碰撞问题,HMAC SHA256简单理解相当于加盐了。
由于地层的邮箱系统往往都支持多邮箱语法,传入多个邮箱 “`mail1@feei.cn;mail2@wufeifei.com“`,可以绕过业务侧限制。
协议漏洞
1. (OUT)ClientHello(Random+可接受的SSL版本及加密算法)。2. (IN)ServerHello(SSL版本+加密算法);(IN)Certificate(包括Server Public Key,CA Sign,Domain);ServerKeyExchange(若选择RSA加密则无此步骤,若为DHE/ECDHE,则会协商密钥而非传输密钥);ServerHelloDone;3. ClientKeyExchange(使用CA公钥验证服务端证书是否合法,通过后计算Pre-Master Key,使用服务端证书对Pre-Master Key加密后传输给服务端。服务端收到后使用自己私钥解密得到Pre-Master Key,通过Pre-Master Key生成Master Key,最终生成对称密钥)。4. ChangeCipherSpec(通知服务端,客户端进入加密模式),客户端对Client Finished加密后发送给服务端。5. ChangeCipherSpec(服务端收到消息后使用Master Key解密,成功通知客户端,服务端也进入加密模式),也会给客户端发送一个Server Finished消息,如果客户端能成功解密,双方密钥协商已全部完成。之后即可将数据使用对称密钥加密后传输。
不同的KeyExchange方式生成的Pre-Master Key长度不一样;增强随机强度;
SNI(Server Name Indiction)。
略
当网络被控制后,公私钥在传输过程中是可能被替换的。因此需要有一个第三方知名机构来进行认证担保。将公钥以及域名等信息交给CA,CA通过域名Whois管理员邮箱验证(DV证书)、邓白氏查询公司电话验证(OV证书)、金融机构开户许可证验证(EV证书,地址栏可看到公司名)真实归属情况,验证成功后CA使用自己的私钥进行数字签名生成证书。因大家认可这个CA,它的证书被很多操作系统和浏览器内置了,当其他人收到该证书后,即可通过系统和浏览器内置证书里的公钥去解密。
(1)HPKP(类似HSTS机制,在用户首次访问域名的时候,增加Response Header,告知浏览器正确域名证书签名信息,之后如果遇到别的证书签名则拒绝访问或上报)。(2)证书透明度(Certificate Transparency),要求CA将颁发过的域名证书全部公开,通过检索看是否存在未授权情况下颁发我们域名的情况。
首次以HTTP访问的时候;HSTS过期后的首次访问;申请域名加入HSTS Preload List。
略
通过Content-Length对HTTP请求体的分割;
略
CDN本质上就是中间人。因此,(1)将子域名证书交给CDN厂商,或(2)授权CDN厂商申请证书(推荐)。(3)使用四层TCP加速,还是由源站来存证书(对于安全会存在取用户原始IP的问题,常见方式通过再TCP Option增加一个变量,再TCP Header添加用户的IP地址,常见实现比如TOA,存在IP伪造的可能)。(4)使用Keyless方案,将TLS握手过程进行拆分,将需要使用私钥进行解密的部分移到后端特定服务器,实现证书和私钥物理隔离(最优)。
DR:DNSSEC可用于确定源域名的数字签名;PTR:常用于邮件服务器的黑名单判定,邮件服务器每天接收大量来自不同IP的邮件,如不加判断就接收会导致存在大量的垃圾邮件。通过查询发送方IP的PTR记录可以看该IP是否有绑定域名,从而拒收未绑定域名的IP发送的邮件。;TXT:对域名进行标识和说明,用于SPF可反垃圾,也可用于搜索引擎判定域名归属。
好处:使用时更改解析记录即可,不用新增解析记录,全网同步速度会更快一些;坏处:1.1.1.1是某CDN的IP,可导致站点被恶意接管风险;
风险:state没有设置、没有验证、可多次使用或被设置成了其它功能;授权码可多次使用或无时间限制;授权更多的权限;Client Secret泄漏;绑定三方登陆,攻击者通过他人邮箱注册账号,此时还未验证邮箱有效性(1. 邮箱所有者通过使用邮箱注册时,验证邮件将会使攻击者注册的账号邮箱绑定成功。2. 邮箱所有者通过三方账号注册时,需要绑定邮箱,此时将会和攻击者之前账号绑定成功)。攻击者控制某个账号时,偷偷将账号绑上某个第三方账号,无论账号如何改密码都可以通过三方账号登陆控制该账户;修复:redirect_uri验证;access token仅能使用一次;避免读取当前用户的session直接绑定;state随机hash,并在服务端校验;全程使用HTTPS;平台中可给用户发送消息的地方加强域名过滤;
略
uid=9527&amount=100
中的uid改为10086?略
uid=9527&remark=充话费&amount=100
的接口,仅备注字段(remark)可控时,如何改变最终的金额字段(amount)?略
攻击者向Web应用发起错误格式的请求,致使Web应用无法处理该请求(Status Code 400、501),同时该请求被缓存了,导致其他浏览该Web页面时是从缓存系统中获取的错误响应信息,使正常用户无法使用功能。一般使用利用过程中,可先找到未被编入cache key的header,然后可通过Web缓存和Web Server间的差异来让Web Server异常。比如通过设置超大头、头中增加换行回车等控制字符、通过在GET请求中增加Method Header(X-HTTP-Method-Override、X-HTTP-Method、X-Method-Override)。正常修复可在缓存中将3xx、4xx、5xx的缓存时间设置为0,或修改业务代码将异常请求增加Header Cache-Control: no-store
。
略
业务风险
赌博、色情、暗雷、欺诈、非法投资、洗钱、仿冒、刷单等。
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
算法安全
加解密
对称算法,AES/DES,SM4;非对称算法,RSA、ECDH、ECDSA,SM2;消息摘要算法,SHA256、MD5,SM3;传输层安全协议,TLS、SSL,TLS1.3+国密单证书;国密证书,sha*WithRsaEncryption,SM2-with-SM3;
不安全:DES、RC4、MD5。不够安全:3DES。另外AES、RSA秘钥长度对安全性影响也较大。
基本思想都是对信息进行异或、移位等操作进行加密。块式加密是把数据分成多个固定长度的组,每组多个字节,每次针对一组字节操作,典型算法包括AES和DES。流式加密是每次只针对一个字节进行操作,典型算法包括RC4。
DES对于同一个block,如果使用同一个密钥,加密出来的结果是相同的,即可通过寻找同样密文block来推导出原文。可通过CBC(Cipher Block Chaining)来解决,每次加密一个block后,将它和前一个block的密文进行异或操作,作为这个block的密文,即使有同样的block,每次加密的结果也会不一样,也就无法通过密文推到明文。其中,由于第一个block之前没有其它block,需要生成一个随机64bit的初始向量给第一个block进行异或操作。
主要时扩充了密钥长途,是DES的三倍,加密和解密时会进行三次。也能解决回放攻击。
安全性、加密速度、密钥传输保存、被加密的数据长度等角度展开。
AES和3DES为对称加密算法,AES相较于3DES要快很多。RSA相较于AES,数据长度有限制、性能非常低,但公钥可公开。一般使用对称加密算法加密数据,再用RSA取传输对称加密密钥。
DH(Diffie-Hellman)。
ECDHE(ECC+DH)。
rsa_encrypt(hash(origin_data), private_key), rsa_decrypt(sign_data, public_key) == hash(origin_data)
供应链安全
略
略
略
安全扫描器
IAST
略
略
SAST
略
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
(a+)+
会存在什么风险?会导致ReDoS。
/\.markdown/
,如何绕过?略
/^http\:\/\/.*\.feei.cn($|(\/[^<>\'\"]*))/
,如何绕过?略
略
略
DAST
略
略
略
略
略
略
应用安全防护
RASP
WAF
安全头
修复组件
漏洞处置
漏洞管理
略
略
略
略
略
略
应急响应
nday情报
其它应用类型
前端/移动端安全
(1)CSP;(2)Javascript performance.getEntries()
or document.addEventListener('load',e => { console.log(e.target.src) }, true)
;
脚本压缩:去除有意义的信息;重命名变量/属性;移除无用代码;对抗手法:格式化;分析全局变量/JS属性/DOM属性;分析常量;
加壳:加代码编码,运行时解码后eval;对抗手法:eval换成alert/console;使用其它eval能力(Function/(function(){}).constructor;setTimeout/setInterval(“code”);<script>;onerror;frames[0].eval、opener.eval);Hook函数(改写window.setTimeout =)、Hook访问器(Function.prototype.defineGetter(‘constructor’, …))、监控元素(MutationEvent / MutationObserver
);在打印eval的时候,检查eval是否运行;
混淆:语法树、控制流、虚拟机;打乱原有代码逻辑、注入扰乱代码、修改变量名称、增加随机种子、字符串用RC4加密、字符串转换为unicode等;
反调试:禁用开发者工具:若打开开发者工具将禁止调试功能;禁用console:禁止使用console.*来调试变量;通过算法执行时间判断debugger是否打开;域名白名单:只允许在特定域名下允许运行代码;自我防护机制:当代码变动后将停止运行。通过toString
检测代码是否被篡改;是否在特殊浏览器(PhantomJS、WebDriver)中运行;检测到异常后不立即响应;
1. setTimeout方法不在 JavaScript 的规范中,大多数运行环境都有内建的调度程序来支持这个方法,可以支持当前页面发生跳转后还能执行之前的JavaScript。2. 另外onunload方法也可以在location.href跳转后执行Javascript。
dex->class/jar->java
dev->class/jar:Enjarify、dex2jar、classyshark、jadx等
class/jar->java:jd-gui、CFR、Procyon等
dex->smali->java
dex->smali:ApkTool
smali->java:smali2java
略
略
略
略
略
略
略
略
修改MagicNumber固定值,使反编译工具无法识别AndroidManifest文件,导致反编译失败。可通过pxb.android.axml.AxmlReader修改为正确的magicnumber;
修改StringChunk结构。可通过pxb.android.StringItems修正stringCount;
通过加固使敏感函数/指令变化;通过混淆使字符串、函数、代码路径、资源路径变化;通过自动化打包使包名、证书、应用名、服务端地址均变化;
但通常AndroidManifest.xml(权限/结构)、assets/、lib/内容变化不大,可作为特征。