#演示:pikachu—SQL-Inject-字符型注入#
我们选择字符型注入,随便输入一个值,kobe
它告诉我们uid和email,当我们输入不存在的时候,111,它会提示我们
username不存在,这是个正常的功能 ,我们看到它是在url里面提交的,是个get请求
我们猜想一下后台是怎么运行的,它这个地方,让我们输入名字,名字一般是字符串
在后台,肯定是到数据库查询,
select 字段1,字段2 from 表名 where username='kobe';
其实这个username不一定是叫username,我们在这里假设,叫username
字符串不打单引号是会报错的,我们可以在数据库看一眼,
select id,email from member where username=kobe;
会报错,因为字符串要用单引号和双引号来做处理的,
select id,email from member where username='kobe';
会查询出对应的信息,我们查询出来拼接的是字符串的话,我们可以猜想到,它后端去拼接sql的时候,肯定是用单引号做处理的
通过$_GET获取到我们的输入,把这个输入赋值给一个变量,
$uname=$_GET['username']
所以说,我们在构建测试payload的时候,没有考虑到单引号,是有问题的,
kobe or 1=1
我们这样去测,是没有效果的,点查询
显示我们指定的用户不存在,因为这一整个整体,都会被当作字符串,当作用户名查询,这个用户名是不存在的,其实跟我们讲的xss逻辑差不多,也就是我们要构造闭合,构造合法的sql语句,来绕过后台来执行,
kobe' or 1=1#
用单引号是为了闭合前面的单引号,然后在or 1=1,后面还有一个单引号,我们可以通过数据库里面的注释,把它注释掉,在mysql里面,可以通过#,–来把后面的东西注释掉
我们把它拼接进去,这一整段,就会变成
select 字段1,字段2 from 表名 where username='kobe' or 1=1#';
我们测试一下payload,点查询
就直接把数据库表里面的东西给遍历出来了,当然,我们在url提交的话,我们的payload要做url编码
我们来看一下后端的代码
获取前端输进来的name,在构造sql语句的时候,直接username等于字符串,因为是字符串,所以用单引号做处理,然后拼接进去,跟我们之前讲数字型一样,唯一的区别是,在拼接变量的时候,用了一个字符串,用单引号把它做为一个字符串,所以在这种类型下,出现的注入,我们认为是字符型注入