黑客为什么可以做到无需知道源码的情况下找出系统漏洞?

柔沢十


关注我,带你以技术思维看世界~


作为一个7年老程序员,来强答一波。


找漏洞的过程

题主这个问题其实是从一个惯性思维来提出的。为什么呢?

因为一个新的漏洞其实不是通过某种方式先知道这里有个漏洞之后再利用它来攻击的,而更像是“蒙”的。是通过不断的调整输入的数据和输入方式,直到出现“意料之外”的情况,这才是找漏洞的真正过程。


很多黑客虽然算不上是coding高手,但是对于一个程序是如何编写出来的,还是有基本的认识的。借此,他其实就知道自己如果发起一个请求可能会怎么样被处理,然后剩下的与编写这部分代码的程序员之间的博弈,这个过程有点像两个人下围棋。

一般黑客会将自己用过的“攻击方法和攻击数据”整合到自己的一个“武器箱”中,后续就通过程序化的方式自动去运行攻击,自己则是观察整个攻击过程,看看能不能发现新的机会。


这些才是黑客的工作过程。


视角有什么区别吗?

黑客和软件开发者的视角肯定是不同的,而且正好相反。

软件开发者要做的事是什么?就是如何把一个程序写“正确”,符合设定的预期。你可以这样来理解,好比是带着一个“参考答案”和“解题思路”去写代码。

但是我们知道,任何事物都有两面性,或者说不是“完美”的,“解题思路”也是如此。

更何况,“解题思路”的目的是如何变得“正确”,而不是“不正确”,从思维惯性上就不会考虑那些让它变得“不正确”情况。否则不是和自己要完成的事背道而驰么。


黑客的视角与软件开发者正好相反,倒是和常见的「测试工程师」的视角比较接近。就是通过逆向思维来想尽办法把这个程序搞的“不正确”。

具体的过程就是第一部分内容讲的那些。


希望对你有所帮助:)

欢迎在留言区补充或者阐述不同观点,与我交流。


如果觉得回答对你有所帮助的话给我点个「赞同」并「关注我」吧,支持我的创作。

谢谢你的举手之劳~

了解Z哥更多,欢迎搜索微信公号:跨界架构师。让我们一起为了理想的生活而奋斗。

我还会不定期的送出粉丝福利哦。

内容包括:架构设计丨分布式系统丨产品丨运营丨个人深度思考。


跨界架构师


因为世界上没有绝对安全的系统。

如果一个「黑客」需要看源码去发现漏洞的话,那他真是侮辱了「黑客」这个词。

想象一下,在你的面前有一个黑盒子,如何在不打开盒子的情况下知道里面有什么样的构造呢?我们可以在盒子上面插上一些小的管子对吧,从这些小的管子去观察盒子内部的结果。

对于黑客来讲,你的网站系统就像是一个黑盒子,他要通过一系列的手段发现其中的漏洞。试想下如果这个黑盒子没有任何管子,那再厉害的黑客也拿这个盒子没办法。这时候他们就会构造一些合法的请求,然后通过这些请求返回的数据结果来分析你的网站系统。这些合法的请求就是我们上面所说的管子。

通过不断地请求,黑客会搜集大量相关数据,为之后的攻击做准备。

因为大多数的漏洞都是有规律的,而且迄今为止很多系统已经爆出了超级多的漏洞,这些信息都是公开的,黑客们会用一些专业的工具对网站进行扫描,对一些高危漏洞扫描之后很容易找到一些漏网之鱼,然后在通过上面自己搜集到的数据再加以验证。

另外在网站方面,容易被黑客利用的地方就是 sql 注入了。比如大家熟知的搜索其大致流程是这样子的,用户在搜索框输入关键词,然后将请求发送至服务器,服务器接收到关键词之后在数据库中匹配相关的结果,最后将结果返回给浏览器。看起来没什么对不对,然而黑客就是利用了这点,他们的输入是 sql 关键字,当你的程序没有对这些 sql 关键字做过滤或者转换时,有很大可能你服务器的数据库会执行黑客发送的指令,然后得到他们想要的结果,严重的甚至会将整个库拖下来。

当然,现在的网站系统没有那么脆弱,上线之前用工具扫描一下就可以避免大部分漏洞。黑客要想破解是要下一番功夫的,跟其自身的经验和技术水平有相当大的关系。


stormzhang


这个世界上有那么一群人,他们不喜欢遵规守据,不喜欢按部就班,你越是向他规定了什么不能做,他越是想去尝试。


