addslashes()
函数是 PHP 中用于在字符串中的特定字符前添加反斜杠 \
的函数。它通常用于准备字符串,以防止其中的字符被误解为具有特殊含义的字符。这个函数的主要用途是在构建 SQL 查询语句或其他需要转义特殊字符的上下文中,以防范一些安全问题,比如 SQL 注入。
<?php
$a = '"zx'; #对"
$b = "'zx"; #对'
$c = "\zx"; #对\
$d = "\\0zx"; #null(\0在ascii码中为null第一个\用来转义第二个\)
echo addslashes($a),"\n";
echo addslashes($b)."\n";
echo addslashes($c)."\n";
echo $d."\n";
echo addslashes($d)."\n";
?>
\"zx
\'zx
\\zx
\0zx
\\0zx
从上面我们可以知道addslashes()函数对于特定字符“ ‘ \ NULL的处理
以[CISCN2019 总决赛 Day2 Web1]Easyweb举例
这里扫描目录发现*.php.bak在对页面查看源码发现image.php,尝试image.php.bak下载源码
<?php
include "config.php";$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";$id=addslashes($id);
$path=addslashes($path);$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);
?>
这里我们发现通过str_replace对\\0 %00 \' ' 替换为空
id的闭合为’
根据上面当id=\\0,传递后为\0通过addslashes()函数变成\\0
我们的值为\\0,但是真正赋值为\0(第一个\为转义符)
addslashes()处理因为这里的id值已经有转义符了所以不会进行处理值为为\\0
在
str_replace()中表示匹配\0(第一个为转义)
这里会匹配\0替换为空最后的值为\在语句中就是\'转义了'