首先要知道这escapeshellarg()和escapeshellcmd()两个函数组合会产生漏洞
escapeshellarg() 是 PHP 中一个重要的安全函数,用于将字符串转义,以便安全地作为参数传递给 shell 命令。
功能概述
-
作用: 将字符串用单引号包裹,并转义字符串中已有的单引号
-
目的: 防止 shell 命令注入攻击
-
返回值: 返回转义后的字符串
escapeshellcmd()是 PHP 中用于转义 shell 命令中特殊字符的函数,防止命令注入攻击。功能概述
-
作用: 转义 shell 命令中的元字符
-
目的: 防止 shell 命令注入攻击
-
返回值: 返回转义后的字符串
转义规则
escapeshellcmd()会转义以下字符:-
`#` `&` `;` `|` `*` `?` `~` `<` `>` `^` `(` `)` `[` `]` `{` `}` `$` `\\` `\x0A` `\xFF` `'` `"` ``` ` `
-
首先看题,接收一个host参数,值自定义,结合字符串经过md5加密后创建目录并切换至目录(这里其实就可以联想到写文件了,创建了目录就是来放东西的)
执行了nmap命令,这里构造payload利用了nmap中的-oG方法,可以实现将命令和结果写到文件
这里直接贴上payload并解析
?host=' <?php echo `cat /flag`;?> -oG test.php '
首先payload经过escapeshellarg()函数后会自动套上一对单引号并对内部单引号转义
即
''\'' <?php echo `cat /flag`;?> -oG test.php '\'''
最外层单引号是函数添加的
内部单引号被\转义,\也被添加上双引号
进入escapeshellcmd()函数后对\和不成对的单引号进行转义
''\\'' <?php echo `cat /flag`;?> -oG test.php '\\'''
这里单引号将payload分成了多份
'' \\ '' <?php......php '\\' ''
这样payload就不会被单引号包裹,可以正常执行命令了
值得注意的是,因为后端是linux系统,在linux中,\代表转义符,system执行命令的参数是string类型,转义了也能正常执行,没被单引号包裹的\\就是\,被单引号包裹的仍是\\
第二个值得注意的地方是:
最后的payload要加空格和'
不加空格最后文件名变为test.php\,会被解析为路径,test.php \后面的\会被忽略
不加单引号会变成test.php',都无法正常执行

4475

被折叠的 条评论
为什么被折叠?



