前言:
无参数RCE
RCE
hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符。
localeconv() 函数返回一包含本地数字及货币格式信息的数组。
localeconv() 函数会返回以下数组元素:
[decimal_point] - 小数点字符.........
array_flip() 函数用于反转/交换数组中的键名和对应关联的键值。
array_rand() 函数返回数组中的一个随机键名,或者如果指定函数返回键名不只一个,则返回一个包含随机键名的数组。
get_defined_vars — 返回由所有已定义变量所组成的数组
有关数组及其函数作用
next — 将数组中的内部指针向前移动一位
pos — current 的别名
prev — 将数组的内部指针倒回一位
range — 根据范围创建数组,包含指定的元素
reset — 将数组的内部指针指向第一个单元
rsort — 对数组逆向排序
读取PHP源码的函数:show_source/highlight_file(),file_get_contents(),read_file
如何能得到scandir(’.’)中的点(.):
chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion())))))))) 返回点(.)
chr(46)
解题:
用githack能拔下来出现git文件泄露,index.php。
<?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__);
?>
方法一:
(’;’ === preg_replace(’/[a-z,_]+((?R)?)/’, NULL, $_GET[‘exp’])发现是无参数RCE。
这里把et过滤了就不能用getenv()函数去获取环境变量。也不能往函数里面传参。那就用localeconv() 函数和current()函数结合current(loacleconv())返回.。那么scandir(’.’)就能返回当前目录的信息了。
这就发现了flag.php,那么下一步就是打开flag.php了。
flag.php在倒数第二个,可以用array_flip()+array_rand()爆出来单个的flag.php。那么现在就让它高亮就能显示了。
或者使用反转数组函数:array_reverse()。再让指针指向下一个数组元素(第二个),再使其高亮。
这样就也能看到flag.php的信息了。
方法二:
利用getallheaders()函数。但是这里吧et过滤了无法进行演示,可以查看前言里面的无RCE方法2
方法三:PHPSESSID
UM_xxx是友盟的cookie:
session函数
PHP SESSION PHPSESSID session_id()
使用session之前需要通过session_start()告诉PHP使用session,php默认是不主动使用session的。
session_id()可以获取到当前的session id。
总结:这个题考察了RCE的无参数方法,学到了挺多函数的使用方法的。