The OWASP Foundationhttp://www owasp org
OWASP AppSecBeijing/Asia 2011 http://www.owasp.orgBeijing/Asia 2011
流行应用的加密算法流行应用的加密算法实现缺陷与利用实现缺陷与利用
吴翰清阿里云信息安全中心阿里云信息安全中心
Copyright © The OWASP FoundationPermission is granted to copy, distribute and/or modify this document under the terms of the OWASP License.
Ab MAbout Me2001年创建安全组织幻影
2005年加入阿里巴巴
2008年加入阿里云2008年加入阿里云
微博:t.qq.com/aullik5
Blog:hi.baidu.com/aullik5
Book:《完美防线》
2
当渗透测试遇到当渗透测试遇到…ctk=moVQoAbeoXAtdR3BHGRFVA&chk=50f059614bb2977a9
dda630cd727277a 50067753dda630cd727277a-50067753
ID=5bfb08d687b3dee5:T=1303616991:S=ALNI_MZ46CtBJfBaUSGkdUlJmLEyTfwgPQ
http://passport.baidu.com/center?
auth=ead603c8bb7d4ea68f2812a497aa7f5c40c6eb438b3da9e1d8b5b3de6a82f30b7a3b
3
密文分析技巧 编码分析密文分析技巧:编码分析Base64:
Hex:ead603c8bb7d4e……
= \xea\xd6\x04\xc8\xbb\x7d\x4e…… \xea\xd6\x04\xc8\xbb\x7d\x4e……
4
密文分析技巧 密文长度密文分析技巧:密文长度Stream cipher: 任意长度p
Block cipher:
5
密文分析技巧 模式分析密文分析技巧:模式分析ECB-mode:
明文改变1字节,密文只改变1个分组长度
CBC-mode:
文改变 字节 密文完全改变明文改变1字节,密文完全改变
6
在开发者眼中在开发者眼中1. 加密算法第三方实现libraryy
2. 性能
3. 安全性 – 特指密钥长度
7
常见错误选择常见错误选择1. 使用哈希算法代替加密算法
2. 哈希算法不使用salt
3. 使用时间函数代替伪随机数算法
4. 不了解一些密码学攻击,导致使用错误
55. ……
8
加密算法简介加密算法简介
分组加密算法分组加密算法
流密码流密码
9
加密算法基础加密算法基础IV:初始化向量,一次一密,无须保密
加密模式 ECB CBC CFB OFB CTR加密模式 :ECB、CBC、CFB、OFB、CTR
分组长度:Blocksize
密钥 :KEY,须保密,有时对长度有要求
10
Ciphertext only
Chosen ciphertext
Known plaintext
Attack
ciphertextplaintext
……Chosen plaintext
11
攻击分组加密算法攻击分组加密算法
12
ECB模式ECB模式
13
攻击ECB模式攻击ECB模式
14
CBC模式CBC模式
15
Padding OraclePadding:PKCS#5g
Oracle:预测
一种类似于“盲注”的
“边信道攻击”“边信道攻击”
16
攻击流密码攻击流密码
17
流密码流密码
18
R d K A kReused Key AttackE(A) = A xor CE(B) B CE(B) = B xor C
E(A) xor E(B) = (A xor C) xor (B xor C)A B C C= A xor B xor C xor C
= A xor B
E(A) xor E(B) = A xor B
19
PHPWi d S C d ()PHPWind StrCode()
for ($i = 0; $i < $strLen; $i++) {for ($i = 0; $i < $strLen; $i++) {
$k = $i % $keyLen;
$code .= $string[$i] ^ $key[$k];
}
20
}
PHPWi d验证码生成过程PHPWind验证码生成过程ck.php,验证码字符集:
$list = 'BCEFGHJKMPQRTVWXY2346789';$list = BCEFGHJKMPQRTVWXY2346789 ;
"1315107631"."\t\t".md5("73669"."1315107631")
时间戳 时间戳验证码
21
获取验证码获取验证码
22
设置C ki设置Cookie
23
破解任意验证码密文思路破解任意验证码密文思路已知:
明文1 = 时间戳1 + md5(验证码1 + 时间戳1) A明文1 = 时间戳1 + md5(验证码1 + 时间戳1) A
密文1 E(A)⊕
⊕密文2 E(B)
求解 ‖
⊕
求解: ‖
明文2 = 时间戳2 + md5(验证码2 + 时间戳2) B明文2 时间戳2 + md5(验证码2 + 时间戳2) B
MD5 Rainbow Table !
24
C k It!Crack It!
25
Bi fli i A kBit-flipping Attack
E(A) xor E(B) = A xor B
A xor E(A) xor B = E(B)
26
万能钥匙万能钥匙
Global php: gdconfirm()Global.php: gdconfirm()
Common.php: safecheck()
27
构造永久验证码构造永久验证码Bit-flipping Attack: pp g
A xor E(A) xor B = E(B)
构造时间:
$timestamp– $cookieData[0] < 0
28
永久验证码永久验证码
29
Di ! th d ()Discuz! authcode()$$keyc:IV
$ckey length:IV长度$ckey_length:IV长度
$keya: 产生加密密钥y
$keyb: HMAC的key
验证时间有效性
30
th d ()分析authcode()分析IV
79uz_d57e_auth=d08fwJQZGV/999z5qNLk5OIofp9dd2qDkWXVeg1RFQGwKicuAMaih5M5aefxp9dd2qDkWXVeg1RFQGwKicuAMaih5M5aefx0ycOfLAc2jtZL/y3J7TpUh2GsAPl;
000000000067c38ee9eca0b04dccccbbbb
时间戳 HMAC 明文时间戳(10bytes) (16bytes)
明文(xx bytes)
31
th d ()算法安全分析authcode()算法安全分析Reused Key Attack:y
IV一次一密,导致无法攻击成功
XOR_KEY = fn(IV, KEY)
Bit-flipping Attack:
致 法构造 意密文HMAC导致无法构造任意密文
HMAC f (Pl i t t KEY)HMAC = fn(Plaintext, KEY)
32
th d () k IVauthcode() weak IVIV默认长度为4(当前Discuz!版本):
使用穷举法建立IV字典(a z0 9):使用穷举法建立IV字典(a-z0-9):
364 = 1,679,616 个IV36 1,679,616 个IV
当两次加密IV相同时,加密密钥也相同-- 在WEP破解中,24bit IV在5小时遍历完
33
POCPOC:已知:
验证:crack($cipher2) == $plaintext2
34
POCPOC:
35
收集密文与IV收集密文与IV
36
Bi thd Att kBirthday Attack30人中
任意2人生日在特定一天(如11.8号):
1 − (364 / 365)30 ≈ 7.9%
意 人生 相任意2人生日相同:
接近 70%接近 70%
37
38
攻击 th d ()?攻击authcode()?Reused Key Attack:y
IV一次一密,导致无法攻击成功
可以遍历IV,找到相同IV从而攻击成功
例:窃取Cookie后解密密文
Bit-flipping Attack:
HMAC导致无法构造任意密文HMAC导致无法构造任意密文
仍然是安全的39
仍然是安全的
其他利用方式?其他利用方式?
Discuz! Getwebshell:
http://www oldjun com/blog/index php/archives/76/http://www.oldjun.com/blog/index.php/archives/76/
Phpcms cookie注射:
http://www.80vul.com/phpcms/phpcms_sys_auth.txt
……
40
Summary &Summary & ConclusionConclusion
开发建议开发建议
不要使用ECB模式不要使用ECB模式
不要使用流密码
使用CBC模式的AES-256,或Blowfish
不要使用相同的KEY做不同的事情不要使用相同的KEY做不同的事情
注意IV的随机性注意IV的随机性
使用HMAC-SHA512代替MD5
42
Thanks!