Pikachu靶场通关教程

RCE(远程代码执行)

Ping

我们尝试写入一个IP地址,比如127.0.0.1(本机的回环地址)

接下来我们尝试和IP进行拼接查询语句,比如whoami,net user ,netstat -an 等等

这样九爆出了用户名,接下来我们看看源代码,以下是主要的一段代码

if(isset($_POST['submit']) && $_POST['ipaddress']!=null){
    $ip=$_POST['ipaddress'];
//     $check=explode('.', $ip);可以先拆分,然后校验数字以范围,第一位和第四位1-255,中间两位0-255
    if(stristr(php_uname('s'), 'windows')){//判断操作系统的是windows还是linux
//         var_dump(php_uname('s'));
        $result.=shell_exec('ping '.$ip);//直接将变量拼接进来,没做处理
    }else {
        $result.=shell_exec('ping -c 4 '.$ip);
    }

}

主要的问题是他没有对用户的输入进行任何的过滤,才会出现远程代码执行的漏洞

eval

看一下提示说后台执行eval函数,所以我们尝试执行php代码中的phpinfo函数

成功了,在这里小编提醒一下payload是下面这个,记得加分号因为eval里是执行的php代码

,php代码每一行结束都有分号

payload:phpinfo();

不理解php函数的看这个PHP代码审计-CSDN博客

PHP反序列化

让我们填写一个序列化之后的东西

<?php
class S{
    var $test = "pikachu";
    function __construct(){
        echo $this->test;
    }
}


//O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
$html='';
if(isset($_POST['o'])){
    $s = $_POST['o'];
    if(!@$unser = unserialize($s)){
        $html.="<p>大兄弟,来点劲爆点儿的!</p>";
    }
else{
        $html.="<p>{$unser->test}</p>";
    }

}
?>

这里可以直接去反序列化,下面是php构造序列化的代码

<?php

class S{
    var $test = "<script>alert('xss')</script>";

}
$a = new S();
$b = serialize($a);
echo $b;
?>

Unsafe Fileupload

client check

看一下提示,可以大概了解到大概是前端的绕过

我们看一下代码,我们可以看到是前端的js代码绕过,所以我们直接禁用js就ok了

<script>
    function checkFileExt(filename)
    {
        var flag = false; //状态
        var arr = ["jpg","png","gif"];
        //取出上传文件的扩展名
        var index = filename.lastIndexOf(".");
        var ext = filename.substr(index+1);
        //比较
        for(var i=0;i<arr.length;i++)
        {
            if(ext == arr[i])
            {
                flag = true; //一旦找到合适的,立即退出循环
                break;
            }
        }
        //条件判断
        if(!flag)
        {
            alert("上传的文件不符合要求,请重新选择!");
            location.reload(true);
        }
    }
</script>

先按F12在按F1,往下翻就可以看到,勾选,直接上传一句话木马

上传成功

Mime type

直接看源代码

if(isset($_POST['submit'])){
//     var_dump($_FILES);
    $mime=array('image/jpg','image/jpeg','image/png');//指定MIME类型,这里只是对MIME类型做了判断。
    $save_path='uploads';//指定在当前目录建立一个目录
    $upload=upload_sick('uploadfile',$mime,$save_path);//调用函数
    if($upload['return']){
        $html.="<p class='notice'>文件上传成功</p><p class='notice'>文件保存的路径为:{$upload['new_path']}</p>";
    }else{
        $html.="<p class=notice>{$upload['error']}</p>";
    }
}

这里和上面的差不多,只不过时进行了后端的验证,检验了文件的类型,并没有检查后缀

所以我们直接BP抓包,把文件类型进行更改那三个中的一个就行

getimagesize

这一关我们可以使用图片马,图片马制作方法有很多

这一关,我们怎么制作图片马呢,我们上传一个正常的图片并用bp抓包

中间这串乱码就是我们图片的内容

我们可以往下翻,直接把一句话木马写在这里

注意不要写在文件头部,这里会对文件头进行检测,看看是不是图片类型

放包,上传成功

Unsafe Filedownload

直接更改filename ,,/为了返回到根目录,直接下载成功

敏感信息泄露

直接查看源带代码

成功登录

暴力破解

基于表单的暴力破解

直接进行抓包

添加payload

配置payload

可一看到当账户为admin密码为password的时候长度不一样139和138因为代码加了一点东西

验证码绕过(on server)

我们发现,只有当页面刷新时,验证码才会重新刷新,下面我们就来验证一下这个猜想

我们先来抓一个包,输入正确的验证码和错误的账号密码

再次修改密码,不改动验证码

依旧提示username or password  is not exists,由此验证我们的猜想是对的,只要页面不刷新,验证码就不会改变。

呢么剩下的步骤就和上一关一样了,我们将数据包发送到攻击模块,暴力破解

验证码绕过(on client) 

查看源码,发现是前端的过滤,直接关掉js就可以

这样我们就绕过前端验证了

后面的步骤和前两关一样,也是bp抓包,爆破账号密码

token防爆破?

