buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day

BUU

  • [WUSTCTF2020]朴实无华
    • robots.txt
    • response
    • level 1
    • level 2
    • level 3
  • [BSidesCF 2020]Had a bad day

[WUSTCTF2020]朴实无华

robots.txt


进入题目界面就一个Hack me,抓包也没看到啥有用的。dirsearch开启 ! 扫一扫有没有什么有用的,但是全都429,只能手动扫描了。备份文件,git泄露,robots协议…全都试一遍 。终于在robots.txt里找到了有用的东西。
在这里插入图片描述

response


访问是一个有假flag的页面,也没有其他东西。老规矩,抓包。
buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第1张图片
开始没看到有用的,后面搞了半天没思路又回来看了一下。靠,我吐了,返回头里那么大个fl4g.php我都没看到,我人傻了。

回到正题,访问一下。
buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第2张图片
源码


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 "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.
"
; }else{ die("金钱解决不了穷人的本质问题"); } }else{ die("去非洲吧"); } //level 2 if (isset($_GET['md5'])){ $md5=$_GET['md5']; if ($md5==md5($md5)) echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.
"
; else die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲"); }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 "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.
"
; system($get_flag); }else{ die("快到非洲了"); } }else{ die("去非洲吧"); } ?>


从源码可以看到,总共有三关,要全部绕过才能拿到flag

level 1


从源码里可以看到,第一关是要我们传递一个num参数,并将其值赋给$num,如果intval($num)<2020并且intval($num+1)>2021就能绕过了。
intval()是获取变量的整数值,从其官方文档中我们可以看到
buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第3张图片

由此可以知道,如果变量是字符型,该函数则会先将变量转换成做整型再做处理。而这里我们传进去的$num就是一个字符型的变量,而$num+1经过运算就成为一个整型的数据了。那么我们就可以利用16进制数来绕过,因为16进制数以0x开头,且在$num中以字符型存储,所以转换成整型后的值就是0。在本地测试一下:


	$a='0x01';
	echo intval($a)."
"
; echo intval($a+1); ?>

输出:
在这里插入图片描述
测试成功,可以利用该方法绕过。那么直接用一个大于等于2020的16进制数就行了。
buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第4张图片

level 2


第二关是要传递一个叫md5的参数,只要我们传递的值md5加密后与加密前相等就行。因为是弱比较,所以可以参考md5碰撞,只要找到一个加密前后都是0e开头的字符串就行了,我以前记录了一个,这里就直接用了,0e215962017


buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第5张图片

ok,下一关

level 3

第三关是一个有过滤的命令执行,过滤了空格和cat,空格可以用${IFS}绕过,cat可以用反斜线绕过。查看当前目录下文件:

?num=0x1111&md5=0e215962017&get_flag=ls

在这里插入图片描述找到flag文件,最终payload:

?num=0x1111&md5=0e215962017&get_flag=ca\t${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

在这里插入图片描述

拿到flag

[BSidesCF 2020]Had a bad day

buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第6张图片
有两个按钮,随便点一个出现了一张狗狗图片,url上也多了一个参数,我怀疑是文件包含,访问一下woofers.php看存不存在


有该文件,那么应该就是文件包含了。直接伪协议读index.php的源码。
buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第7张图片
关键代码


				$file = $_GET['category'];

				if(isset($file))
				{
     
					if( strpos( $file, "woofers" ) !==  false || strpos( $file, "meowers" ) !==  false || strpos( $file, "index")){
     
						include ($file . '.php');
					}
					else{
     
						echo "Sorry, we currently only support woofers and meowers.";
					}
				}
				?>

可以看到,我们传递的值中必须有woofers或meeowers或index,才能被包含。然后我就卡这了,后面去搜了一下wp,发现这里要用到php://filter的一个小trick。php://filter可以套一层协议,像这样
buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第8张图片就拿到flag了
buu做题笔记——[WUSTCTF2020]朴实无华&[BSidesCF 2020]Had a bad day_第9张图片

你可能感兴趣的:(wp,#,buu,web,网络安全)