黑客就是这么一个群体,喜欢去搞一些不同寻常的东西。比如题主说的找 web 方面的漏洞,一般是可以分为黑盒测试和白盒测试,白盒测试就是黑客拿到了服务端的源码(授权或未授权,拿到源码就算),在整个网站的运行流程可见的情况下进行测试,黑盒测试指的是没有源码的情况下进行的测试。


在挖 web 漏洞的时候,一般需要足够的耐心和脑洞,要去尝试一些比较奇葩的操作,或许就会有意想不到的结果。


举个例子,之前我遇到的一个任意用户密码重置漏洞:

你点击忘记密码,然后会发送验证码到你绑定的手机号上,输入正确的验证码,验证成功即可修改密码,看起来一切都没有什么问题。但是你要是换个操作呢?

先随便用个别人的账号,忘记密码,这时候系统发送验证码到这个账户所有着的手机上了,这时候不要关闭当前页面,新建一个标签页,再次打开忘记密码的页面,输入你自己的账号,系统发送了验证码到你的手机上,你输入正确的验证码,验证成功,进入了重置密码的页面,这时候不用着急重置密码,切回之前的那个标签页,还在停留在要求输入验证码的时候,这时候你刷新一下页面。

之前那个别人的账户已经跳过了验证码的验证,密码随便改了,你只需要注册一个这个网站的账号,你就可以修改别人的密码了。


修改任意用户的密码,听起来很爽,这操作看起来也不复杂,可关键是你想得到吗???


Aida无茫


为什么黑客能够找到漏洞?

我是一个学Python的web开发的,在web这方面我比较了解,所以主要从这方面去讲解,其他的其实也很类似,但不一样,可以进行类比。

web方面其实不是需要知道源码的,当然,你能够知道的话,那可能就更方便了。首先,黑客会去试探你的服务器,如何试探呢?通过进行一些合法的请求,通过你返回的这些信息中,能够得出你的服务器类型,你是用什么语言来写的(当然,这个判断不一定准)。

就如一个黑盒子,黑客不断地根据输入和输出,来了解你的整个web(或者说是服务器或者网站)。

在网站方面,很多的漏洞都出在输入上,有输入的地方,就需要去防止黑客。这是为什么呢?举个例子,如果一个博客,它有一个评论功能,你评论完成之后就会返回到这个页面上(就是可以看到你的评论),假如,你现在输入的评论不是一个正常的评论,而是一段代码(js,h5,sql语句都有可能),再如果,你没有对这些东西进行过滤或者转义的话,那么你就会将一个可能带有不可预测性的代码加入到你的网站里面了。(很可能用户只要进入这个页面,那么他的信息就会暴露,然后进一步感染电脑。)

再说一下,用前端框架很容易出现漏洞,因为防黑客的必须是后端,前端是为了用户体验,减小服务器压力,如果由于前端将这些过滤的事情做了,而后端由于疏忽没有去做,那么黑客是完全可以绕过前端的检测,攻击后端(你的服务器。)

另一个很重要的就是sql注入,比如一个请求,你是直接用这些参数去数据库取数据,那么如果这些参数是一个sql语句,修改你的数据库权限(通常是通过一些其他的信息来获取数据库的类型,如查看报错信息等等),如果你进行了过滤,但是不周全的话,可以进行转码,然后你的数据库还是会执行这些漏洞。

我的回答差不多就结束了,想要获取更多关于黑客的好玩的东西,可以关注我哦~~~~


还有一点点需要提一下,就是如果获取到了你的服务器,数据库,代码等等,黑客通常会先查看一下已经出现的漏洞,进行穷举法(一般是用黑客软件进行)。

再对于软件这方面的,一个是,通过下载了恶意软件(通过获取了权限,然后就可以完全掌控你的计算机),一般是伪造相似的软件,其实你的应用软件越多,留下的后门的可能性就越大,每个软件都有一定的权限,但是如果这些权限被黑客利用的话,就是一场浩劫了。


Python雁横


首先黑客没有传说中大家想象的那么神奇,因为即使再牛逼的黑客起码也是一名标准的程序员,现在大家对于黑客的印象很多都被带沟里去了。真正的黑客除了是程序员之外还具备极客思想,这是黑客区别于普通程序员的唯一标记,也是最明显的标记。

事实中很多人觉得黑客能够随意进入别人的服务器做自己想做的事情,顺便给自己弄点好处,估计大家心目中黑客的想象和现实中骇客标准更加的贴近。真正搞破坏的是骇客,不是黑客所为,黑客在一定层面上还能促进网络安全的进步,会给一些政府或者企业善意的提醒促进进一步提升自身的网络安全。

