小菜鸟学黑客(1)php篇
我们的问题:为什么在测试php网站是否有漏洞的时候会需要在末尾加一个 and 1=1提交后,再输入一个and 1=2进行提交呢? 下面我们来看一下PHP程序中最典型的注射漏洞代码,如下所示: $id=$_GET[id]; $query=SELECT * FROM my_table where id='.$id.'; //很经典
我们的问题:为什么在测试php网站是否有漏洞的时候会需要在末尾加一个 and 1=1提交后,再输入一个and 1=2进行提交呢?
下面我们来看一下PHP程序中最典型的注射漏洞代码,如下所示:
$id=$_GET["id"];
$query="SELECT * FROM my_table where id='".$id."'"; //很经典的SQL注入漏洞
$result=mysql_query($query);
参数$id通过$_GET方式访问表单域id中的内容,利用它可以获得我们输入id参数的值。而$id在没有经过任何过滤情况下,就用字符串连接符(.)连接到了数据库查询代码中,然后就执行了数据库查询。所以对于参数id我们可以构造任何数据,从而出现了经典的注射漏洞。
我们已经知道,在PHP中目前获得客户端输入的数据不仅仅只有$_GET这一种方式。还可以采用$_POST和$_REQUEST方式获得数据,所以对于上面的$id=$_GET["id"];还可以改成$id=$_POST["id"];或$id=$_REQUEST["id"];,不过他们依然存在注射漏洞,只是获取客户端数据的方式不同而已。
这里,我们假设参数id的正确值为10。当我们只提交id=10时,查询语句$query就等于SELECT * FROM my_table where id=10,执行结果就是返回id=10所包含的信息。当然,我们当然不会那么听话,只输入id=10。比如我们输入id=10',则$query就等于SELECT * FROM my_table where id=10'。因为我们知道在数据库中的参数id是不可能有一个10’的值,所以执行的结果肯定出错,这也是为什么如果存在注入漏洞的时候我们输入单引号页面就会返回错误的原因,这个时候就可以初步判定它存在注入漏洞。而如果我们输入id=10 and 1=1的话,则$query就等于SELECT * FROM my_table where id=10 and 1=1,前面大家已经知道了and的运算规则了,因为SELECT * FROM my_table where id=10执行的结果为真,1=1也为真,那么真 and 真运算之后还是为真,所以添加输入and 1=1返回的结果依然为真。可是我们输入id=10 and 1=2呢?$query就等于SELECT * FROM my_table where id=10 and 1=2,因为SELECT * FROM my_table where id=10为真,1=2为假,即真 and 假,所以执行的结果为假。这也是为什么添加输入and 1=2返回的结果为错误的原因。所以通过单引号、and 1=1、and 1=2我们就可以判断一个网站是否存在注射漏洞。