细说php反序列化字符逃逸( 三 )


";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:5:"/flag";}}}选中部分就是我们需要重新传参的地方,我们传进password,再次序列化看看效果

细说php反序列化字符逃逸

文章插图
 
我所选择的地方就是需要被吞噬的部分,然后才能使得后边的代码全部逃逸,长度为23,计算后发现需要8个,但8个这样的符号会吞噬24个字符,因此我们可以在s:70:""双引号里面可以随意补一个字符让它吞噬 。
因此我们最终在password里面传参的应该是:
i";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:5:"/flag";}}}而在username中传的就是8个:
最终payload:
?a=&b=i";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:5:"/flag";}}}
细说php反序列化字符逃逸

文章插图
 
0CTF piapiapia(字符增加)
扫描目录发现www.zip,下载后开始,审计源码
我们根据他的网页一步步看源码,首先他要我们登陆,我们先注册一个账号进行登陆
细说php反序列化字符逃逸

文章插图
 
看到上图的界面,这时我们看到update.php,都是一些对参数的白名单按要求写即可,图片也随便传一个符合大小的即可,但是注意nickname是我们要操作的地方,稍后讲解,然后有个序列化数组的过程
$user->update_profile($username, serialize($profile));在上传成功后,他会到profile.php,我们看到profile.php,有这么一段东西
$profile = unserialize($profile);$phone = $profile['phone'];$email = $profile['email'];$nickname = $profile['nickname'];$photo = base64_encode(file_get_contents($profile['photo']));这里告诉我们,他反序列化的是profile这个数组序列化后的值,读取的是键名为photo里面的文件名,而flag在config.php也就是说我们需要构造的就是数组中$profile['photo']='config.php'
那么怎样才能让他读这个config.php呢
我们看到class.php,看到父类MySQL中:
public function filter($string) {$escape = array(''', '\\');$escape = '/' . implode('|', $escape) . '/';$string = preg_replace($escape, '_', $string);$safe = array('select', 'insert', 'update', 'delete', 'where');$safe = '/' . implode('|', $safe) . '/i';return preg_replace($safe, 'hacker', $string);}发现序列化的值他会传递给user中的方法update_profile,接着update_profile又将这个值传递给了父类方法filter,显而易见,就是一种过滤,防止sql注入,但是可以发现,他是以替换的方式给返回值,在过滤的字符串中,只有where变成hacker,由5个字符变成6个,所以是字符增加的逃逸方式,接着开始构造
细说php反序列化字符逃逸

文章插图
 
选择部分是需要传入的,在phone和email都是白名单,传入的格式受限制,只有nickname是黑名单,所以我们要绕过这个黑名单,bp抓包
细说php反序列化字符逃逸

文章插图
 
他使用的是strlen()所以这里有个方式,这个函数如果参数是字符串,那么数出来的就是字符串个数,如果是数组,那么数出来的就是数组元素的个数
将nickname改成nickname[]然后传参
传的参数我们需要构造,需要计算,上面分析了我们需要构造的字符串";}s:5:"photo";s:10:"config.php";},但是他是字符增多,我们就需要知道需要逃逸的字符有多少个,计算了一下为34个,(这里因为改为了数组,而数组的序列化格式结束后是一个大括号,所以我们在一开始的”;后面增加了一个花括号)所以需要34个where帮助我们逃逸这部分代码,上传成功,根据这个修改放包即可
细说php反序列化字符逃逸

文章插图
 
返回网页点击
细说php反序列化字符逃逸

文章插图
 
之后可以看到一张显示不出来的图片,因为使用base64编码了,右击查看图片信息
细说php反序列化字符逃逸

文章插图
 
解码即可看到flag


推荐阅读