简单判断是否存在SQL注入

单引号判断

$id参数左右有数字型(无)、单引号、双引号、括号等方式组成闭合;

最为经典的==单引号判断法:==在参数后面加上单引号’比如:

 http://xxx/abc.php?id=1'

  如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为

单引号个数不匹配

而报错。

万能语句:

如果我们传入的 username 为 1’ or 1=1 #,随意输入 password,那么传入后端验证时,sql语句就是

*%23为#注释符的url编码*

select * from table_name where username='1' or 1=1 # ' and password='xxxxxx'

通常 Sql 注入漏洞分为 2 种类型:

  数字型

  字符型

数字型判断:

  当输入的参 x 为整型时,通常 123.php 中 Sql 语句类型大致如下:

select * from <表名> where id = x 
    这种类型可以使用经典的 and 1=1and 1=2 来判断:

  Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。(说明sql语句执行了,语句语法及逻辑判断正确,因此不报错)

  Url 地址中继续输入

http://xxx/abc.php?id= x **and 1=2**

页面运行错误,则说明此 Sql 注入为数字型注入。

语句解释

当输入 and 1=1时,后台执行 Sql 语句:

  select * from <表名> where id = x and 1=1

  当输入 and 1=2时,后台执行 Sql 语句:

  select * from <表名> where id = x and 1=2

  没有语法错误但是逻辑判断为假,所以返回错误。

我们再使用==假设法:==如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

  select * from <表名> where id = 'x **and 1=1**' select * from <表名> where id = 'x **and 1=2**'

  查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

字符型判断:

  当输入的参 x 为字符型时,通常 123.php 中 SQL 语句类型大致如下: select * from <表名> where id = ‘x’ 这种类型我们同样可以使用 and ‘1’=’1and ‘1’=’2来判断:

  Url 地址中输入 http://xxx/abc.php?id= x**' and '1'='1**

页面运行正常,继续进行下一步。

  Url 地址中继续输入 http://xxx/abc.php?id= x**' and '1'='2**

页面运行错误,则说明此 Sql 注入为字符型注入。

语句解释

‘ 的作用是使语句闭合,否则整个语句将被当作字符串处理