所以不要只看到黑客光鲜的一面,背后无数的日子对着电脑解决探索问题的时间才是黑客绝大部分精力所在。

从楼主的描述看还处于程序员的初级阶段,能够读懂大段的代码是一个程序员必备的标准,而且源码的读取不是挨着一点点的来,靠对整个框架有个理解然后再去考虑阅读代码,做事情先有指导思想,有了大方向然后推断哪方面有问题,然后找到对应模块代码进行修改调试,再牛逼的黑客也需要经历这个过程。

另外黑客算是软件领域的安全科目,需要具备一定的安全基础,常见的网络TCP/IP,汇编语言,C语言基础,以及常见的安全知识都要具备,不仅仅是熟悉的那回事了,不知道楼主从事的什么技术行业用的什么编程语言,如果距离很远感觉很神秘也属于很正常的心里反映,所话说隔行如隔山。

想做点事情还是需要一定的积累。要想人前显贵学会背后受罪。


大学生编程指南


每天活跃在互联网上的应用成百上千万,包括PC端以及目前越来越主流的移动端,不仅有通过浏览器访问的,还有需要安装客户端的,不仅有与服务器强交互的,还有独立运行的本地软件。

而这其中,开源的(包括开放源码的)产品少之又少。但,这并不妨碍一个黑客找出其中的漏洞。换句话说,找漏洞并不需要源码。

当然了,在有源码的情况下,挖洞是一件难度系数指数下降的事情。虽然读懂一个大型软件源码耗时又耗力,但对于黑客来说,可以略去其中大半的代码来阅读,只关心可能造成危险的部分。就像一名建筑工程师看一份大楼的施工图,要看懂大楼的结构、建筑材料、水电线路等等各方各面,而对于《Prison Break》中的Michael Scofield可能只关心地下管道的分布。

那么,在没有源码的情况下,黑客怎么挖洞呢?这种情况,我们可以称之为黑盒。而挖洞,的确需要与程序编辑者持有完全相反的角度和看法。对于输入输出点,程序猿考虑的是正确的输入获得正确的输出,而黑客则考虑特殊的非法输入获得异常的有价值输出。那系统登录来说,程序猿考虑的是用户输入注册的用户名、口令能够在登录时与数据库中的数据匹配成功,而黑客则会尝试引起数据库查询异常的输入作为用户名、口令内容,希望应用返回更多数据库中的有效数据。

对于黑客来说,不知道源码情况下,只要有输入就可以了,不管是应用具有的功能页面,还是一个输入接口,通过一种叫做模糊测试的技术就可以开始你的挖洞之旅。模糊测试可以构造一系列正常和异常的输入值,根据应用的返回来判断脆弱点的存在。

在黑客的武器库中,模糊测试只是其中一个利器,像什么漏扫、逆向、脱壳、注入、暴破等等不一而足。

作为程序猿,在编写程序时不仅要从正向角度完成应用的功能,还需要从黑客角度逆向分析应用在处理异常输入时的反应,才能做出高安全的应用。


留白说


一般渗透测试工程师在审计一业务完备的系统的时候,会选择两种审计方法。


第一种 黑盒审计。

即在不需要知道程序源码的情况下,仅依靠输入和输出来判断漏洞的存在。

为什么仅仅通过输入和输出就可以判断?假设一个页面正常运行的结果是显示了一列图片和文字。当我的输入变化成一些程序意料之外的数据之后,程序没有事先准备对应的输出,因此就有可能输出与正常情况下完全不相同排版错乱甚至是直接报错。

因此,我们在对程序测试的时候,会采用一些特定的输入来尝试找出漏洞。

怎么知道哪些特定的输入会产生漏洞?这就需要依靠渗透测试人员的专业知识以及对各种漏洞形成机理的理解程度去构造了。

至于题主所说的开源与不开源,在黑盒审计这里,没有什么区别。


第二种 白盒审计。

即在已知程序源码的情况下,通过通读源码,理解程序逻辑,分析程序逻辑从而找出漏洞的存在。

这里要涉及到题主所说的,开源与不开源的问题。开源与不开源影响的只是审计的困难程度。假设一个程序是开源的,那很好,省去了很多事情,我们可以直接上手去分析程序可能的易错点。那假如要分析一个闭源的程序呢?那就要引出我们一门高深的学问,所谓逆向工程。软件逆向工程就是通过将程序反编译后,研究如何将程序逻辑还原出来并且还原的更好的一门学问。有了这样的神器,闭源的问题也能得到解决。那么为什么软件可以被逆向?因为所有的程序都建立在硬件的基础之上,而CPU的运行是依靠着指令集来操作,所有的程序无论经过多少层的封装到底层都是那些高低电平都是那些汇编代码,因此所有的程序无论高级低级,都有机会还原出行为逻辑。因为它们都运行在相同标准的硬件上。

