最好的黑客用自己的创意找到漏洞。他们没有约束的漏洞类型,他们已经知道如何找到。这往往是指一个黑客链在一起看似很小的漏洞变成大。这篇文章会给你关于如何注入漏洞的工作更多的见解,以及你可以如何利用知识发现更多的错误。 注入漏洞来自不消毒或完全unsanitized输入。为了证明这些类型的漏洞,这篇文章将集中在一个著名的漏洞类型:SQL注入。当一个黑客利用SQL注入,注入任意SQL命令来提取数据,读取文件,甚至把它升级到一个远程执行代码(RCE)。 当你测试注入漏洞的应用程序,你应该注意你的输入和结果如何,无论你是在响应中返回。这听起来很模糊,所以让我们给你一个例子。想象一下,一个网页,需要数字ID是一个参数。你可以开始打探它提交非数字值。关注服务器如何响应。有没有错误?如果是这样,什么样的错误?没有错误显示一些关于建筑,还是发现有严格的数值验证的参数?有什么指示可能导致注入漏洞?在第一个异常检测的重点,然后找出如何利用它。收集尽可能多的信息,并尝试许多不同的方法来了解如何在页面代码工作。如果不立即工作,把它记到回来以后。 让我们深入对SQL注入来帮助你理解注入漏洞都是关于。对于这个概念的缘故,假装我们建立了一个应用程序称为“名API”。它需要一个MySQL服务器,其中一个PHP脚本连接。只有一个数据库中的表,这是所谓的“名字”。由于一些未知的原因,它跟踪一个人的名字和IP地址。IP地址是保密的,不应该被公开的互联网。应用程序已被部署到Internet可访问HTTPS:/ /名称API。和表的内容结构看起来像这样: 应用程序的index.php的内容看起来像这样:
<?PHP / /连接到本地主机无密码的根,幸运的是,3306是防火墙… 连接= mysql_connect美元(“localhost”,“根”,“”); mysql_select_db(合连接,“names_api”); / /拿记录表,但由于用户的IP地址是秘密, / /让我们只能选择名黑客将永远无法看到这! 为查询= mysql_query(“选择的名字从名字id是_get美元[ 'id' ]”); //确保记录被发现 如果(mysql_num_rows($查询)= = 1){ 对象= mysql_fetch_assoc美元($查询); //返回给用户的名称 echo $对象[ 'name' ]; }如果用户可以访问HTTPS:/ /名称API /?ID = 1,服务器会回应“大餐”。你有没有发现漏洞了吗?如果你看到代码很简单。当一个用户要正确使用该应用程序,它会通过ID到页面的ID参数。它会查找数据库中的记录,并归还属于记录的名称。但如果你想进入“和”的ID,如https:///?ID =,,查询会执行这个样子:
选择名称和id是
如果你熟悉MySQL,你可以猜到发生了什么:这不是一个有效的SQL查询,因为“和”是SQL中的保留关键字。让我们看看我们是否能证明这里的SQL注入。我们知道,如果我们去HTTPS:/ /名称API /?ID = 1,叫“饭”,返回。现在,如果你想去HTTPS:/ /名称API /?ID = 1 + 1 = 1,页面仍然会返回“大餐”。查询是在后台执行,看起来像这样:
选择的ID = 1和1 = 1
此查询大致翻译:给我有列ID 1和1等于1行的名称列。这意味着,ID为1的行返回自1总是等于1,因此可以忽略不计,这将导致“餐”记录被返回。如果你现在就去HTTPS:/ /名称API /?ID = 1 + 1 = 0下面的查询将被执行:
选择的名字从姓名ID = 1和1 = 0
你可能已经猜到这个地方去。此查询大致翻译:给我有列ID 1和1等于0行的名称列。让我们看看最后一部分:1 = 0。这永远不成立,这意味着不会有任何返回的行。期。这证明了我们可以更改查询的行为。这已经是一个很好的发现,但这是异常。让我们深入一点,看看我们能不能从表中提取秘密IP地址:欢迎光临联盟!工会基本上是一个额外的查询结果追加到查询结果的前。给你的感觉是什么样子,这是一个联盟的SELECT语句和SQL查询的结果:
选择ID,从名字id是1联盟选择ID的名字,名字从名字id是2
第一个SQL查询,选择ID,从名字id是1名,导致在第一排:餐。第二查询,选择ID,从名字id是2名,导致第二行:fransrosen。让我们看看我们是否可以注入联盟选择到命名的API应用程序:HTTPS:/ /名称API /?ID = 1 +协会+选择+姓名+姓名+,+ + ID = 2。请求这个页面的结果在SQL查询上面这段和2列的结果。然而,由于代码只读取第一行,“餐”返回。让我们做一个小小的改变:不是取ID 1为第一次查询,取一个编号,表中不存在。请求HTTPS:/ /命名API /?ID = 1 +协会+选择+姓名+ from_names + + ID = 2将“fransrosen“因为查询的第一部分将不会返回任何结果。现在,这并不显得非常糟糕,因为我们从表中看到,可无论如何选择其他记录。然而,这是很有趣的部分:你可以使用子查询从表中提取数据的秘密。考虑下面的URL:HTTPS:/ /命名API /?ID = 1 +协会+选择+ 0,(选择+ + +姓名+ ip_address + ID = 1)。这将执行以下查询:
选择ID,从名字id是1会选择0名,(选择ip_address从名称ID = 1)
子查询将返回一个非坚持设置为0的ID记录,和名称列设置为子查询的结果(选择ip_address从名称ID = 1),将包含秘密的IP地址存储在数据库中。获取URL的结果”1.3.3.7”是由服务器返回的。 |
|