一个资安工程师的经验:如何成为一名黑客?

  • 时间:
  • 浏览:7
  • 来源:安徽大学教务系统_安徽大学教务处_安徽大学教务管理系统青大教务
阅读模式

阿瑜按,本文作者黄柏铭,美国资安专家,阿瑜译。考虑到文化和语境的差异,译文略有改动。

记得在我小时候曾玩过一款线上游戏,我把我身上的总财产100元拿去买了游戏点数,用这些钱买了强力的装备,不料过了几天之后装备就凭空消失了,我的幼小心灵就随着这100元的消逝而破碎了。这就是我第一次接触到黑客,以受害者的身份。

之后一直到接触这个领域前,我一直认为黑客就是在偷别人的100元、偷看你的聊天记录、偷窃你的游戏私人帐号,又或是把你的首页换成色情网站,再强一点的可能就是像电影一样,爬个叫什么防火墙的墙后去发射核弹,黑客应该,嗯~,就是这样吧?

到了接触安全领域至今有两年左右,虽然水平仍然很差,但就是想利用这个时间点,这个还了解普通人对于这个领域的疑问、还铭记着初学者会碰到的问题、以及对学习上会撞到的困难历历在目的时间点来带领各位揭开黑客的神秘面纱。

神秘

黑客在做什么?

如果你立志要成为一名厨师,你可能会为了“想做出好吃的料理”而行动,然而这只是目的,你平时其实大部分是在学习使用厨具、烹煎蒸炒、熟稔各式食谱、调味等等。

那么黑客在做什么?当然不是像之前说的那样偷100元、偷密码、偷资料、发射核弹(当然这些也干,不过不止这些),黑客平常多半花心力在研究安全知识、发现漏洞以及破解漏洞。

什么是漏洞?

觉得公众场合那些需要密码的Wi-Fi很烦人吗?试试看"123456"吧,觉得你的伴侣是不是在外面偷吃,想看看他的手机对话纪录?那密码试试看他的生日吧。这些事情其实都算是漏洞的一种,但当然这些只是很表层的部分,下面我将从三种安全领域切入来介绍何谓漏洞。

1.Web

假如今天你登入了一个网站,你看到了登入画面,这是由于浏览器将前端语言(HTML、CSS、JavaScript)的结果呈现在你眼前,而与前端安全相关的漏洞有XSS。

XSS是injection的一种,什么是injection呢?举个例子,你用网络点了一份汉堡,并且在备注栏留下了 - XX汉堡请给我不同的酱汁。但外卖送到后,由于点单内容和备注栏的字体长得很像,送餐员在匆忙的情况下误认为这个“XX汉堡”也是点单的内容,于是你就得到了一份免费的XX汉堡。

Surprise!

误把资料当成指令执行或资料造成了非预期的指令执行,这就是injection,而XSS相当于把“XX汉堡”变成了像JavaScript等前端语言。

另外一个injection的例子是一个人的人名,他的名字让他免费住了好几间旅馆。

24岁的Raven Felix Null来自美国,他在他成年之后就将姓氏改为“Null”这个单词,它与许多电脑程序不相容,因此许多系统不会将他当做一个人来看待。这种程序设计错误意味着,当一位员工将Null这个单词当做姓氏输入IT系统之后,该系统会将这个单词识别为“资料空缺”,并拒绝验证它。这种IT小故障常常使得Raven不必为他买的东西付钱。

天啊,连Name Injection都存在这个世界上了,想成为黑客吗?还不快去改名!

咳咳...回到前面的例子,当我们在网站按下登入时,我们的资料被传到了伺服器进行验证,这时就牵扯到了后端安全(伺服器处理登入验证动作),例如后端语言PHP安全;数据库安全(储存你的帐号密码等),例如SQL injection(没有错,又是injection);以及传输协议安全(资料传送给伺服器),例如HTTP/HTTPS安全等。而你登入之后就可以在一段时间内保持登入状态,这是因为伺服器对你进行了认证,这时又牵扯到了认证安全,例如Cookie / Session安全。

说了那么多是否有点眼花撩乱、没有实感呢?别灰心,研究Web的漏洞是相对简单的(以入门而言),甚至你马上就可以,来试试看SQL injection!

SQL是一个和数据库沟通的语言,例如你登陆的时候,后台的SQL的语句可能会长这样:

翻译一下:

你可以发现你输入的数据都被一组单引号包了起来,这样电脑就能区别哪些是数据了,那么假设你自己输入单引号会发生什么事情?有问题的网站可能就会报Error,因为程序错把你的单引号当成真正的单引号了,导致单引号没有成对存在之类的语法错误。

那如果你输入了以下语句:

那么整句话就变成(粗体为你输入的资料):

两个横杠"--" 代表注解,也就是在它后面的语句程序都不会理会他,所以整句话实际变成:

再度翻译:

你在没有帐号密码的情况下就登入成功了!当然不只是能登入,既然数据库都以为你说的话是指令了,你当然能做其他事情。

