从代码角度谈谈演绎推理

目录:

从代码角度谈谈演绎推理_第1张图片

这是一篇饱含私心的文章,从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 "";
    echo 'Your Login name:'. $row['username'];
    echo "
"; echo 'Your Password:' .$row['password']; echo "
"; } else { echo ''; print_r(mysql_error()); echo ""; }

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

关键句: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 ''; 
    echo 'You are in...........';
    echo "
"; echo "
"; } else { echo ''; echo "
"; echo ''; }

如果查到数据,就返回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 ''; 
    echo 'You are in...........';
    echo "
"; echo "
"; } else { echo ''; echo 'You are in...........'; echo "
"; echo ''; }

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


它的本质是什么?

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

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

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

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


提取知识的必要难度

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

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

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

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


从代码角度谈谈演绎推理_第2张图片

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


参考list:

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

你可能感兴趣的:(从代码角度谈谈演绎推理)