你见过最糟糕的安全漏洞是什么?

413

你见过的最糟糕的安全漏洞是什么?为了保护罪犯,建议限制细节。

如果有用的话,这里有一个问题,讨论如何处理发现的安全漏洞,还有另外一个问题,提供了一些有用的答案,如果公司并未(似乎)回应。


47
在我看来,这应该是社区维基条目... - ChristopheD
很棒的帖子!我希望它可以从DailyWTF.com链接过来。 - Dale
为什么关闭?这是一个完全合理的问题!! - johnc
15
这60个回答和28个赞同看起来比那5个投票关闭的要重要得多(据我所知,那花了一整天的时间才累积到)。但在讨论之前,我会克制自己不去投票重新开启。 - rmeador
7
即使您的问题已经变成社区维基数小时了,这条评论仍然是一条好评论需要点赞,因为它提醒人们类似于这个问题应该是社区维基的。那就是我认为的。 - Joren
显示剩余3条评论
163个回答

644

从早期的在线商店开始:

在购物车的数量字段中输入“.1”,可以获得90%的折扣。软件会正确计算总费用为“.1 * cost”,而打包订单的人只是忽略了数量前面奇怪的“.”。


75
这绝对是支持使用强类型系统的论点。 - Powerlord
54
这个网站是什么?我想要九折优惠! - amischiefr
58
也许你应该请求0.10%的数量。 ;) - MiffTheFox
81
杰夫·贝佐斯提到,在亚马逊的早期,你可以拥有负数量的书籍,而亚马逊会为你的账户充值(并且可能等待你将书籍寄送给他们)。请参阅 http://www.youtube.com/watch?v=-hxX_Q5CnaA 中的0:47。 - Jeff Moser
10
很想看到那位实际上收到了他付款购买的0.1硬盘的客户的表情。 - relet
显示剩余8条评论

575

最令人无法容忍的安全漏洞,而且很常见、很容易被发现的是Google黑客。比如:

http://www.google.com/search?q=inurl%3Aselect+inurl%3A%2520+inurl%3Afrom+inurl%3Awhere

让人惊奇的是,互联网上有多少页面,特别是政府网站,通过查询字符串传递了一个SQL查询。这是最糟糕的SQL注入形式之一,而且根本不需要花费任何精力就能找到易受攻击的站点。

稍加调整,我已经能够找到未受保护的phpMyAdmin、未受保护的MySQL安装程序、包含用户名和密码的查询字符串等。


25
http://johnny.ihackstuff.com/ghdb/ - ykaganovich
6
哦,天哪,这太愚蠢了。我的做法是拿着一个盒子把那个开发者带到人力资源部门。 - squillman
95
小博比的表格又出了问题……http://xkcd.com/327/(该链接是一个漫画,漫画中展示了SQL注入攻击的例子) - gbjbaanb
86
天啊!...下次我遇到不愉快的事情,我要去删除一些数据表。 - Michael Niemand
11
我很喜欢这个例子的原因是第一个结果来自Oracle博客。 - Ravi Wallau
显示剩余9条评论

398
社交工程:
<Cthon98> hey, if you type in your pw, it will show as stars
<Cthon98> ********* see!
<AzureDiamond> hunter2
<AzureDiamond> doesnt look like stars to me
<Cthon98> <AzureDiamond> *******
<Cthon98> thats what I see
<AzureDiamond> oh, really?
<Cthon98> Absolutely
<AzureDiamond> you can go hunter2 my hunter2-ing hunter2
<AzureDiamond> haha, does that look funny to you?
<Cthon98> lol, yes. See, when YOU type hunter2, it shows to us as *******
<AzureDiamond> thats neat, I didnt know IRC did that
<Cthon98> yep, no matter how many times you type hunter2, it will show to us as *******
<AzureDiamond> awesome!
<AzureDiamond> wait, how do you know my pw?
<Cthon98> er, I just copy pasted YOUR ******'s and it appears to YOU as hunter2 cause its your pw
<AzureDiamond> oh, ok.

来自bash.org


2
以前在Runescape上經常發生。 - EvilTeach
7
这次对话很可能并没有真正发生(谁会在试图掩盖事情时打“er”呢?),但仍然很有趣。 - Michael Myers
1
mmyers:同样地,有人被rm -rf误删的可能性也很小,但这确实发生过。我亲眼见过 :) - Matthew Iselin
25
没有比白痴大脑更不安全的东西了。 - Earlz
1
@EvilTeach,他们在RuneScape上实际实现了这个。我不是开玩笑! - corsiKa
显示剩余2条评论

339

微软创业初期的真实故事。

当你醒来并看到 ZDNet.com 早上的头条是 "有史以来最严重的Internet Explorer安全漏洞已在 'Blah' 中发现",而 'Blah' 则是你六个月前编写的代码时,你才会真正感到恐惧。

