0x01 挑战1
提到对象注入,首先就要了解对象的序列化与反序列化,所以对象注入漏洞也有人称作反序列化漏洞。有关序列化与反序列的内容,在这里做简单说明。
序列化的参数类型表示说明
String
s:size:value
Integer
i:value
Boolean
b:value
Null
N
Array
a:size:{key define;value define}
Object
O:strlen(class name):“class name”:object size:{type:len:value;,}
整个对象的序列化形式就是以"T-L-V"形式来表示的,即类型-长度-值来表示的。
比如下面这个例子
回到题目再看题目中的输出
可以看到,页面将序列化字符串中的一个参数输出了,我们来解析一下这个字符串:
a:3:{i:0;s:4:%22java%22;i:1;s:1:%22C%22;i:2;s:4:%22Perl%22;}
url解码得到:
a:3:{i:0;s:4:"java";i:1;s:1:"C";i:2;s:4:"Perl";}
按照"T-L-V"的格式来解析,即手动反序列化
a
T(类型):表示参数的类型是一个数组
3
L(长度):表示这个数组的大小是3,即数组中有三个参数
{i:0;s:4:"java";i:1;s:1:"C";i:2;s:4:"Perl";}
V(参数值):表示这个数组的3个值
以上是最大的"T-L-V"结构,接下来分析数组内部的参数,参数列表中的参数是以;
来分割的
三个参数:i:0;s:4:"java"
;i:1;s:1:"C"
;i:2;s:4:"Perl"
i
数组的索引:0,1,2
s
T(类型):该数组元素类型为字符串
4
、1
、4
L(长度):指字符串的长度,三个字符串元素的长度分别是4
、1
、4
java
、C
、Perl
V(值):数组中三个值分别为java
、C
、Perl
综上所述:这个数组就是ayyay[3]={'java','C','Perl'}
可以在代码中输出验证一下:
再回到题目中,可以看到页面将这个数组的第一个元素输出了出来,也就是说,在这里我们可以控制反序列化的字符串,即我们可以自己构造序列化字符串,然后交给服务器去执行反序列化操作,从而达到我们需要的效果。
接下来审计代码,可以看到,代码中存在一个DeleteFile类,其中有一个公有变量cache_file,还有一个析构函数,这个函数在对象销毁的时候会自动被调用执行,从而自动执行这个函数中的语句,即删除一个在临时目录下的一个文件
我们看看这个临时目录/btslab/tmp/
下有什么
存在两个文件,所以接下来我们构造一个序列化字符串来让服务器执行反序列化操作去删除其中一个文件,比如test1.txt
payload:http://127.0.0.1/btslab/vulnerability/injection/obj.php?array=O:10:"DeleteFile":1:{s:10:"cache_file";s:9:"test1.txt";}
注入成功,文件test1.txt
被删除
0x02 挑战2
array参数的值为a:3:{i:0;s:8:%22Assembly%22;i:1;s:1:%22C%22;i:2;s:4:%22Perl%22;}
url解码得到:a:3:{i:0;s:8:"Assembly";i:1;s:1:"C";i:2;s:4:"Perl";}
审计源码,可以看到有一个RunCode
类,其中有一个公有参数code
,还有一个魔幻函数__wakeup()
,在这个函数中会把变量code
传入eval()
函数的参数去执行
所以,接下来我们就可以构造一个序列化字符串,给code
赋值,让eval
去解析执行
payload:http://127.0.0.1/btslab/vulnerability/injection/obj1.php?array=O:7:"RunCode":1:{s:4:"code";s:10:"phpinfo();";}
,从下图可以看到,代码被成功解析执行