小菜鸟学黑客(1)php篇

本文详细解释了如何通过在测试PHP网站时输入单引号、and1=1和and1=2来判断是否存在SQL注入漏洞,深入分析了PHP程序中最常见的SQL注入代码实例,并阐述了注入漏洞产生的原因及检测过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们的问题:为什么在测试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我们就可以判断一个网站是否存在注射漏洞。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值