web buuctf [GXYCTF2019]BabySQli1

知识点:联合注入(当联合查询不存在时,联合查询就会构造一个虚拟的数据)

1.尝试在用户和密码选项中分别进行注入,1' or '1=1'# ;1 or 1=1#;。。。都无法注入

2.再输入1',用户一栏存在报错,且输入为字符型,尝试报错注入,也不行(可以用bp的fuzz,效率高点,根据response,能够知道or和()都被过滤了);

3.级联注入:在用户栏输入1' union select 1,2#

报错Error: The used SELECT statements have a different number of columns,说明存在级联注入;select 1,报错,select 1,2,3报用户错误,说明里面的表是三列

4.利用bp抓包时,在response中存在注释

对注释进行解码,这个不是很明显,都试了试,通过base32解码得:

c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

一看就是base64,再解码,得:

select * from user where username = '$name'

说明后台得查询语句时通过name来返回值,再进行密码判断;怎么去绕过呢,因为用的是联合注入,联合查询的过程中如果没有会构造一个虚拟的数据,这样的话,再联合注入的过程中,重新给密码赋值,就可以绕过了。

5.尝试用户名admin(这个纯属习惯,本来就抱着试试的态度),结果提示wrong pass,说明name是admin

6.需要确定密码是哪一个字段,分别令name=1' union select 'admin',2,3#;name=1' union select 1,'admin'#,3可以看到第二个提示wrong pass,说明第二个字段是name,那第三个字段应该就是password

7.令name=1' union select 1,'admin','123'#;password=123,报错,wrong pass,说明思路没错,但是虚构的密码123和传参的123不同,因为虚构的123直接写入数据库,不好改动,说明传参的123在外面的函数有改动的过程,如果是加上不特定值等进行改动,这题就没法做了,所以应该是常规的加密md5,md5(123,32) = 202cb962ac59075b964b07152d234b70,所以令name=1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#;password=123(注:这里的name后面不能用admin' union..,因为用了admin,sql就会返回admin的正常密码而不是虚构的)

8.得到flag flag{d75b10c9-1123-429b-94f7-4d1b1bc345c3}

ps:我从github里面下出来源码,可以进行分析,和我做题分析的步骤基本是一致的

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

?>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值