sql注入
当前后端存在数据库交互时,在前端通过拼接字符串来构造出sql语句,传到后端能让服务器成功执行的行为叫做sql注入。
sql注入的类型有很多,按注入点类型可以分为字符型、数字型等等;按利用方式又可以分为联合查询注入、报错注入、布尔盲注、时间盲注等等;按传参方式又可以分为GET注入、POST注入、HTTP头部注入等等。本文将通过sqli-labs的各个关卡的演示来解释不同注入类型的不同利用手法。
sqli-labs1 联合查询
在页面分别输入?id=1和?id=2能看到页面返回的结果是不同的,说明这里可能存在注入点 。
输入1'发现页面会有MySQL报错,基本确认存在注入点。
1' and '1' = '1 判断出是字符型注入(判断数字型可以通过写一个运算式如id=3-1,通过观察其是否回显id=2的页面来判断是否为数字型)。
通过报错信息使用注释将注入点闭合
order by 试出有3个字段(order by 能确认当前表有几个字段,当输入4时报错了,说明有3个字段)。
select 1,2,3 发现只有2和3是回显的,所以后面可以利用2,3字段来回显自己想查询的结果,这里必须让前面的id值无法查询到,否则只会返回前面的值。
利用union查询当前数据库的名称为'security'
利用information_schema数据库来查看当前数据库有哪些表,group_concat函数的作用是将查询到的结果以逗号分隔的形式一行输出,这是因为当前页面只能回显一行,而sql查询是按列表的形式输出查询结果,会导致只能输出第一行的数据。
接着查询出字段
最后查询username和password字段拿到这个表的数据
sqli-labs5 布尔盲注
同样寻找注入点,发现输入不同的id值返回的页面都是“you are in” 。
但是经过尝试发现输入一个无法查询到的值时,页面不回返回任何东西,也就是说只有后台数据库能查询到该数据时才会返回一个“you are in” 。
当出现页面只有是与否两种回显情况时,我们就可以利用布尔盲注。首先还是确定好注入类型和找到闭合方式 。
这条语句的意思是判断当前数据库长度是否为8,length函数能返回字符串的长度,用and连接即可通过页面是否回显来判断长度是否猜对,当and两边的条件同时为真时,页面才会回显。
substr函数的作用是截取字符串,这里表示截取当前数据库的第1个字符开始截取1位 ,ascii函数能返回第一位字符串的ascii码,这条语句的意思就是对当前数据库的第一个字符进行猜测,是否为115,115在ascii码表对应的是s,也就是通过改变截取位置和ascii码来猜出当前数据库的名称 。
因为布尔盲注耗时长,所以一般不用于手工注入,这里仅对其原理做一个解释。
sqli-labs9 时间盲注
这关我们发现不管我们输入什么,都返回同样的页面,所以布尔盲注就不再适用于此关了,但是我们可以尝试使用时间盲注看看有没有效果
首先时间盲注的原理和布尔盲注差不多,只是时间盲注多了一个if判断语句,当查询的结果成立时,用利用sleep函数让页面延迟加载,从而判断你的猜测是否为真。
但是上面返回页面时并没有延迟5秒,可能是注入类型的原因,尝试字符型注入,将id值替换为id=1',再次执行发现页面延迟了5秒返回 ,说明这里存在时间盲注。
接下来就是利用ascii函数猜测数据库的名称,后续操作和手法和第5关布尔盲注类似。只是多了if判断和sleep函数。