一、SQL整数型注入
题目来源CTFHub
首先试出数据库有多少个字段,先输一个1试试
发现可以回显,再输一个2试试
发现仍然可以回显,再试一个3
发现不能正常回显,说明该数据库只有两个字段
接下来开始查询information_schema.schemata中数据库的名字
发现只回显出了一行数据,这时可以采用group_concat()使得查询出来的所有数据库名回显在一行上
这里要注意,使用union联合查询语句时,只有当前面的select语句不为真时,才会执行后面的语句,否则后面的语句不会执行。所以第一条select语句所查找的必须是数据库中不可能存在的项,比如id=-1或者99999
得到数据库名后发现,除了系统自带的数据库名之外,有一个特殊的数据库名,叫做sqli,那么接下来,我们就开始在这个sqli数据库中查找它的表名
接下来再在flag这个表里查找它的列名,即column_name
发现在flag这个表里,还有一个列也叫flag,继续查找这个flag
这样就得到了flag
二、SQL字符型注入
题目来源CTFHub
我们可以看到,字符型注入与整数型注入的区别就在于字符型注入在where后所添加的是字符串类型的数值。如果在单引号里再加一些其他的信息,那这些信息都会被归入到单引号里,就无法查询到数据。所以这时候要用到注释符,我们先自己再写一个单引号,把前面的那个单引号闭合掉,然后再加一个注释符,比如#,把后面的语句注释掉,这样就不会再执行它。
剩下的部分与整数型注入相同
还是先爆数据库名
再爆表名
再爆列名
最后爆flag
三、SQL报错注入
报错注入引用了Mysql中一个新的函数updatexml(),因为该函数具有报错功能,所以经常被应用在SQL注入当中。
题目来源CTFHub
先输入一个1试一下,发现它没有回显数据,只是告诉我们查询正确。
通过id=1知道使用的是整数型。
这时我们使用上面提到的函数updaterxml()来进行报错注入。它有两种写法,第一种是直接在条件查询语句后面写and updatexml() ,另一种写法如下图所示
发现回显的数据明显没有给全,这时我们需要使用字符截取函数,比如substr(字符串,起始位置,截取长度)或者mid(字符串,起始位置,截取长度)
这里要注意,1代表的就是字符串的第一位,而不是第二位
找到数据库名sqli后再按照之前的类似过程继续,不过这里需要不断修改截取长度直到找到所需数据
找到之后再继续找列名,使用类似方法
最后爆flag,将每次找到的截取片段记下来,最后拼接到一起得到flag
四、SQL布尔盲注
这类的查询结果并不会返回数据,只会告诉你查询成不成功,就像这样
之后我们可以看一下是整数型注入还是字符型注入
这就排除了字符型注入。也说明这种注入方法就是如果为真就返回成功,反之就返回错误。所以人工解决这种问题,基本就靠猜,通过不断尝试,可以得到正确结果。
如果想简化工作量,可以使用脚本,将“猜”这个工作交给电脑。
五、时间盲注
这一类连返回成功与否都不会回显,但也属于通过执行一些能够让我们判断相关信息的函数来达到猜信息的目的的类型。在Mysql数据库系统当中存在一个sleep()函数,当你调用它的时候,系统会休眠对应参数时间的秒数。也就是说,返回成功与返回失败所需要的时间不同,我们可以通过所花费的时间的差别来判断是否返回成功。
同样,为了避免过大的工作量,可以通过手写脚本来解决此类问题。