SQL注射原理超浓缩简单篇( 二 )


所以就得到我们看到的那个页面,对吗?”
欠钱:“很好!正是如此!SQL漏洞的起源就从这里开始了!注意到了吗?id的值是由我们提交的,但是它却没有做任何的检查,也就是我们提交的id可以是任意字符串 。假设我们提交一个单引号的话,SQL语句就会因为id=1’;而出错”
“等等,为什么加单引号会出错呢?”
“因为单引号在SQL语句里有特殊的含义,它只能以’abc’这样的方式出现,表示abc为一个字符串,如果只出现一个单引号,整个句子肯定会出错了 。”
“哦,那单引号和SQL注射有什么关系呢?”
“关系很密切,一般来说,常见的SQL语句有这么几种:
SELECT;*;FROM;[表];WHERE;id=12;这是数字型,12由我们提交
SELECT;*;FROM;[表];WHERE;name=’admin’;这是字符型,admin由我们提交
SELECT;*;FROM;[表];WHERE;key;like;‘%word%’;这是搜索型,word由我们提交
我们以第一种情况为例,假设我们提交;id=12;and;1=1,那么完整的SQL语句为:
SELECT;*;FROM;[表];WHERE;id=12;and;1=1
它并不出错,但是如果我们提交改为1=2,也就是
SELECT;*;FROM;[表];WHERE;id=12;and;1=2
此时注意到WHERE后面的条件,它要求存在一条记录,必须满足id=12,同时还要求1=2,由于1=2永远不成立,于是这个SQL语句尽管语法上没错误,可是搜索的结果却一定为空 。于是将提示我们找不到记录 。如图2 。”
阿剑剑:“我明白了,访问blog.asp的时候,我们提交的参数id为1,那么放到SQL语句里就变成了:
SELECT;*;FROM;[日记];WHERE;id=1
所以就得到我们看到的那个页面,对吗?”
欠钱:“很好!正是如此!SQL漏洞的起源就从这里开始了!注意到了吗?id的值是由我们提交的,但是它却没有做任何的检查,也就是我们提交的id可以是任意字符串 。假设我们提交一个单引号的话,SQL语句就会因为id=1’;而出错”
“等等,为什么加单引号会出错呢?”
“因为单引号在SQL语句里有特殊的含义,它只能以’abc’这样的方式出现,表示abc为一个字符串,如果只出现一个单引号,整个句子肯定会出错了 。”
“哦,那单引号和SQL注射有什么关系呢?”
“关系很密切,一般来说,常见的SQL语句有这么几种:
SELECT;*;FROM;[表];WHERE;id=12;这是数字型,12由我们提交
SELECT;*;FROM;[表];WHERE;name=’admin’;这是字符型,admin由我们提交
SELECT;*;FROM;[表];WHERE;key;like;‘%word%’;这是搜索型,word由我们提交
我们以第一种情况为例,假设我们提交;id=12;and;1=1,那么完整的SQL语句为:
SELECT;*;FROM;[表];WHERE;id=12;and;1=1
它并不出错,但是如果我们提交改为1=2,也就是
SELECT;*;FROM;[表];WHERE;id=12;and;1=2
此时注意到WHERE后面的条件,它要求存在一条记录,必须满足id=12,同时还要求1=2,由于1=2永远不成立,于是这个SQL语句尽管语法上没错误,可是搜索的结果却一定为空 。于是将提示我们找不到记录 。如图2 。”

阿剑剑想了一下:“这么说,为了不让SQL语句出错,那么我们在字符型SQL语句中,要提交的变量就应该是
admin’;and;‘1’=’1
然后补到完整的SQL语句中,就是
SELECT;*;FROM;[表];WHERE;name=’admin’;and;‘1’=’1’
而字符型则是
word%’;and;‘%’=’
补充到完整的SQL语句为:
SELECT;*;FROM;[表];WHERE;key;like;‘%word%’;and;‘%’=’%’

欠钱:“完全正确!这正是我们判断注射类型的方法!”
阿剑剑:“那我们怎么才能够得到数据库中的信息呢?”
欠钱:“最直接的方法自然是猜了,我们在提交的数据里加入一些其他的判断语句来代替and;1=1这样的条件 。以数字型SQL查询语句为例,我们提交一个id的值如下:

推荐阅读