不同参数类型下的sql注入

一、三种参数类型

数字型:

1
2
3
$id=$_GET['x'];
...
$sql="select * from news where id = $id";

字符型:

1
2
3
$username=$_GET['user'];
...
$sql="select * from user where username = '$username'";

搜索型:

1
2
3
$username=$_GET['user'];
...
$sql="select * from user where username like '%$username%'";

二、字符型单引号干扰

字符型参数注入中,存在单引号的干扰,下面解释一下干扰的形成原因。

上述代码在拼接sql语句的时候,由于字符串在sql语句中要用单引号括起来,因此强制给传入的参数加上了单引号,

2.1、正常情况

user=root

sql语句为:select * from user where username = 'root'

2.2、注入语句受到干扰的情况

user=root and order by 4

sql语句为:select * from user where username = 'root and order by 4'

注入语句被当成字符串处理,无法正确执行。

2.3、排除干扰时的情况

2.3.1、方法一

user = root' and order by 4 and '1'='1

sql语句为:select * from user where username = 'root' and order by 4 and '1'='1'

思路就是在注入语句正常传递的参数后面添加单引号,提前闭合代码中强制添加的单引号,并在注入语句后构造一个无意义的语句闭合剩下的后单引号。

2.3.2、方法二

user = root' and order by 4 #

sql语句为:select * from user where username = 'root' and order by 4 #'

思路就是在注入语句正常传递的参数后面添加单引号,提前闭合代码中强制添加的单引号,并在注入语句后添加#号,强行截断后面的内容。此方法有时管用有时不管用。

三、搜索型百分号与单引号干扰

搜索型语句会在用'%xxx%'将参数括起来,因此在sql注入时要排除干扰。

user = root%' and order by 4 '%

sql语句为:select * from user like username = '%root%' and order by 4 '%%'

文章作者: TechOtaku
文章链接: http://techotaku.me/2018/08/01/不同参数类型下的sql注入/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 徒然の博客