天天看点

pikachu靶场练习记录说明越权访问BAC目录遍历敏感信息泄漏PHP反序列化URL任意跳转SSRF

说明

    本篇针对pikachu靶场中的越权、目录遍历、敏感信息泄漏、SSRF、PHP反序列化和url任意跳转等题目进行了记录。

越权访问BAC

    此处的越权访问主要是针对应用系统本身管理的越权,比如登陆用户权限进行了不属于其自身权限范围内的操作等。

1、水平越权

    所谓水平越权其实是针对同一水平或者同一类型的相互越权,比如同一角色的不同用户相互越权操作来说的。

    根据提示信息登陆lili账户,密码为123456。点击查看个人信息,查看到的是lili的个人信息。如果我们可以查看到其他人的信息,比如lucy的(根据之前的提示猜测lucy应该是和lili权利一样),那么就说明此处存在水平越权。使用burpsuite查看

pikachu靶场练习记录说明越权访问BAC目录遍历敏感信息泄漏PHP反序列化URL任意跳转SSRF

    从查看用户信息请求中我们发现有两处信息点,一处是username的值,另一处是submit的值。我们先将username的值修改为lucy,重新发送请求。我们发现响应包中显示出来了lucy的个人信息,说明此处存在水平越权。

2、垂直越权

    与水平越权对应着理解,垂直越权就是从低水平线跳过限制解除到了高水平线接口,以低权限低级别的用户身份信息进了了高权限高级别才允许的操作。

    根据提示信息,admin/123456是超级管理员,而pikachu/000000是普通管理员。我们使用pikachu/000000登陆进去,显示了用户列表信息,我们退出之后更换为admin/123456登陆系统,发现除了用户显示信息,还提供了用户添加的入口,点击入口发现链接:http://192.168.10.150/pikachu/vul/overpermission/op2/op2_admin_edit.php。

    现在退出使用普通用户pikachu登陆进去,将url上的op2_user.php修改为op2_admin_edit.php,然后刷新发现普通用户也可以访问添加用户的接口,说明此处存在垂直越权。

目录遍历

    目录遍历主要是存在在一些系统上,将所展示文件名字等信息以参数的形式赋值在请求中,后台如果没有对请求参数进行过滤的话,就可以通过../等形式遍历出来其他的系统文件。

    点击href,访问链接http://192.168.10.150/pikachu/vul/dir/dir_list.php?title=jarheads.php,在页面中显示出来文件jarheads.php的内容。我们可以将title的值修改为../../../README.md,就可以访问README.md的文件。

    pikachu安装在答主的电脑E盘,E盘目录下面正好有passwd.txt文件,现在访问链接:http://192.168.10.150/pikachu/vul/dir/dir_list.php?title=../../../../../../../../passwd.txt,将passwd.txt显示出来了。

敏感信息泄漏

    敏感信息泄漏的概念比较宽泛,比如在代码中暴露出来的用户名、邮箱、密码等重要个人信息,或者从访问的请求中得到的操作系统、中间件、服务器信息以及系统上的其他重要文件内容等,都可以称之为存在敏感信息泄漏。

    选择IcanseeyouABC时,使用burpsuite查看对应的请求包和响应包,发现测试账号。

pikachu靶场练习记录说明越权访问BAC目录遍历敏感信息泄漏PHP反序列化URL任意跳转SSRF

PHP反序列化

    序列化和反序列化一般是用于数据传输,序列化简单理解就是将数据结构对象按照一定格式转换为字符串,反序列化就是将序列化的字符串转换成数据结构及对象。比如类对象S跟其对应的序列化格式字符串。

数据对象
class S {

    var $test = "pikachu";

    function __construct() {

        echo $this->test;
    }    

}
对应的格式化后的字符串:
O:1:"S":1:{s:4:"test";s:7:"pikachu"}

说明:
O -> 代表类对象
1 -> 对象名长度
S -> 对象名
1 -> 有一个参数
s -> 参数名是字符串格式
4 -> 参数名长度
test -> 参数名
s -> 参数值是字符串格式
7 -> 参数值长度为7
pikachu -> 参数值
           

    php中跟反序列化相关的漏洞有很多,一般都是因为用户输入的序列化数据没有做校验,是不可控的,另一方面是由于php序列化和反序列化中使用了一些魔术方法。

    答主不是很懂php的相关知识,通过学习发现了一些简单的漏洞利用。比如在漏洞中伪造script代码进行前端注入,或者通过修改序列化字符串中的参数个数字段的值,使得php后台绕过wakeup函数(反序列化函数执行时,一般会刷线调用wakeup函数,然后在会调用__destruct函数。而参数个数字段的值大于实际的参数时就不会执行自动调用wakeup了)。更多的反序列化漏洞就需要在使用过程中边发现边学习了。php的魔术方法(Magic methods)一般有__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等。

    该题目中随意输入字符串,使用burpsuite查看。

pikachu靶场练习记录说明越权访问BAC目录遍历敏感信息泄漏PHP反序列化URL任意跳转SSRF

    我们可以看到题目中调用了unser.php文件,找到该文件并打开审阅一下。 通过查看代码我们发现对象为S,具体格式见上面的Class S例子。

if (isset($_POST['o'])) {
    $s = %_POST['o'];
    if (!@$unser = unserialize($s))
        $html.="<p>大兄弟,来点劲爆点的!</p>";
    else
        $html.="<p>{$unser->test}</p>";
}
           

    通过后台代码我们可以发现,当序列化成功之后,我们的代码可以显示在页面上。于是拦截并伪造o的参数值为:O:1:"S":1:{s:4:"test";s:38:"</p><script>alert('hello')</script><p>";},重新发送请求。

