刷题[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\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!");
		}
	}
}

?>

其中这一句

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注入
posted @ 2020-08-04 10:19  kar3a  阅读(180)  评论(0编辑  收藏  举报