目录:
这是一篇饱含私心的文章,从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:
- 《逻辑十九讲》
- “心智工具箱”