欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

三个白帽挑战赛第三期的简单思路(第一次接触php反序列化)

程序员文章站 2022-03-26 18:24:52
...
又一期三个白帽来了,由于某些原因,就只讲讲大概的思路,就不讲那么详细啦。主要是第一次接触反序列化。感觉又学到了新姿势。哈哈

一、界面没什么变化,还是注册用户,然后登陆。

二、登陆之后出现选择控制面板的选项,一个是管理员的面板选项,另一个是普通会员的面板选项。很明显需要越权啦。

三、根据tips直接用0x就能提权为管理员。

四、进入管理员的界面,可以编辑文章,还有搜索选项,从代码来看,很明显有个注入

五、准备利用注入写shel,发现mysql权限不够,web目录不能写进去,其他目录可写。

六、得到群里某牛的提醒要反序列化,瞬间明白。就去看了些反序列化的资料,并且仔细拜读了p牛的关于joomla的反序列化漏洞的分析。

七、然后审计代码,很明显就找到了漏洞触发点

其中的path是cach/md5(username).txt

这部分代码的大概意思是,用户登录后就会去反序列化path文件里面的内容,析构函数__destruct()马上又会把之前的变量序列化成字符串。然后再写入path路径当中。

八、

其实这个时候大概的思路已经清晰了。通过search那个注入点,往cach目录写一个你md5(username).txt的文件,内容就是一段序列化的字符串。包含path,而且path的值就是你的一句话的绝对路径,然后内容里面随便加个变量名,然后内容是一句话,制作这个字符串一定要细心啦,格式要求很严格,不然老报错,我就吃了不少坑,建议去看看序列化的文档。

给一个demo吧。

x:i:3;a:0:{};m:a:2:{s:4:"path";s:36:"/var/www/html/public/upload/xxxx.php";s:4:"test";s:24:"";}

大概是长这样,你可以自己改其他的

写进去之后,当构造函数去反序列化的的时候,$path已经是 /var/www/html/public/upload/xxxx.php了。$cache 经过序列化之后就是 x:i:3;a:0:{};m:a:2:{s:4:"path";s:36:"/var/www/html/public/upload/xxxx.php";s:4:"test";s:24:"";} 这个了,这样经过file_put_cntents函数,就往public/upload目录写去进了一个包含一句话的php文件了

这里提一下两点:

1、username肯定是要没有注册过的,因为你注册过的话,cache目下就存在那个文件了,用sql注入就写不进去了。所以注入写入一个的MD5(未注册的username).txt,然后你再注册那个username,这样牛能成功加载到你写入的那个文件。

2、写文件的时候用16进制去写,不然后字符串的‘;’要掉,而且也不要union select 1,xxxxx,3这样写,因为这样会把数字写进文件,而反序列化要求的是不能有脏数据的字符串,所以这样写反序列化会失败的。所以建议这样 union select 0xxxxxx,'',''这样写比较好,我再这里被自己坑死了

写的简单,可能有不太对的地方,望见谅