注入过程
1.判断注入类型
利用语句1 and 1=1和1 and 1=2以及1' and 1=1%23和1' and 1=2%23进行判断
数字型:1 and 1=1和1 and 1=2返回值不同
字符型:1' and 1=1%23和1' and 1=2%23返回值不同
由试验可知1' and 1=1%23和1' and 1=2%23返回值不同,故本题为字符型盲注
2.获取数据库长度
使用 length( ) 函数获取数据库长度
当等于8的时候页面有返回,等于其他数字的时候页面没有返回,因此,我们可以确定此数据库长度等于8
3.获取数据库名
使用substr()函数
substr(string,start,length)string是要截取的字符串,start是从哪开始,length是截取的长度
注:MySQL中start从1开始
由上一步可知,数据库长度为8,所以需要逐字解析
因已知该数据名为security,故第一位尝试s正确,第二位尝试e正确,而在正常SQL注入中,我们需要逐字解析,需要注意的是数据库名的命名规则,通常由26个英文字母(区分大小写)和0-9的自然数加上下划线组成,多个单词用下划线隔开,除此之外,还可以把要猜解的内容转换为ASCII码值,然后使用ASCII函数,ASCII码对照表https://tool.oschina.net/commons?type=4,但一个个进行尝试过于麻烦,此时,可以用bp进行爆破,从33到126进行枚举,使用集束炸弹模式,如本题对string处和ASCII码值处添加§,前者添加0-9,后者添加33-126.
如图,s对应的ASCII码值为115,故有返回
对请求包进行抓包
使用集束炸弹模式进行爆破
由爆破结果并对应ASCII表可知,数据库名为security
4.获取表名
(1)获取表的数量
使用count函数,具体语法格式如下图
由页面回显可知表数为4
(2)获取表的长度
获取数据库长度
可知表长为6
(3)获取表名
大致过程同获取数据库名,但需要注意的是若直接执行无返回,这是因为返回了多行会出现错误,此时需要加入limit来控制输出
想要让其一行一行输出,只需在后面添加limit 0,1即可,如果要获取第二个表,则把limit后的0换成1,第三个表则改为2
然后依次改变substr函数中的start即可,本题中对应的则是第一个1.
5.获取列名
具体方法参考获取表名
(1)获取表中列数
可知列数为2
(2)获取列名长度
可知列长为2
(3)获取列名
由爆破结果并对照ASCII码表可知列名为id
6.获取记录
(1)获取记录数
记录数为8
(2)获取记录长度
记录长度为1
(3) 获取记录具体内容
若要获取其他表记录,改变limit后的值即可,如获取第二个记录
对照ASCII表可知,记录为3