无参RCE [GXYCTF2019]禁止套娃1

2023-12-10 03:52

本文主要是介绍无参RCE [GXYCTF2019]禁止套娃1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

打开题目

毫无思绪,先用御剑扫描一下

只能扫出index.php

我们尝试能不能用php伪协议读取flag

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

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

但是页面都回显了429

怀疑是不是源码泄露

用githack看看

 在其目录下发现了被我们扒下来的源码

 源码如下

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {// echo $_GET['exp'];@eval($_GET['exp']);}else{die("还差一点哦!");}}else{die("再好好想想!");}}else{die("还想读flag,臭弟弟!");}
}
// highlight_file(__FILE__);
?>

我们代码审计一下

get传参exp,用isset函数检查exp不为null,其中传入的exp里面不能包含php伪协议,data协议,filter协议。

  if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);

这里是将get传入的exp的内容,通过正则表达式对 $_GET['exp'] 中的内容进行替换,并最终与字符串 ';' 进行比较。

  • preg_replace 函数:

    • preg_replace 用于执行正则表达式的搜索和替换。
    • /[a-z,_]+((?R)?)/ 是要搜索的模式。
    • NULL 是替换的内容,这里表示删除匹配的部分。
    • $_GET['exp'] 是输入的字符串。
  • ';' === preg_replace(...): 将 preg_replace 的结果与字符串 ';' 进行比较

(?R)? : (?R)代表当前表达式,就是这个(/[a-z,_]+((?R)?)/),所以会一直递归,?表示递归当前表达式0次或1次(若是(?R)*则表示递归当前表达式0次或多次,例如它可以匹配a(b(c()d())))

接着又进行了一次黑名单过滤

直接构造payload:

exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

highlight_file() 函数对文件进行语法高亮显示,本函数是show_source() 的别名
next() 输出数组中的当前元素和下一个元素的值。
array_reverse() 函数以相反的元素顺序返回数组。(主要是能返回值)
scandir() 函数返回指定目录中的文件和目录的数组。
pos() 输出数组中的当前元素的值。
localeconv() 函数返回一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."。

得到flag

?exp=highlight_file( session_id(session_start()));

知识点:

  • isset函数

isset () 函数用于检测变量是否已设置并且非 NULL

  • 什么是无参数RCE

无参rce,就是说在无法传入参数的情况下,仅仅依靠传入没有参数的函数套娃就可以达到命令执行的效果。

     核心代码:

if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    eval($_GET['code']);
}

代码的核心就是只允许函数而不允许函数中的参数,就是说传进去的值是一个字符串接一个(),那么这个字符串就会被替换为空,如果替换后只剩下;,那么这段代码就会被eval执行。而且因为这个正则表达式是递归调用的,所以说像a(b(c()));第一次匹配后就还剩

a(b());,第二次匹配后就还剩a();,第三次匹配后就还剩;了,所以说这一串a(b(c())),就会被eval执行,但相反,像a(b('111'));这种存在参数的就不行,因为无论正则匹配多少次它的参数总是存在的。那假如遇到这种情况,我们就只能使用没有参数的php函数

常见的绕过姿势:
1.getallheaders()

获取http所有的头部信息,也就是headers,然后我们可以用var_dump把它打印出来,但这个有个限制条件就是必须在apache的环境下可以使用,其它环境都是用不了的

2.get_defined_vars()

原理和getallheaders()差不多,但是它并不是获取的headers,而是获取的四个全局变量$_GET $_POST $_FILES $_COOKIE。而它的返回值是一个二维数组。

这种方法和第一种方法几乎是一样的,就多了一步,就是利用current()函数将二维数组转换为一维数组

3.session_id()

简单来说就是把恶意代码写到COOKIEPHPSESSID中,然后利用session_id()这个函数去读取它,返回一个字符串,然后我们就可以用eval去直接执行了,这里有一点要注意的就是session_id()要开启session才能用,所以说要先session_start()

但这里要注意的是,PHPSESSIID中只能有A-Z a-z 0-9-,所以说我们要先将恶意代码16进制编码以后再插入进去,而在php中,将16进制转换为字符串的函数为hex2bin

4.php函数直接读取文件
<1>   localeconv

localeconv函数返回一个包含本地数字及货币格式信息的数组。

<2>scandir

scandir列出目录中的文件和目录

<3>current(pos)

pos()函数是current()函数的别名,他们俩是完全一样

作用就是输出数组中当前元素的值,只输出值而忽略掉键,默认是数组中的第一个值

<4>chdir()

