感觉好像都很简单,看来需要合并来写了,之前不知道有没有写过数字型
和字符型
的区别,趁这个机会来写下吧。
首先说下什么是数字型,想弄清楚到底是什么型的,那么就得通过select
语句来进行判断,比如下面这条语句
select username from user where id=xxx
对于网站来讲,我们能够控制的参数就是xxx
了,如果xxx
传入去能够成功执行的语句那就是好语句,假设xxx
现在为123
,那么现在的语句就变成了
select username from user where id=123
这样是没有问题的,如果我们想执行一些其它语句的时候,比如and 1=1
,那么我们传入的xxx
则为123 and 1=1
,整条查询语句为
select username from user where id=123 and 1=1
这样来看,同样也可以成功执行,那么我们可以称为这样的叫做数字型
的注入
那什么样子的叫做字形符
注入呢?假如我们传入的参数不是数字,而是一个字符串,比如admin
,那么select
语句就会变成这样
select username from user where id=admin
这个时候明显就会报错,在sql
中字符串应该要被单引号或者双引号给闭合起来声明为字符串的,于是网站在给数据库传入sql
的时候就会构选成类似这样的
select username from user where id="xxx"
那我们来看看,如果仍然想去执行and 1=1
,那么就应该传入admin and 1=1
,此时语句变成
select username from user where id="admin and 1=1"
数据库此时接收到语句后会把admin and 1=1
当作是一个查询条件,而不会进行逻辑判断,正确的语句应该是这样
select username from user where id="admin" and 1=1
只有是这样了,语句才能够成功执行,那么问题来了,我们应该传入admin" and 1=1
吗,对的,不过还有注意一下,如果我们直接传入,语句变成下面的情况
select username from user where id="admin" and 1=1"
你就会发现多了一个"
,此时就会报错。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"' at line 1
他会告诉你多了一个"
,那这个时候咋办呢,没错,就是注释,我们可以采用注释把最后多的"
注释掉即可,所以这时候我们可以传入admin and 1=1 #
,此时语句就会变成
select username from user where id="admin" and 1=1#"
这个时候语句就可以正常执行了,这种我们需要加上单引号或者双引号或者括号等闭合符号的注入称为字符型
注入。
那么有些小机灵鬼就会想,哦,简单来说,传入数字的就是数字型
注入,传入字符串的就是字符型
注入呗,不,这也不一定,比如看下面这条语句
select username from user where id='1'
有些网站也会故意在id
后面加入闭合条件,虽然传入的都是数字,但是此时也为字符型
注入,实战中具体怎么判断下面接着讲。
/bug/sql_injection/sql_num.php
其实从上面语句都告诉我们了,这里就非常简单了,你可以先1 and 1=1
再1 and 1=2
来判断页面是否有变化,如果有变化那么肯定就是数字型
注入,如果没有变化还说不准,可能没注入也可能有盲注(啥,什么是盲注,点我吧)。
可以看到1 and 1=2
的时候,数据就没有了。所以这里是有数字型
注入了。
哦,如果and
被过滤了不让用咋办,你可以使用or
或xor
来进行判断,还可以使用运算符来判断 ,比如1 + 1
你会发现,数据和id=1
的时候不一样,因为此时1+1
当作2
来运算了。
/bug/sql_injection/sql_string.php
这个都不用多说啦,看到了前面的这个都应该懂了,这里说下,注释除了用#
还可以用-- x
的,嗯,不用打x
也行,看编码方式,所以有时候打%23
有时候打--+
其实就是#
和-- x
,可以看SQL注入时不能用#号的原因,走一波
哈哈,这样都是没有问题的,行了,先这样。