美文网首页
从代码角度谈谈演绎推理

从代码角度谈谈演绎推理

作者: fatfatEddy | 来源:发表于2017-02-25 14:07 被阅读18次

    目录:


    这是一篇饱含私心的文章,从web安全学习中去理解演绎推理。



    推理的过程

    逻辑学家在人类有限的认知领域里做出了最简洁、准确的描述:推理的四个步骤:抽象、概括、判断、推理;

    推理的两个种类:归纳推理和演绎推理;他们之间相互独立又相互依赖 ---《逻辑十九讲》


    演绎推理

    演绎推理重在一个分析的过程。

    在web安全学习中,跟着视频教程进行靶机的训练时,总感觉有些步骤不是很理解。

    就像是你到了一个新大楼里,从1楼直接从了升降梯(教程)到了5楼,当中有很多楼层,还没亲自走楼梯一步步去认识一遍,所以总感觉没有全懂,有点云里雾里的感觉。

    如果试着,自己从头到尾去走一遍,会发现很多原来不清楚的地方慢慢地明晰了起来,有种“柳暗花明又一村”的感觉。


    而这自己走楼梯的过程当中涉及到了两个点:

    • 分析
    • 提取知识的必要难度

    分析

    先来谈谈分析过程。

    在web安全学习时,学习SQL注入知识点的时候,自己给自己提出了一个问题:“有多少种SQL 注入类型?为什么会分成这3类?是依据什么分类的?”

    我用了分析去解决了自己的疑问。

    分析过程:

    • 黑盒测试看一遍
    • 白盒测试看一遍(源码&后台数据库的实际运行)

    有多少种SQL 注入类型?

    有3种:

    • 1.基于报错注入
    • 2.基于时间盲注
    • 3.基于布尔盲注

    为什么会分成这3类?

    首先要存在注入点,然后依据服务器返回的信息可以分成3类,而服务器返回的信息又基于其源码。

    换句话说,基于报错、时间盲注、布尔盲注都是要看源码中的代码怎么写,然后服务器才会根据源码返回给你不同的信息。

    通过它返回不同的信息:1返回错误 2只返回两个界面 3 均不返回,再进行相应的操作。



    1.基于报错注入

    // connectivity 
    $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    
    if($row)
     {
        echo "<font size='5' color= '#99FF00'>";
        echo 'Your Login name:'. $row['username'];
        echo "<br>";
        echo 'Your Password:' .$row['password'];
        echo "</font>";
        }
        else 
        {
        echo '<font color= "#FFFF00">';
        print_r(mysql_error());
        echo "</font>";  
        }
    

    网页前端接受用户的输入,然后送到后台数据库查询,如果查询得到结果,就返回你的用户名和密码此类信息,如果查询不到结果,就报出数据库的错误。

    关键句:print_r(mysql_error());
    mysql_error():返回上一个 MySQL 函数的错误文本,如果没有出错则返回 ''(空字符串)

    用户将构造自己的数据流提交给后台,后台经过数据库查询,如果程序将用户的输入流拼接后,导致查询错误,此时因为源码中有print_r(mysql_error());,所以会一览无余的将错误返回给用户。

    这个情况下,对用户是比较友好的,因为每次输入是否有错,你都可以第一时间知道。


    2.基于布尔盲注

    // connectivity 
    
    
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    
        if($row)
        {
        echo '<font size="5" color="#FFFF00">'; 
        echo 'You are in...........';
        echo "<br>";
            echo "</font>";
        }
        else 
        {
        
        echo '<font size="5" color="#FFFF00">';
        
        echo "</br></font>";    
        echo '<font color= "#0000ff" font size= 3>';    
        
        }
        
    

    如果查到数据,就返回A页面,如果没有查询到数据就返回B页面。
    只能通过测试语句的true 和FALSE 来判断,并一步步得到数据库的信息。

    这种情况,比基于错误获得的反馈信息要更少,因为源码没有将error详细输出,有无错只是一个页面的差异。
    但是还是给了用户反馈信息,只是反馈信息比较单一,只有TRUE或FALSE ;


    3.基于时间盲注

    // connectivity 
    
    
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    
        if($row)
        {
        echo '<font size="5" color="#FFFF00">'; 
        echo 'You are in...........';
        echo "<br>";
            echo "</font>";
        }
        else 
        {
        
        echo '<font size="5" color="#FFFF00">';
        echo 'You are in...........';
    
        echo "</br></font>";    
        echo '<font color= "#0000ff" font size= 3>';    
        
        }
    

    不管后台是否查到数据,web页面的返回值只有一种,所以可以通过MySQL中的sleep()时间函数去判断注入的语句是否正确,以此慢慢爆出数据库的信息。


    它的本质是什么?

    一句话:SQL注入类型分类的本质源于源代码,就看源代码怎么写的。

    web页面的返回信息的情况有3种:

    • web页面的返回值多样,报出详细错误信息(基于错误)
    • web页面的返回值只有两种(基于布尔盲注)
    • web页面的返回值只有一种(基于时间盲注)

    我们再因地制宜,一步步爆出数据库信息。


    提取知识的必要难度

    之前看到“心智工具箱”了解到了一个概念:提取知识的必要难度。

    大概意思就是说,在上课的时候,不要第一时间做笔记,就算记得很详细,过后你也会遗忘很多的,因为你的提取知识的必要难度很低。

    要过一段时间后,通过自己的思考和回忆,再去整理笔记,这样提取知识的必要难度会大大增加,因此你对于知识的掌握和记忆会比前一种更深。

    同理,我们如果跟着教程,看一下,暂停一下,一步一步跟着教程做的话,提取知识的必要难度就会很低,因为很多步骤我不知道为什么要这么做,为什么不那样做,所以如果跟着教程做了一遍后,就应该自己从头到尾脱离教程,调试一遍。


    这样才能提高提取知识的必要难度,能达到一个更好的学习效果。


    参考list:

    • 《逻辑十九讲》
    • “心智工具箱”

    相关文章

      网友评论

          本文标题:从代码角度谈谈演绎推理

          本文链接:https://www.haomeiwen.com/subject/bvzgwttx.html