谈谈思维·一

前言

本次主要讲述两种思维,或者说思考的方式。


如何得到一个漏洞?

如何得到一个漏洞,这是一个非常深邃的问题,目前的我没有实力讲得清楚,但是也想分享一下自己的感悟。

从本质上思考

漏洞的本质是什么?是程序;程序的本质是什么,是变量和函数按照特定的逻辑运行。与其说我们找到了一个漏洞,不如说我们成功利用了变量、函数甚至是逻辑。

当我们把漏洞这个抽象的概念落实到客观的物体上面,我们就必须要按照客观、严谨、变化的思维去思考。下面我会以代码审计的视角去分享如何得到一个漏洞。

漏洞的产生

漏洞即是程序的破绽,让程序运行破绽可以为漏洞的利用创造条件。

漏洞的基础是变量、函数和逻辑,所以程序的破绽往往是这三者共同构成的。比如SQL注入,本质上就是程序对输入流的检查不严谨导致输入流可以越过数据流直达控制流,这也恰恰是大多数注入型漏洞的成因,所以这类漏洞所在程序的破绽即是程序对输入流的检查不严谨。

程序是怎么存在这些破绽的,归根结底是开发者的懒惰和能力有限,然而这并不是黑客应该考虑的,黑客应该考虑的是怎么找到这些漏洞,并利用它们。

不要套公式!

黑客在乎的是结果,而非某种固定的过程

讲了这么久,终于到正题了。

我们知道,漏洞的存在需要危险的函数和可控的参数。当我们终于找到符合条件的程序时,或许一个限制就把我们弄得无计可施,这样的感觉真的很糟糕!

但是这样的思维真的很浅很浅。我们要深刻地记住一点,一个漏洞往往是多处程序的破绽层层递进,共同构成的。举个例子,假如你已经找到文件上传相关的危险函数和可控参数,但是程序存在下图的白名单,你会怎么做?

image-20240814172120168

有些人可能放弃了,因为白名单不允许上传PHP文件,这样我们就不能直接上传PHP木马了。但是这样的逻辑是不可取的,因为我们的最终目的是给网站挂马,而不是“直接上传PHP木马”这个方式,换言之,我们关心的不是某种方式能不能挂马,而是我们的最终目的——网站被挂马。所以我们可以通过各种手段互相配合、层层递进,最终使网站被挂马,放到本题就是利用zip间接挂马。

综上所述,我们在面对一份程序时,不要被看起来让我们无计可施的限制而吓到,我们或许可以放弃这此处程序(可能就只有这一处程序存在漏洞),但是我们更应该学会如何绕过层层限制——这要求我们凡事多想几步,实现我们的最终目的。

上图我们拿pngjpg无计可施,但是zip可以成为我们绕过的手段(这就是我们多想的一步),所以我们的攻击递进了一次——PHP文件封装在压缩包里。递进不是目的而是手段,我们唯一的目的就是挂马。

不要套公式,面对限制不妨多想几步,曲折没关系,能达到最终目的就可以。这句话把我的思维彻底转变了:

  • 原来的我:这个地方符不符合某种漏洞呢?有白名单限制,我用不了,放弃!
  • 现在的我:这个地方好像可以构造漏洞,虽然有白名单限制,但是我可以看看白名单里的能不能利用,白名单里的zip好像可以利用!

写这节内容我无非想说的是,现在的项目必然会存在诸如白名单等等的限制,我们不应该见到限制就放弃,而是应该多想想怎么找到限制的漏洞,打个漂亮的配合,实现我们的最终目的。有这样的思想,或许更能得到漏洞吧。


如何解决问题