Natas网站。 通过CTF平台旨在利用Web漏洞。 第4部分

图片

在本文中,我们将以Natas wargame为例来处理某些WEB身份的操作。 每个级别都可以访问下一个级别的密码。 所有密码也都存储在/ etc / natas_webpass /文件中。 例如,natas5的密码存储在文件/ etc / natas_webpass / natas5中,并且对于用户natas4和natas5是只读的。

过去的部分: 第1部分第2 部分第3部分

组织信息
特别是对于那些想要学习新知识并在信息和计算机安全性的任何领域中发展的人们,我将撰写和讨论以下类别:

  • PWN;
  • 密码学(加密);
  • 网络技术(网络);
  • 反向(反向工程);
  • 隐写术(Stegano);
  • 搜索和利用Web漏洞。

除此之外,我将分享我在计算机取证,恶意软件和固件分析,对无线网络和局域网的攻击,进行笔测试和编写漏洞利用程序方面的经验。

为了使您可以查找有关新文章,软件和其他信息的信息,我在Telegram中创建了一个频道,并创建了一个小组来讨论 ICD领域中的所有问题 。 另外,我会亲自考虑您的个人要求,问题,建议和建议, 并会回答所有人

提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。

22级


在分析了源代码之后,很明显,如果revelio GET参数不为空,我们将看到密码。

图片

但是,在第一次检查时,如果未安装admin会话,我们将被重定向到不带参数的页面。

图片

您只需要使用Web代理而不是浏览器即可,例如curl。

图片

图片

我们拿走密码。

第23级


我们分析源代码。 strstr(s1,s2)函数从s1返回以s2开头的子字符串。 php也自动转换类型。 也就是说,在进行比较时,它将把字符串引导到一个数字,并将丢弃多余的字符。

图片

字符串“ 11iloveyou”将适合我们的条件。 在第一次检查时,它返回“ iloveyou”,即True。 在第二次检查中,11> 10,即是。

图片

24级


此级别还包含逻辑错误。 如果strcmp返回FALSE,则该条件为true。 但是即使出现错误,strcmp也会返回FALSE。

图片

尽管php自动转换类型,但无法将数组转换为字符串。 为此,请打开页面源代码,并将字段名称从“ passwd”更改为“ passwd []”。

图片

我们发送任何行。

图片

我们拿走密码。

25级


分析源代码时,最有趣的是logRequest()函数,该函数处理用户可以控制的字段。 这是User_Agent和cookie session_id的HTTP标头。

图片

图片

图片

值得考虑的是,从字符串中删除了所有序列“ ../”,但这可以通过以下方式完成:“ ... /。/” =>“ ../”。

解决方案思想:由于记录日志的路径取决于我们可以控制的session_id,并且通过选择显示语言,可以选择服务器上的路径-由于LFI,我们可以读取日志文件。

图片

图片

图片

图片

现在仍然需要将密码从/ etc / natas_webpass / natas26写入我们的日志文件。 由于我们的Web-Agent首先被记录,然后从文件输出,因此我们将php代码添加到该字段。

图片

图片

我们得到密码。

26级


在此示例中,存在一个非常严重的漏洞-对象的未经过滤的反序列化。 unserialize()函数采用一个序列化的变量,并将其转换回PHP对象。

图片

返回转换后的值,该值可以是整数,浮点数,字符串,数组或对象。 即 您可以执行任何代码。 Logger类在创建后将某些信息写入文件。

图片

这个想法如下:

  1. 重写Logger类,在该类中将包含代替输出一条密码的php代码以输出密码。
  2. 在Base64中对其进行编码。
  3. 粘贴在cookie中。
  4. 访问日志文件。
  5. 带走密码。

<?php class Logger{ private $logFile; private $initMsg; private $exitMsg; function __construct($file){ $this->initMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>"; $this->exitMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>"; $this->logFile = "img/phpobjinj.php"; } function log($msg){ ; } function __destruct(){ ; } } $obj = new Logger("obj"); echo urlencode(base64_encode(serialize($obj))); ?> 

图片

图片

图片

我们得到密码。

第27级


该服务提供用户数据。 但是,如果该用户不存在,则将使用指定的用户名和密码创建该用户。

图片

问题在于,创建用户后,服务不会在登录时检查其密码。 同时,过滤后的登录名和密码的前64个字符仅落入数据库。 不仅如此,我们还知道用户名:natas28。

图片

创建一个具有空密码和名称的用户:“ natas28_60-spaces_ any-character”。 (因此,在验证期间,与用户natas28不会有任何巧合,但在创建过程中,它将被过滤并添加到数据库中。也就是说,在下次调用时将不检查密码)。

图片

图片

我们使用名称natas28和一个空密码。 我们得到用户数据natas28。

待续。 您可以通过Telegram加入我们。

Source: https://habr.com/ru/post/zh-CN464863/


All Articles