What?!就这样吗! 是的,而且千万不要认为这很蠢或是不可能,这里提供一份google找到的清单(部分),

全部都是2017年有SQL injection漏洞的网站,实在是超级多啊,这还只是google随便搜到的其中一个清单而已,甚至是你使用的学校/公司网站都非常有可能有这类漏洞 (你可以自己试试看)。

(ps.那份清单的URL末端会经常看到%27,那就是在URL底下的单引号)

每次谈到SQL injection我脑中就会浮出一则笑话,有天有个记者访问了三只企鹅

记者:「请问你们平常都在干嘛?」

第一只企鹅:「吃饭,干活,打东东」

第二只企鹅:「吃饭,干活,打东东」

第三只企鹅:「吃饭」

记者:「你为什么只有吃饭?」

第三只企鹅:「...」

记者:「 我知道了,你该不会是东东吧?」

第三只企鹅:「不是,我是活。」

多一个injection,多一个被X的活,认同请点赞。(求审查君放过,都是坑货作者写的,我只是路过......)

审查君

2. Reversing

以前日治时期的台湾平民,拥有了一些机会到日本工厂参观,这时他们会分工,每个人负责把工厂某区看到的所有东西全部用眼睛记下来,这样即使他们没看见机器里面实际的运作情况,也能从外部行为来推敲,进而有机会掌握当时日本的技术,这其实就是逆向工程。

而黑客的Reversing就是在缺少原始码的情况下分析程序,例如游戏外挂就是逆向的一种,而借由逆向分析程序后就能更清楚地了解程序运作,进而找出漏洞。比方说你使用了一个试用版软件,而试用期一到它便跳出一个视窗要你输入注册码什么的以继续使用,假设这个软件的验证写的很简单,例如:

通过逆向工程你可以分析程序并发现”FUKREGISTRATIONCODE”这串验证码,或是在记忆体中找到这串验证码。

3. BINARY (PWN)

相较于REVERSING的比较静态(当然也有动态),PWN就更动态一些,也就是你不只要用肉眼看,你还要去执行程序,去看看各种不同的输入对于程序状态造成的改变,通常漏洞可以让你对记忆体造成非原预期的读/写,你可以通过精心安排这些动作来取得控制权。

常见的漏洞类型有overflow ( stack / heap base)、use-after-free。

关于overflow我用以下简单的登入代码作为示范:

可以看到储存密码的空间只有16个单位,并且刚好“登入”在记忆体中被摆在了密码后面,此时如果你输入16个以上的单位内容,那么你输入的数据就会覆盖掉“登入”的数据位,而程序语言通常非0就会被视为True,也就是你在不知道密码的情况下成功登入了。

如何学习当黑客?

上述说了那么多,终于可以来呼应本文题目 -如何成为一名黑客,不过在进入真正主题 -该学习哪些东西- 之前,我想先问几个更加重要的问题。

1. 你有动机吗?

这也许是最重要的问题,远比之后的问题要重要。虽然我不想吓跑想接触这个领域的人,但我必须老实地和你说

学习Hacking真的很难

尤其资安(网安)是一门很冷门的领域,它不像AI、大数据什么的,你在不懂的情况下还能自我催眠-学习这个对未来很有帮助,也不像学习一门程序语言那样,你能够有很棒的蜜月期,更不像其他领域一样,网络学习资料、书籍、线上课程族繁不及备载。这些全部没有,如果Hacking入门有曲线,那么一开始将是很可怕的垂直悬崖。

或许你可以不管这个问题,就是心血来潮、觉得很酷所以进来了解一下/玩一下,当然可以,但我会觉得很可惜,因为通常进来的人玩一下子后大部分都会选择离开。俗话说师父领进门,修行在个人,但是资安师父我猜是会打人,让许多新手全部都被打跑,并且再也不在接触这个领域了,所以倒不如等到真的有个强烈念头真的想玩这门领域之后再一头栽进来。

2. 玩资安要具备什么特质/能力?

其实特质我倒觉得没那么重要,但是硬要说的话我认为有几个。

英文 中文资源几乎是没有,要学习只能看英文了。(阿瑜按,别害怕,未来的事谁知道呢?加油┗|`O′|┛)

自学能力 有人可能会觉得到哪里都看得到自学能力,烦不烦,但是我要说的是,学习Hacking所需的自学能力可能比你一生接触的其他领域都还高。就像我当然可以说学习Hacking需要很多背景知识,但是说实在哪个领域不需要?然而其实学习Hacking背景知识相比其他领域来说并不那么绝对,而所需的自学能力却比其他领域要求更高。

相信自己很棒 这篇文章并不是心灵鸡汤,但是还是要告诉你,必须相信自己。因为在学习资安的过程,会不断地遭遇挫折,会经常认为自己为什么那么笨,或是看到太多高手而自惭形秽。

某个领域的基础

猜你喜欢