我一到公司就立刻检查了变更日志,发现我们信任对产品进行更改的另一个团队中的某人竟然签出了我的代码,更改了一堆安全注册表键设置,没有任何合理原因就把代码提交回去,并没有接受任何代码审查或告诉任何人。至今我仍不知道他到底在想什么;他很快离开了公司。(自愿离职)

(更新:针对评论中提出的问题,以下为几点回应:

首先,请注意我选择采取慈善的态度,认为安全键的更改是无意的、出于粗心或不熟悉的缘由,而非恶意。我没有证据证明正反面,但认为将错误归因于人类的缺陷是明智之举。

其次,我们的代码审核系统现在比十二年前强得多得多。例如,现在不可能在没有将更改列表发送给有关方面的情况下提交代码。特别是,在发货周期后期进行的更改具有许多围绕它们的“过程”,以确保进行正确的更改以确保产品的稳定性和安全性。)

无论如何,这个漏洞是一个对象被错误地标记为“可用于从Internet Explorer中使用”的“安全脚本”。该对象能够将二进制文件 - OLE自动化类型库,实际上 - 写入任意磁盘位置。这意味着攻击者可以编写一个包含某些具有敌对行为的字符串的类型库,将其保存到已知的执行位置路径中,并给它赋予导致脚本运行的扩展名,然后希望某种方式下用户会意外运行代码。我不知道是否有任何成功的“真实世界”攻击使用了这个漏洞,但可以利用它来创建一个有效的攻击。

我们很快为此发布了一个补丁,让我告诉你。

我曾经发现并修复了许多JScript中的安全漏洞,但它们中没有一个曝光得像这个那样广泛。


81
可以说,实际上存在两个安全漏洞:另一个漏洞是如何在没有人注意和批准的情况下将代码上传到生产构建服务器上。;-p - Marc Gravell
8
“曾经检查过我的代码,毫无理由地更改了一堆安全注册表键设置,然后提交了代码,从未进行代码审查或告知任何人。”这听起来不像是无能,而是恶意行为,来自一个清楚知道自己在做什么的人。” - Juliet
80
汉隆剃刀原则:“能够用愚蠢来解释的,就不要用恶意来解释。” - David R Tribble
15
微软公司没有强制要求使用一个特定的源代码控制系统。现在,大多数团队都使用Source Depot或Team Foundation。毫不奇怪的是,Visual Studio产品团队通常使用Team Foundation。你懂的,他们要吃自己的狗粮。 - Eric Lippert
40
谁会在上班前查看ZDNet? - Neil N
显示剩余6条评论

274

我希望您能发现这里有什么问题(实际上是非常严重的):

String emailBody = "";

for (int i = 0; i < subscribers.Count; i++)
{
    emailBody += "Hello " + subscribers[i].FirstName + ",";
    emailBody += "this is a reminder with your account information: \n\n:";
    emailBody += "Your username: " + subscribers[i].Username + "\n";
    emailBody += "Your password: " + subscribers[i].Password + "\n";
    emailBody += "Have a great day!";

    emailDispatcher.Send(subscribers[i].EmailAddress, emailBody);
}

最后一个接收者是最开心的 ;)


226
你是在谈论存储明文密码的事实还是电子邮件正文从未清除的事实?我甚至不确定哪个更糟糕。 - Kristof Provost
208
你的意思是不使用StringBuilder吗? :D (只是开个玩笑。) - ShdNx
58
我猜他的意思是最后一个用户会收到所有用户和密码的列表。 :) - Don Branson
141
我非常讨厌那些在注册过程中通过电子邮件将我的密码发回给我的系统。这有两个缺点:
  1. 它们在其系统的某处存储了我的明文密码。如果不是他们的永久用户数据库,那肯定是他们的注册处理系统。
  2. 它是通过电子邮件发送的,无论是纯文本还是HTML格式,SMTP通过Internet的邮件中继传递。有很多可能拦截它的中间人。如果您确实需要向我发送带有安全信息的电子邮件,请让我向您指定我的公共PGP密钥进行加密!
- Jesse C. Slicer
16
曾经我使用MD5哈希算法来保护数据库中的密码。但是,当我将结果输入彩虹表后,发现成功匹配了大约50%的密码... 我就知道是该加盐了。 - Matthew Whited
显示剩余25条评论

206

旧的IBM System 36呆板终端有一个键盘组合键开始宏记录。因此,当终端没有登录时,您可以开始记录宏并将其保留在该位置。下次有人登录时,按键将记录在宏中,并在记录到达最大允许键数时自动结束录制。稍后回来并重放宏以进行自动登录。

alt text


