zoukankan      html  css  js  c++  java
  • [SniperOJ](web) Inject again 注入 过滤左右括号 order by

    0x00 题目概述


    题目地址:http://web2.sniperoj.cn:10004/

    拿到题,尝试注入,发现有过滤。

    进行fuzz,发现过滤了 左右括号,分号,等号 ,还有一些查询关键字 。

    在username有盲注。

    为true时候返回 ‘admin’

    同时题目提示flag就为admin的密码。

    0X01 自己解题思路流程


    尝试联合查询   :   union select 1,2,3 #

    发现有回显。

    但是发现过滤了 'like' '=' 'where' 'username' 'password' 等一些关键字。

    无果。

    尝试盲注。

    1. 不含有左右括号的函数。 在网上只找到两个 @@datadir ,@@user

    没什么用。

    2. 尝试绕过过滤。编码绕过等等。无效。

    尝试把username构造成数组,看是否有有用的信息显示。得到如下。

    Warning:  strtolower() expects parameter 1 to be string, array given in/var/www/html/index.phpon line13

    Notice:  Array to string conversion in/var/www/html/index.phpon line22

    Flag is the password of admin!

    可知有一个 strtolower函数。但这些信息还是没有什么用。

    卡壳。

    想了挺久的,无果。

    0x02 正确的思路


    先按个人理解通俗介绍一下 order by 这个东西

    select bulabulabula 什么的 接一个 order by , order by 1 表示在查询这个表返回多行结果的时候,按第一列的字段开头的值进行排序。数字在前,然后过了是小写,再过了就是大写字母。

    order by 2 表示按第二列进行排序,从acsii小的值往上排序。如果只有两列,order by 3 则会报错,所以order by 也可以用来判断列的数量。

    贴图如下:

    表:

    order by 2 查询结果如下(即按照username开头的第一个值进行排序,如果第一个相同则比较第二个):

    好,上面的介绍只是对新手而言,对很多人来说都是废话。回到题目。

    这题我看了源码。相关的语句如下:

    过滤:

    function  filter($str){

    $filterlist = "/(|)|username|password|where|case|when|like|regexp|into|limit|=|for|;/";

    if(preg_match($filterlist,strtolower($str))){

    die("Go away!");

    }

    return $str;

    }

    查询部分:

    $sql = "select * from admin where  username ='$username' and password = '$password'";

    $res = $conn -> query($sql);

    返回结果的部分:

    if($res->num_rows>0){

    $row = $res -> fetch_assoc();

    if($row['id']){

    echo $row['username'];

    }

    }else{

    echo "The content in the password column is the flag!";

    }

    分析如下:

    进行查询,返回结果中 ‘username’ 这一列的值。

    paryload思路如下:

    我们先看一个在数据库中的查询的例子:

    这个查询,我们order by 3, 让查询结果 按照 password 进行排序。

    可以看到,admin1 的password 为 'admin1' ,是 ‘a’开头,然而我们union select 是 1,2,'0'  ,‘0’ 这个在‘a’ 的前面 ,这个返回  username 就是 我们的 2 了。

    改一下。

    ‘b’ 比 'a'大 ,在他后面,这个时候返回第一行 username 的值就为 'admin1'。

    那这题思路就很明显了。

    我们 order by 3 ,让他按照password 进行排列。 union 1,2,3  在3的位置进行爆破。返回值会有一个临界变化状态。

    一位一位来。

    大概意思是这样。

    0x03 脚本


    直接粘贴格式会乱。截图如下。

    运行结果截图:

     

    0x04 总结


    这题真挺有意思的 不看源码真写不出来 

    出题人思路很有新意,都没写过这种,点赞。(手动@王一航 大佬)

    怎么说,对order by 有了挺深刻的印象,收获颇丰。

    还是要好好看,好好学。

  • 相关阅读:
    文本比较算法Ⅳ——Nakatsu算法
    网游中,“时间停止的实现”的设想
    GDI+绘制自定义行距的文本(续)
    GDI+绘制自定义行距的文本的三种方法。
    文本比较算法Ⅱ——Needleman/Wunsch算法
    文本比较算法Ⅲ——计算文本的相似度
    javascript笔记:深入分析javascript里对象的创建(上)续篇
    java笔记:自己动手写javaEE框架(五)Spring事务管理学习
    java笔记:自己动手写javaEE框架(三)引入SQL监控技术P6spy
    java笔记:自己动手写javaEE框架(一)数据访问层DAO以及DAO的单元测试
  • 原文地址:https://www.cnblogs.com/deen-/p/7008939.html
Copyright © 2011-2022 走看看