token的作用:简单来说就是服务器给前端发的身份证,前端向服务器发送请求时都要带上这个身份证,服务器通过这个身份证来判断是否是合法请求

在账户,密码和token都添加payload,配置字典,token的字典配置

将token的payload类型设置成递归搜索,在递归搜索选项中的第一个请求的初始有效负载设置为之前复制的token

攻击成功

Cross-Site Scripting(xss) 

反射型xss(get)

构造payload

<script>alert('xss')</script>

反射型xss(post)

我们发现一个登录框,我们在暴力破解那一关,获取到了管理员账号和密码,即

账号:admin

密码:123456

如果没做暴力破解我们也可以点一下提示看一下

存储型xss

我们先看一下post和get请求的区别

数据传输方式:

GET请求:数据通过URL中的查询参数附加在URL后面,以明文形式传输数据。
POST请求:数据作为请求的正文发送,而不是通过URL传递。
数据长度限制:

GET请求:有长度限制,受浏览器和服务器对URL长度的限制。
POST请求:没有固定的长度限制,适合传输大量数据。
数据安全性:

GET请求:数据以明文形式暴露在URL中,容易被窃听和拦截。
POST请求:数据在请求正文中传输,并可以使用加密协议(如HTTPS)进行传输,相对更安全。
数据缓存:

GET请求:可以被浏览器缓存,可以提高性能。
POST请求:通常不被浏览器缓存。
 仔细观察就会发现,get型的那一关,我们输入的payload在url中有显示,而post则没有显示

把页面重新转回来发现还会弹窗,这就是储存型的

DOM型xss

 <script>
      function domxss(){
        var str = document.getElementById("text").value;
        document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see</a>";
}                   
</script>

我们可以直接利用js的伪协议在str这拼接

点一下what do you see?即可弹窗

DOM型xss_x

和上一关差不多只是多了一个链接

点击第二个链接,第一个链接就会出现,再点击第一个即可弹窗

xss盲打

这一关是什么意思呢,盲打也就是我们在前端并不能看到我们的代码,无法判断xss是否成功,只有在后台才能看到

成功弹窗,并且弹了两次,也就是说两个输入框都有xss漏洞

xss之过滤

if(isset($_GET['submit']) && $_GET['message'] != null){
    //这里会使用正则对<script进行替换为空,也就是过滤掉
    $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
//    $message=str_ireplace('<script>',$_GET['message']);

    if($message == 'yes'){
        $html.="<p>那就去人民广场一个人坐一会儿吧!</p>";
    }else{
        $html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>";
    }

}

这关可以看到他把<script全部给过滤了,所以伪协议也用不了了

换程<a  οnclick="alert('xss')">

xss之htmlspecialchars

if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>输入点啥吧!</p>";
    }else {
        //使用了htmlspecialchars进行处理,是不是就没问题了呢,htmlspecialchars默认不对'处理
        $message=htmlspecialchars($_GET['message']);
        $html1.="<p class='notice'>你的输入已经被记录:</p>";
        //输入的内容被处理后输出到了input标签的value属性里面,试试:' onclick='alert(111)'
//        $html2.="<input class='input' type='text' name='inputvalue' readonly='readonly' value='{$message}' style='margin-left:120px;display:block;background-color:#c0c0c0;border-style:none;'/>";
        $html2.="<a href='{$message}'>{$message}</a>";
    }
}

一般的html实体转义没有注入的,但是这个message的位置在href内,就可以js的伪协议进行注入

如果这关加上了过滤了script,可以尝试进行unicode编码,因为href属性自带unicode解码

xss之href输出

if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>叫你输入个url,你咋不听?</p>";
    }
    if($_GET['message'] == 'www.baidu.com'){
        $html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
    }else {
        //输出在a标签的href属性里面,可以使用javascript协议来执行js
        //防御:只允许http,https,其次在进行htmlspecialchars处理
        $message=htmlspecialchars($_GET['message'],ENT_QUOTES);
        $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
    }
}

和上一关一样

xss之js输出

<script>
    $ms='<?php echo $jsvar;?>';
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac确实厉害,看那小眼神..')
        }else {
//            alert($ms);
            $('#fromjs').text('无论如何不要放弃心中所爱..')
        }

    }

</script>

直接闭合script标签就可以了

</script><script>alert('xss')</script>

file inclusion

本地文件包含

我们可以尝试修改filename后的文件名读取其他的文件

?filename=C:/../../../../Windows\win.ini&submit=提交查询

远程文件包含

这一关和上一关有什么不同,这一关我们可以访问远程服务器上的文件

比如这里我们访问百度

呢么有什么用呢,我们可以在自己服务器上写一个木马文件,在这里远程包含我们的木马文件,然后通过我们的webshell管理工具进行连接,以此来getshell

目录遍历

?title=C:../../../../../../windows\win.ini

不安全的URL跳转

这几个超链接我们都点一点,当点到“我就是我,放荡不羁的我”时,发现url地址栏中出现了url参数

?url=http://www.baidu.com

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smile灬凉城666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值