前言:之前对联合查询,报错注入、布尔盲注、延迟注入。对这几种类型模糊不定,我也查阅了一些资料,做了一点总结,希望对大家有帮助!
对于SELECT语句,我们通常分其为两种情况:有回显和无回显。
有回显
什么是有回显?我们举个例子当我们看到一个url结尾是?id=1时,我们可以猜想到select * from articles where id=’$id
这时候页面将SQL语句返回的内容显示在了页面中(本例中是标题、内容、作者等信息),这种情况就叫有回显
对于有回显我们通常用:联合查询注入法
联合查询注入
其作用就是,在原来查询条件的基础上,通过系统关键字union从而拼接上我们自己的select语句,后个select得到的结果将拼接到前个select的结果后边。如:前个select得到2条数据,后个select得到1条数据,那么后个select的数据将作为第3条拼接到第一个select返回的内容中,其字段名将按照位置关系进行继承。
例如:如:正常查询语句 union select columns_name from (database.)table_name where condition
这里需要注意的是:
1.若回显仅支持一行数据的话,记得让前边正常的查询语句返回的结果为空
2.使用union select进行拼接时,注意前后两个select语句的返回的字段数必须相同,否则无法拼接
无回显
什么叫无回?如果SQL语句存在返回的数据,那么页面输出为success,若不存在返回的数据,则输出fail
与有回显情况不同的是:无回显的页面输出内容并不是SQL语句返回的内容
对于无回显的情况,我们通常可用两种方法进行注入:报错注入与盲注
报错注入
什么是报错注入,简单的说,就是有些特殊的函数,会在其报错信息里可能会返回其参数的值。
我们可以利用这一特性,在其参数放入我们想要得到的数据,通常使用子查询的方法实现,最后让其报错并输出结果。
盲注
若网站设置了无报错信息返回,那么在不直接返回数据+不返回报错信息的情况下,盲注便几乎成了最后一种直接注入取数据的方法了。
盲注分成布尔盲注和延迟盲注。
布尔盲注
对于布尔盲注来说,其使用的场景在于:对真/假条件返回的内容很容易区分。
比如说,有这么一条正常的select语句,我们再起where条件后边加上and 1=2,我们知道,1永远不等于2,那么这个条件就是一个永假条件,我们使用and语句连上,那么整个where部分就是永假的,这时候select语句是不会返回内容的。将其返回的内容与正常页面进行对比,如果很容易区分的话,那么布尔盲注试用。
如:正常语句 (where | and) if(substr((select password from users where username=‘admin’),1,1)=‘a’,1,0)
延迟盲注
相比较于布尔盲注,时间盲注依赖于通过页面返回的延迟时间来判断条件是否正确。
使用场景:布尔盲注永假条件所返回的内容与正常语句返回的内容很接近/相同,无法判断情况。
简单的来说,时间盲注就是,如果我们自定义的条件为假的话,我们让其0延迟通过,如果条件为真的话,使用sleep()等函数,让sql语句的返回产生延迟。
如:正常语句(where | and)if(substr((select password from users where username=‘admin’),1,1)=‘a’,sleep(3),1)
最后总结一下:常见注入方法有四种:联合查询注入、报错注入、布尔盲注、延迟盲注,其中:
有回显:四种均可使用,推荐使用联合查询注入。
无回显:报错注入+盲注可用。
对于时间成本来说:联合查询注入<报错注入<<布尔盲注<延迟盲注。
通常情况下,盲注需要一个一个字符的进行判断。这极大的增加了时间成本,况且对于时间盲注来说,还需要额外的延迟时间来作为判断的标准。
最后附一张简单逻辑图方便大家理解: