[BUUCTF 2018]Online Tool
从源代码中我们可以看到,system中的$host是可控变量,存在命令执行的可能性。但是这边进行了两次转义。
另外一个可控变量是$sanbox,但是该变量用来创建目录和切换目录,不清楚如何利用。
看解析学学基础知识再做吧...
escapeshellarg()和escapeshellcmd()都是转义函数,下面是AI给的解释:
escapeshellarg($host)
该函数会在字符串两边添加单引号,并对字符串里的单引号进行转义处理。。
escapeshellarg()
的核心逻辑是:
- 将参数中的每个单引号
'
替换为'\''
- 在字符串两端添加单引号
举例:
原始输入: 172.17.0.2' -v -d a=1
替换单引号: 172.17.0.2'\'' -v -d a=1
添加首尾引号: '172.17.0.2'\'' -v -d a=1'
根据shell的解析规则
- 单引号的作用:shell 将
'...'
内的内容视为一个整体字符串,即使包含空格或特殊字符。- 转义后的单引号:
'\''
被解析为:
- 第一个单引号
'
:结束当前字符串- 反斜杠和单引号
\'
:转义后的单引号字符- 第二个单引号
'
:开启新的字符串- 相当于变成了三部分内容贴在一起。
- shell中相邻字符串贴在一起相当于连接,因此变换后的内容在shell中的含义不变。防止了用户利用单引号闭合执行恶意代码。
escapeshellcmd($host)
escapeshellarg专注于将用户输入的内容作为一个整体字符串,然而
此函数专注于对字符串中可能被用于执行命令的元字符进行转义,包括 ; & | ` " ' < > ^ ( ) [ ] { } $ \ # * ? ! 空格但是该函数缺陷很明显,会使某些正常命令无法执行。
两种转义函数同时使用就会出现转义故障:escapeshellcmd会将escapeshellarg用来转义的'\'符号进一步转义,进而使原来需要转义的符号逃逸。
举个例子: ' (单引号)经过第一个函数转义变成 ' \' ' ,再经过第二个函数转义变成' \\' '。这样的话
" \\ "会被解析为" \ "符号,而后面的单引号就逃逸了。
但是我有个疑惑,在第二次转义时' \' '中的单引号不会再次转义吗?别人的博客说道只有未闭合的单引号才会被转义
@mkdir() 创建目录,@抑制错误输出
chdir() 将当前工作目录切换到特定目录
nmap 网络扫描命令
nmap中的-oG参数可以将代码与命令写到文件中,比如nmap <?php phpinfo();?> -oG 1.php,就是将这个phpinfo();语句写在了1.php里内了。
因此我们可以先利用mkdir和chdir创建文件并切换工作区,然后利用命令执行将一句话木马写到该文件中。关键在于绕过字符转义:
目标是执行nmap ...... <?php eval($_POST[0]);?> -oG shell.php
突然有个问题,直接/?host=<?php eval($_POST[0]);?> -oG shell.php 又会有什么问题呢?
第一次转义后是'<?php eval($_POST[0]);?> -oG shell.php'(添加引号包裹),经过第二次转义后是,想不明白...先留着吧...