前言
三天趕了兩場(chǎng)比賽
黃鶴杯體驗(yàn)極佳 财骨,比某500空間好到不知哪里去了
web就兩個(gè)題,一開(kāi)始就打穿了
于是本菜雞就開(kāi)始了劃水運(yùn)動(dòng)hhhhh
web1
web1是個(gè)thinkphp5
掃一下目錄有個(gè)www.zip
打開(kāi)后看到源碼
有注冊(cè) 有登錄按鈕,然后看源碼的意思是讓你成為admin用戶(hù),然后可以得到一個(gè)hint來(lái)進(jìn)行下一步
Userinfo.php
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
use think\Request;
use think\Validate;
class Userinfo extends Controller
{
public function user(Request $request)
{
$session = $request->session('username');
if($session === 'admin')
{
return view('user',['info'=>'welcome admin!!','flag'=>'This is your hint: <br>hint{xxxxxxxxxx}']);
}
else{
return view('user',['info'=>"hello {$session}",'flag'=>'This is your hint: <br>flag{}<br>maybe the admin have some hints:)']);
}
}
public function change()
{
return view();
}
public function changeinfo(Request $request)
{
$dbuser ='*****';
$dbpass ='*****';
$dbname ="study";
$host = 'localhost';
@error_reporting(0);
@$con = mysqli_connect($host,$dbuser,$dbpass,$con);
// Check connection
if (!$con)
{
echo "Failed to connect to MySQL: " . mysqli_error();
}
@mysqli_select_db($con,$dbname) or die ( "Unable to connect to the database: $dbname");
$post = $request->post();
$username = $request->session('username');
$pass = $post['password'];
$curr_pass = $post['current_password'];
$validate = Validate::make(['password'=>'min:3|confirm']);
$status = $validate->check($post);
if($status){
if (preg_match("/select|update|delete|insert|into|set|;|between|regexp|like|rlike|=|substr|mid|ascii|join|char|order|count|rand|floor|group|extractvalue|updatexml|exp|concat|outfile|\(|\)/i", $curr_pass) || preg_match("/select|update|delete|insert|into|set|;|between|regexp|like|rlike|=|substr|mid|ascii|join|char|order|count|rand|floor|group|extractvalue|updatexml|exp|concat|outfile|\(|\)/i", $pass)) {
$this->success('go out!! hacker','/xinan/public/index/index/index');
} else {
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
$res = mysqli_query($con,$sql) or die('You tried to be smart, Try harder!!!! :( ');
$row = mysqli_affected_rows();
if($row = 1){
$this->success('修改成功啦','/xinan/public/index/login/index');
}else {
$this->error('修改失敗腊敲,請(qǐng)聯(lián)系管理員');
}
$this->error($validate->getError());
}
}
}
但是過(guò)濾了一大堆關(guān)鍵字,防止注入
然后翻翻目錄發(fā)現(xiàn)兩個(gè)有意思的地方
- 根目錄下有個(gè)shell.php
- 出題人的log沒(méi)刪维苔。兔仰。。
shell.php
<?php
echo "這個(gè)是內(nèi)網(wǎng)的操作頁(yè)面蕉鸳,只允許內(nèi)網(wǎng)人員使用,get_cmd";
echo "<br />";
if($_SERVER["REMOTE_ADDR"] === "127.0.0.1")
{
@eval(system($_GET["cmd"]));
}
else
{
echo "您的ip是".$_SERVER["REMOTE_ADDR"]."<hr/>"."不是我們的內(nèi)網(wǎng)機(jī)器"."<hr/>"."這是一臺(tái)內(nèi)網(wǎng)機(jī)器乎赴,只接受本機(jī)請(qǐng)求"."<hr/>";
return false;
}
是個(gè)cmd一句話,但是必須127.0.0.1訪問(wèn)
猜想可能hint就是個(gè)ssrf
然后看log
翻翻里面有沒(méi)有什么有意思的東西
想起了國(guó)賽決賽直接把payload放log里了hhhh
前面的都沒(méi)啥意義潮尝,就是出題人調(diào)試的過(guò)程
然后看到了這個(gè)
印證猜想榕吼,就是給你一個(gè)可以ssrf的地址讓你去打shell.php
訪問(wèn)了一下100e8a82eea1ef8416e585433fd8462e.php結(jié)果是404
說(shuō)明可能實(shí)際題目中改了名字,這時(shí)候就必須要拿到hint才可以得到真實(shí)地址
然后正在看他是怎么才能成admin的時(shí)候勉失,平臺(tái)發(fā)了一個(gè)公告
猜想是怕有些戰(zhàn)隊(duì)掃不到源碼備份故意放的水
下載下來(lái)后還真是
但是!!!
主辦方直接把真實(shí)環(huán)境的源碼給發(fā)出來(lái)了
阿偉死了
直接找到55ceedfbc97b0a81277a55506c34af36.php
<?php
echo 'please get $url';
$url = $_GET['url'] ?? false;
if($url)
{
$a = preg_match("/gopher/i", $url);
if ($a==0)
{
echo "<br />";
echo "操作錯(cuò)誤羹蚣,你是我們的內(nèi)網(wǎng)人員嗎";
exit();
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET["url"]);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
?>
果然是個(gè)ssrf,直接跳過(guò)了成為admin這一步
payload中還必須有g(shù)opher這個(gè)單詞乱凿,這是明晃晃的暗示啊hhhh
然后就是生成gopher二進(jìn)制流來(lái)打
然而實(shí)際中被坑的不輕顽素。。徒蟆。
開(kāi)始一直是400胁出,不知道為什么
心里想著woc這tm還有幺蛾子
被坑了好久。段审。全蝶。然后沒(méi)辦法讓隊(duì)友看,給他說(shuō)了思路后隊(duì)友直接一個(gè)payload打過(guò)去flag出來(lái)了
喵喵喵寺枉?抑淫?? 為毛我一直400
最后才發(fā)現(xiàn)一個(gè)坑人的地方
就是你在編碼payload的時(shí)候要用burp的右鍵send to decoder
而不能用復(fù)制粘貼姥闪,否則格式會(huì)亂始苇,阿帕奇就400
但是我一直都是這么打的啊。筐喳。催式。不知道為什么今天會(huì)出錯(cuò)
結(jié)果拿了四血往弓,菜雞大哭.jpg
web2
web2是個(gè)smarty的模版注入
這是拿到shell后看的源碼
就是兩個(gè)接口 一個(gè)獲取ip,一個(gè)獲取xff
ip不可控蓄氧,xff可控,帶入到模版文件里槐脏,就形成了模版注入
看下版本號(hào)
因?yàn)楸荣愔性试S聯(lián)網(wǎng)(好評(píng))喉童,所以查查對(duì)應(yīng)的版本有沒(méi)有0day
找到這兩篇
第一篇是發(fā)現(xiàn)他必須自定義一個(gè)注冊(cè)模版的類(lèi)才可以插入payload,然而這個(gè)題里直接是sha1了一遍路徑顿天,所以打不了
http://www.tiaozhanziwo.com/archives/386.html
第二篇是過(guò)濾了php標(biāo)簽堂氯,所以無(wú)法直接命令執(zhí)行
翻翻smarty手冊(cè)
https://www.smarty.net/docs/zh_CN/language.function.include.php.tpl
發(fā)現(xiàn)可以用include看源碼
然而不能跨目錄看,就很雞肋
繼續(xù)翻手冊(cè)看到一個(gè)eval標(biāo)簽
就rce了牌废。咽白。。
本來(lái)想直接system 來(lái)cat flag 結(jié)果是500沒(méi)回顯
猜想可能有函數(shù)禁用
找了一下確實(shí)是的鸟缕,還有open basedir
寫(xiě)個(gè)shell
蟻劍連接
無(wú)法切換到根目錄晶框,需要bypass open basedir
蟻劍大法好,直接上大表哥的bypass disable function插件
拿到flag
手速慢懂从,只拿了個(gè)三血
最后
嘲諷的是隊(duì)友把我一直在看的這個(gè)ssrf做了授段,我把隊(duì)友一直在看的smarty做了hhhh(隊(duì)友tql企圖當(dāng)場(chǎng)挖框架0day)
這次比賽水的成績(jī)還不錯(cuò),見(jiàn)到了一堆巨佬
零食跟自助餐是真的好吃
可惜趕飛機(jī)沒(méi)趕上比賽前一晚上的游艇觀光番甩,感覺(jué)損失一個(gè)億