浅谈sql注入(2)

  上次谈到了简单的几何不怎么存在了的sql注入漏洞,但是注入过程却是最为宝贵的,之后各种各样的sql注入都是根据这个改造的,现在,我们来谈谈一些注入方法吧。(上次忘说了万能钥匙or 1=1)

  首先就是报错注入,其原理就是利用updatexml、extractvalue等一些函数的报错机制,在报错信息里回显相关数据。可以看到,这种注入适于只显示报错而不现实正确信息的注入漏洞,所以,这同样可以用盲注解决。我们就以updatexml为例子来谈谈。updatexml有三个参数,updatexml(1,2,3),我们以2号参数位置为payload,结合concat函数,将以下语句代替2参数

concat(0x7e,(database()),0x7e)

于是,在报错页面就显示了 ~数据库名~ 0x7e被转化成了~,相应的,我们可以用之前说的相应语句代替database()获取其他信息,但是,updatexml显示错误信息字符限制为32,所以,我们还要结合limit和substr等等。

  再来就是盲注了,盲注分为两种,有布尔盲注和时间盲注。先谈谈布尔盲注。要说布尔盲注,先得了解一些常用函数,ascii(),substr(),left()以及count(),ascii()可以把传入的参数转换成相应的ascii值,substr()有三个参数,可以对相应字段进行截取,left()也可以截取相关参数,count()可以计算传入参数的字符数。当输入相关参数,比如

?id=1

后显示某个页面,输入

?id=1'

后没有任何现实,我们如果知道了闭合方式是单引号了,但不显示错误信息,那我们就使用布尔盲注。输入以下语句

?id=1' and count(database())=猜测数字--

通过对显示页面,我们可以判断数据库名的字符数,假设为6,接下来就是猜每个字符是什么,输入以下语句

?id=1' and substr(database(),1,1)=猜测字符(a)--

或者是

?id=1' and ascii(substr(database(),1,1))>=97--

注意,substr是以一开始计数的,而不是零

为什么是97,因为97对应的是a,判断字符是不是字母。对于其他信息,可以通过替代相关语句获取。接下来就是时间盲注,我们就说sleep()和if,sleep()可以让页面延迟多少秒再现实类容,if用于判断。与布尔盲注不同的是,当输入类容后,无论对错,都显示同一个页面,所以就使用sleep()啦,输入以下语句

?id=1'  and if((substr(database(),1,1)=猜测字符),sleep(5),sleep(0))--

如果数据库名的第一个字符是猜测字符,就延迟5秒,否则不延迟。

  再谈谈宽字节注入,实践上这是一直过滤绕过,由于程序员对输入类容进行了过滤,不允许单引号或双引号输入而采用转义输入的单引号使其失去了闭合的作用。我们可以用编码的手段绕过,输入以下语句

?id=1%df'--

本该是?id=1'处理为?id=1/',当输入了%df后与/一起组成宽字节转换成其他字符,使得单引号成功逃逸。

  然后就是堆叠注入,这是由于没有对执行的语句数目做限制,导致一次运行多个sql语句

?id=1,select database()

是不是很有意思。

  这次就谈到这里,作为一名大学生,我并不是学计算机专业的,完全自学,怎么说呢。开学一周了,磨了一周才写完,其实本来没开学就该写完的

 

你可能感兴趣的:(sql,数据库,安全)