204
我亲自编写的最糟糕的安全漏洞导致了 Google Bot 删除了我的整个数据库。
在我刚学习经典 ASP 时,我编写了自己的基本博客应用程序。所有管理脚本的目录都在 IIS 上由 NTLM 进行保护。有一天,我搬到了新服务器上,并忘记在 IIS 中重新保护该目录(哎呀)。
博客首页有一个指向主管理屏幕的链接,而主管理屏幕为每个记录提供了一个 DELETE LINK(没有确认)。有一天,我发现数据库中的每条记录都被删除了(数百个个人条目)。我以为某个读者侵入了网站并恶意删除了每条记录。
从日志中我才发现:Google Bot 爬取了该站点,跟随管理链接,然后继续按照所有的 DELETE LINK,因此删除了数据库中的每条记录。我认为我应该获得年度傻瓜奖,因为被 Google Bot 不经意地攻击了。
谢天谢地我有备份。

13
可能这说明了这个错误有多么常见。 - si618
96
因此,您应始终使用POST来更改操作。 - recursive
7
@recursive: true,但如果目录没有密码保护,它不能阻止人类删除所有内容。 - DisgruntledGoat
2
我曾经遇到过浏览器插件预取链接的问题。我曾在一个博客网站工作,有一位用户报告说她博客上的所有评论都神秘地消失了,我们困惑了好几天。 - Matthew
7
不,你不应该得到那个奖项。如果发生了这种情况而你又没有备份,那么你才会应该得到它。 - Ryan Lundy
显示剩余6条评论

187

我见过的最糟糕的漏洞是一个网络应用程序的错误,当您提供空用户名和密码时,会以管理员身份登录 :)


144
懒惰的开发者眼中的bug还是特性? :) - si618
9
我看过这样的代码。通常是因为用户查找使用了 LIKE,例如 "SELECT * FROM [User] Where UserName LIKE '%" + userName + "%'"。由于管理员通常是数据库中的第一个用户,因此返回该用户。 - Pierre-Alain Vigeant
11
为什么要在用户名上使用 LIKE?...这样我就可以通过输入“adm”而不是“Adam”来成为管理员。 - Matthew Whited
20
大多数公司在给定的用户ID下,允许您尝试登录三次,然后会锁定该账户。因此,只需要尝试输入三个错误密码,就可以轻而易举地锁定别人的账户。 - David R Tribble
3
我曾在许多企业网页应用程序中看到这种认证方式,它们会对LDAP目录进行认证。在LDAP中,输入空密码会导致*成功的匿名登录。匿名用户无法做太多事情,但使用此机制的Web应用程序并没有进一步检查——它们只是假定“成功=正确的密码”! - SimonJ
显示剩余7条评论

174

曾经在一个网站的URL上注意到这一点。

http://www.somewebsite.com/mypage.asp?param1=x&param2=y&admin=0

将最后一个参数改为admin=1给了我管理员特权。如果你要盲目信任用户输入,请至少不要透露出你正在这样做!


19
这是一个方便的功能 ;) 你没有看过《战争游戏》吗?有一句话是“每个好的开发者都会在他们的系统中添加后门” 嘿嘿。 - alex
38
也许他们应该使用&admin=JOSHUA。 - JohnFx

164

我在The Daily WTF上看到了这个。

<script language="javascript">
<!--//
/*This Script allows people to enter by using a form that asks for a
UserID and Password*/
function pasuser(form) {
    if (form.id.value=="buyers") { 
        if (form.pass.value=="gov1996") {              
            location="http://officers.federalsuppliers.com/agents.html" 
        } else {
            alert("Invalid Password")
        }
    } else {  
        alert("Invalid UserID")
    }
}
//-->
</script>

在我看来,没有什么比这更好了。


21
我认为这可能没有你想的那么愚蠢。这个琐碎的密码可能会像“是的,我来自联邦政府”的按钮一样起作用,不同之处在于,如果被发现试图滥用它的人也可能因“提供虚假证件”(或称之为什么?)而被起诉。 - ilya n.
29
Ilya说的是Javascript代码,因此用户能够看到它。在看到代码之后,只需访问http://officers.federalsuppliers.com/agents.html即可绕过任何形式的控制。 - Alsciende
68
不用担心,只要网站受版权保护,DMCA提供100%的保护。你不被允许“规避”JavaScript。 - Steve Hanov
13
@Steve Hanov:您对“circumvent”一词有一个有趣的定义。如果我在我的浏览器中键入该网址...甚至是复制/粘贴它...那么我并没有绕过任何东西,我只是使用我的浏览器前往我输入的地址。这也是Web浏览器的预期用途之一。 - Powerlord
46
恭喜你,你是无辜的,但遗憾的是,要说服陪审团相信这一点需要花费30万美元。 - Dustin Getz
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接