函数是用来跳目录的,有时想读的文件不在当前目录下就用这个来切换,因为scandir()会将这个目录下的文件和目录都列出来,那么利用操作数组的函数将内部指针移到我们想要的目录上然后直接用chdir切就好了,如果要向上跳就要构造chdir('..')

<5>array_reverse()

将整个数组倒过来,有的时候当我们想读的文件比较靠后时,就可以用这个函数把它倒过来,就可以少用几个next()

<6>highlight_file()

  • 什么是二维数组?

二维数组本质上是以数组作为数组元素的数组,即数组的数组。

定义类型:类型名 数组名[ 行表达式 ][ 列表达式];行与列用常量表达式

详情见:C 语言之二维数组(详细版)_c语言二维数组-CSDN博客

知识点源于:https://www.cnblogs.com/pursue-security/p/15406272.html

这篇关于无参RCE [GXYCTF2019]禁止套娃1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/475947

相关文章

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

禁止复制的网页怎么复制

禁止复制的网页怎么复制 文章目录 禁止复制的网页怎么复制前言准备工作操作步骤一、在浏览器菜单中找到“开发者工具”二、点击“检查元素(inspect element)”按钮三、在网页中选取需要的片段,锁定对应的元素四、复制被选中的元素五、粘贴到记事本,以`.html`为后缀命名六、打开`xxx.html`,优雅地复制 前言 在浏览网页的时候,有的网页内容无法复制。比如「360

禁止 CTRL+ALT+DEL

在win98 里可以用   Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long)

【vulhub】thinkphp5 2-rce 5.0.23-rce 5-rce 漏洞复现

2-rec 1.启动环境  cd /.../vulhub/thinkphp/2-rce # cd进入2-rce靶场文件环境下docker-compose up -d # docker-compose启动靶场docker ps -a # 查看开启的靶场信息 2.访问192.168.146.136:8080网页 3.构造payload http

涉密电脑插U盘会不会被发现?如何禁止涉密电脑插U盘?30秒读懂!

在涉密电脑插U盘的那一瞬间,你是否也好奇会不会被发现?涉密电脑的安全监控可是滴水不漏的!想知道如何彻底禁止涉密电脑插U盘?简单几招搞定,轻松锁死外部设备,信息安全无懈可击! 涉密电脑插U盘会不会被发现? 涉密电脑是否会在插入U盘时被发现,需要根据具体情况来判断。在一些情况下,涉密电脑可能没有安装任何监控软件或安全工具,插入U盘可能不会立即触发警告。然而,随着信息安全管理的不断升级,越来越多

Android13 Hotseat客制化--Hotseat修改布局、支持滑动、去掉开机弹动效果、禁止创建文件夹

需求如题,实现效果如下 : 固定Hotseat的padding位置、固定高度 step1 在FeatureFlags.java中添加flag,以兼容原生态代码 public static final boolean STATIC_HOTSEAT_PADDING = true;//hotseat area fixed step2:在dimens.xml中添加padding值和高度值

Android-ViewPager禁止左滑(右滑)

因为项目需求,要做一个滑动月份选择的效果,而且滑动到当前月就要禁止左滑到下一个月,百度了下,大多是禁止左右双向滑动,满足不了效果,继续百度了解了下 触摸事件的分发,我决定自己写一个试试,结果效果很好。开始出现了一个bug,来回滑任然能左滑过去,结果发现是仅把按下时作为上一次坐标,来和当前坐标对比,肯定会有不满足的情况。这个问题已经解决了,直接看代码吧。     package

怎么禁止外部设备连接电脑

企业为了可以更好地控制IT环境,保护数据和资产不受外部威胁的影响,禁止外部设备连接电脑可以避免数据泄露,保护企业重要数据。 一、物理方法 禁用接口:直接禁用电脑上的USB接口、光驱接口、蓝牙等外部设备连接接口,从物理上切断外部设备的连接途径。这种方法简单直接,但需要一定的技术操作,且可能影响其他正常设备的使用。 二、软件方法 使用安全管理软件:安装并配置安全管理软件,如金刚钻信息网的桌面管

wordpress免插件添加禁止某些用户登录的方法

wordpress免插件添加禁止某些用户登录的方法 在一些情况下,比如某些用户损害了网站的利益,有不方便直接删除账号的,你可能就需要禁止他们登录网站,今天咱们就来介绍下wordpress如何添加禁止用户登录。 咱们只需要在“ functions.php”中加入以下代码即可。 /*** WordPress 禁止某些用户登录*zzzjtd.com 志在指尖*///在资料页面添加选项fun

禁止输入表情

// 不让输入表情     if ([textField/textView isFirstResponder]) {         if ([[[textField/textView textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField/textView textInputMo