pikachu靶场练习记录说明越权访问BAC目录遍历敏感信息泄漏PHP反序列化URL任意跳转SSRF

URL任意跳转

    如果前端采用了后台传递进来的参数作为新的url进行跳转就可能存在URL任意跳转漏洞。查询了下,常见的跳转主要存在以下三种跳转方式:

1、header(“Location: 新的url”);

2、在script中进行跳转,访问新的url,比如window.location.href=“新的url”。

3、在html头部使用meta来进行跳转,<meta http-equiv="refresh" content="5;url=新的url"> 5代表5秒后跳转。

    总体来说url任意跳转的漏洞的直接危害相对小一些,就是利用一些安全的url服务提供商后台校验不严格,而进行恶意网站的跳转。出于对一些权威ISP的信任,由这些权威url访问的页面用户一般也都是信任的,从而会带来安全隐患。

    在题目中点击链接会访问http://192.168.10.150/pikachu/vul/urlredirect/urlredirect.php?url=i,将url后面修改为自己想要跳转的网站即可,比如修改为url=http://www.baidu.com,重新发送请求即跳转至百度。注:该题目的后台使用的是 header("location: ($url)")的方式。

SSRF

    ssrf跟csrf是对应的,csrf是跨站请求伪造,也可以理解为客户端请求伪造,而ssrf就可以理解为服务端请求伪造。csrf一般对于ISP等服务商来说危害不大,一般受影响和损失的都是用户端,但ssrf的危害却是极大的。

    服务端根据用户的输入,在服务后台的业务逻辑中去请求对应的一些资源(由于资源和服务分离,这些场景是非常易见的),从而造成服务端信息的泄漏和伪造,这也要求了服务端需要做好资源目的地址过滤。题目中也对ssrf进行了简单介绍,一般在PHP中,不正确使用file_get_contents()、fsockopen() 、curl_exec()等函数可能容易造成ssrf攻击。

SSRF之curl

    该题目中,访问链接http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php,发现后台将url为参数,访问了该链接,并将读取的数据显示在页面上。

    答主E盘下又个passwd.txt文件,我们将链接修改一下,修改成http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=file:///e:\\passwd.txt,既可在页面中查看到密码文件。

    curl除了file,还支持ftp、http、https、gopher、telnet、dict以及ldap等多种协议。

    ssrf中常看到gopher的影子,以gopher为例,通过查询发现perl、curl、php、asp.net和java等都支持gopher,不过curl太老的版本可能不支持gopher,php不同的版本支持度也不同(直接访问的时候使用了phpstudy的5.2.17版本,php7.3版本不能直接通过gopher协议访问),JDK1.7及以上也不支持。

    答主由一台centos6(IP地址为192.168.10.17)和centos7的系统,在centos6上启动nc随便监听8090端口,nc -l 8090。在centos7上(centos6上的curl版本太低了,不支持gopher协议)使用curl的gopher协议发出http请求: curl gopher://192.168.10.17:8090/_helloworld,nc页会打印出来helloworld字样。

    现在测试一个gopher在ssrf中经常用到的方法,编写一个test_curl.php的文件,放置到pikachu目录下面,文件内容:

<?php
    echo $_POST['ARG'];
?>
           

    该文件可以接受一个POST请求(修改成GET请求也可以),然后在终端上使用curl指令:curl -v 'gopher://192.168.10.150:80/_POST%20/pikachu/vul/ssrf/test_curl.php%20HTTP/1.1%0d%0aHost:%20192.168.10.150%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%2014%0d%0aUser-Agent:%20Chrome%0d%0a%0d%0aARG%3Dhelloworld'。发送请求会返回包含ARG的值的新页面。

1、当后台test_curl.php文件使用GET时,上述http请求指令中的_POST也可以换成_GET。

2、请求中的回车、空格等符号需要进行url编码。

3、POST和GET请求前需要加_(换成其他无特殊意义的字符也可以),这是跟gopher协议相关的,第一个字符需要忽略。

    我们可以将gopher请求链接追加到http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=后面,同时需要做二次编码,因为在php后台通过url拿到gopher链接时会进行一次解码。二次编码后的gopher链接为:

http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.10.150:80/_POST%2520/pikachu/vul/ssrf/test_curl.php%2520HTTP/1.1%250d%250aHost:%2520192.168.10.150%250d%250aContent-Type:%2520application/x-www-form-urlencoded%250d%250aContent-Length:%252014%250d%250aUser-Agent:%2520Chrome%250d%250a%250d%250aARG%253Dhelloworld。发送请求,会显示出来test_curl.php的结果。这里需要将php的版本调整到php7.3,怀疑是低版本php中的curl不支持。

    同时,利用gopher/dict等协议也可以进行内网探测,比如通过post请求或者get请求对192.168.10.150网段的服务器的某些特定端口进行探测。

    例如发送请求http://192.168.10.150/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.10.150:22。

pikachu靶场练习记录说明越权访问BAC目录遍历敏感信息泄漏PHP反序列化URL任意跳转SSRF
pikachu靶场练习记录说明越权访问BAC目录遍历敏感信息泄漏PHP反序列化URL任意跳转SSRF

SSRF之file_get_contents

    与上面的SSRF之curl基本一样,访问链接:http://192.168.10.150/pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php可以从file中得到新的url,php后台会通过file_get_contents获取到新的url并访问。现在将请求修改为:http://192.168.10.150/pikachu/vul/ssrf/ssrf_fgc.php?file=file://e:\\passwd.txt,页面中会显示出来passwd.txt文件内容。

    答主在file_get_contents函数里面,试了试dict和gopher协议来探测22端口,没有生效,暂时没有做进一步的研究。