白盒审计的难度相对于黑盒审计会高很多,往往要求审计员有相关方面的编程经验才有可能更好的去理解程序并且找出漏洞。我们在测试的时候,有的时候也会选择直接搜索可能出现问题的函数来定位漏洞点。总之,方法多种多样。


点个关注再走吧。


只做技术不做宅


其实上这个问题,对一般人来说很神秘,但也不是什么高深的东西。

扫描站点指纹信息

所有的漏洞都是有规律,有定势的,体现在网站上就是表现出一些特征,比如站点信息的指纹,目录结构,特定的文件。这些都可以通过扫描器自动扫描到,你装个扫描软件就行。比如nmap,Nikto,httprint,Skipfish,DIRB 国产的御剑等工具。



结果:一些直接问题,bug可直接暴露出来,甚至有些网站备份的www.zip源码都能通过列举扫描扫到。站点web服务器及版本,开的端口,应用程序语言,用的cms及版本等。一般有问题可直接利用了。

web渗透测试

有了第一步的测试就可以知道站点大概信息,还有直接暴露的bug可利用。如果没有的话,可以做渗透测试比如通过Nikto,AWVS,APPSCAN对站点做测试。



通过web渗透扫描可以得到web常见的漏洞,比如SQL注入(SQL Injection)、弱口令、文件上传、目录遍历和执行、跨站脚本(Cross-site>

放弃或者人工渗透

如果以上两部都没有结果,说明站点安全做的还可以,这时候就要出动人力做苦力渗透,旁路,apt渗透,或者直接放弃换另一个站点。

关于一些扫描渗透的工具和教程可以关注笔者,看笔者的文章和github仓。也可以留言索取。


虫虫安全


针对Web方面

在网络渗透工程师眼里,你说的这种行为通常被称为“黑盒测试”,这也是大部分黑(script)客(kid)最常用的测试手段。

在这种情况下,黑客进行黑盒测试的首要任务就是收集信息,尽可能的收集web网站的DNS、程序结构、数据库信息等等,为之后的渗透测试奠定基础。

下一步便是使用一些专业的扫描器如awvs nessus等,进行一些高危漏洞的扫描,同时进行手工检测,找一些扫描器容易忽略的地方进行利用。

最后把这些信息综合总结来进行利用。

上面是2017年总结的Owasp Top 10,也就是近几年间最流行的高危漏洞。


在我看来,黑盒测试为首当测试,没有什么特别的问题的话,白盒测试便更能挖掘出藏在深处的漏洞。


怪咖玩家


黑盒确实是比较难从外部攻破的,但是这也是渗透过程中非常非常非常常见的现象,如果每个目标网站或者目标系统,你都能拿到源代码,那,做这个还有什么乐趣可言呢?


首先回答一下答主的描述中的疑问,读懂源码已经很不容易了,何况还要从中找出漏洞。我的观点是,题主和黑客的心态不同,题主的心态是以读懂,学习为主,就像是一个学者,在考据东西,黑客的心态则不一样,黑客的心态是攻击性的,他不需要明白所有函数的作用,不需要知道上下的连接,左右的影响,他就像一个猎狗,只在乎自己最关心的部分,从这个部分往外推演,就像是抽丝剥茧般,找到自己需要的内容。例如一套网站系统,涉及到注册,登录,用户管理,文章发布,商品更新,订单管理,数据统计,仓储销售,这是一个非常庞大繁杂的系统,要完全吃下来, 非常耗费精力,可是黑客会把注意力放在输入输出上面,去找可能提权的地方,这么做的效率是非常高的。


现在来讲,如何做黑盒渗透。


所有黑盒,即便你不知道内部如何,但是必有输入输出,如果没有输入输出,那么再厉害的黑客也拿它没办法,但是话又说回来,一个系统没有输入输出,那对任何人也毫无价值,所以说,一切系统,都是有可能被渗透的。


不同的输入,可能会获得不同的输出,这是一切攻击渗透的前提,这里面大有学问,例如一个网站,我输入正确的用户密码,就可以登录成功,我输入错误的用户密码,则会提示密码错误,这就是根据不同的输入给出的不同输出,通过构造输入内容,获得输出反馈,可以揣测系统的内部工作流程,甚至直接推断出具体代码


这不是一件容易的事,但也不是不可以做到


分享到:


相關文章: